While OpenERP is a great basic framework for an ERP system it’s not really meant as a final solution. While some areas are fairly well advanced some other areas are not. One of these areas is Human Resources. Any implementation in a real business will require a not-inconsiderable amount of work to get it to a usable state. With this in mind for the past several months I have been busy implementing a comprehensive HR Management System that should provide a very firm foundation for further work in this area. While this system is already in use in a company with over 600 employees, it is still in active development and will continue to improve over the coming months. You can get it here.
There are four broad areas these modules cover:
- Managing Employee and Contract State
- Attendance and Scheduling
- Leave Management
- Payroll Management
Managing Employee and Contract State
The main modules implementing this functionality are: hr_contract_reference, hr_contract_state, hr_employee_id, hr_employee_profile, hr_employee_state, hr_labour_recruitment, hr_transfer, hr_wage_increment
Managing employee and contract state is essential for the attendance and payroll processing systems to work properly. These modules provide workflows to manage employees and their contracts from the time they are hired until they are de-activated from the system.
Attendance and Scheduling
There is one module implementing this: hr_schedule.
This module allows you to create a schedule for each employee based on a schedule template attached to the employee’s contract. There is a cron job that simplifies this process by automatically creating schedules in two week blocks every two weeks. It also integrates with the leave management modules to modify an employee’s schedule according to the employee’s leaves. This module also provides Scheduling Exceptions to warn you of abnormal situations such as employees coming late or leaving early, not showing up for work, etc. However, this part of the module needs some more work to make it more usable.
Actually, there is also another module, hr_attendance_batch_entry, but it contains some bits that assume behavior highly specific to my own circumstance, and wouldn’t work for another company. None the less it offers useful functionality that allows time keepers to enter weekly attendance data per department quickly and easily (which is quite handy when you have to enter attendance data for 600+ employees).
The modules implementing this functionality are: hr_holidays_extension, hr_public_holidays, hr_accrual, hr_policy_accrual.
The biggest benefit is provided by hr_accrual and hr_policy_accrual. These two modules implement functionality that makes annual leave management a “fire and forget” proposition. An accrual policy allows you to specify the rules according to which days are accrued and how they are calculated. You can specify parameters such as, calculation frequency (weekly, monthly, annually), number of days accrued in a year, number of premium days accrued based on the number of months of employment, etc. This is then attached to a policy group, which is attached to an employee’s contract. A cron job automatically takes care of calculating and depositing the days into an accrual object integrated with hr.holidays based on the schedule you specify.
The modules implementing this functionality are: hr_payroll_extension, hr_payroll_period, hr_policy_absence, hr_policy_ot, hr_payslip_amendment
These relatively few modules implement quite a bit of functionality. They build on top of the basic functionality provided by OpenERP, such as salary rules, payslips and payslip runs, and build a robust payroll management system on top of it. The payroll management is built around the concept of a payroll period schedule. A payroll period schedule defines basic parameters of the payroll such as: the length of the payroll cycle, the day the payroll week starts (i.e. Monday), the time zone in which the attendance records are to be evaluated, and overtime behavior when crossing the midnight boundary. This is attached to the employee’s contract and determines how and when the employee is paid. The current implementation provides a manual cycle and a monthly cycle, but it would take only a trivial amount of work to provide weekly, or semi-monthly cycles. There are cron tasks that will create payroll periods automatically according to the schedules in the system. When the payroll period ends there is an “End of Payroll Period” wizard that takes you through the steps of creating pay slips and paying your employees.
In addition to payroll periods the payroll processing parts have been heavily modified to provide detailed statistics based on an employee’s schedule vs. attendance records. At the same time I have taken some care to decouple functionality that likely varies between implementations from the actual processing itself. For example, the calculation of overtime is largely contained in the the hr_policy_overtime module, and the calculation of leaves (with respect to payroll) is handled in hr_policy_absence. You can create as many combinations of these policies as necessary in an hr_policy_group object which is then attached to an employee’s contract. The hr_payroll_extension module takes care of combining all these different objects to create a timely and accurate payroll.
There are other modules that provide various functionality that might be of interest to an HR manager. These include:
- hr_webcam – take a picture of the employee from within OpenERP through a webcam
- hr_infraction – mechanism for handling complaints and taking disciplinary action
- hr_job_hierarchy – create manager/subordinate relationships based on the job position
There are a couple of patches you will need to get full use out of these modules. They should actually be bug-reports, but I haven’t had the time yet get it done so they are included in the project. The first patch is to hr_payroll. It fixes a bug and also allows you to use python expressions in the ‘Quantity’ field of salary rules. The second is a patch that makes the ‘needaction’ counts of objects bubble-up through their parent menus.
So, their you have it. With a local check-out of the modules and this description you should be able to get started with this system. In the future I would like to include some demo data to make it easier to understand these module, but for the moment there is none. While I have tried to polish these modules to make them as generic as possible there will undoubtedly be bugs that I failed to anticipate and places where you will encounter behavior specific to my circumstances. Please file bug-reports for these and I’ll try to fix them up in my copious free time. Better yet, include a patch in the bug report. Even better yet fix it in your local branch and send me a merge proposal.
Please give the modules a spin and let me know what you think.