Employees¶
1. Purpose¶
Employees is the master record of everyone who works for the company — their personal and job details, which department they sit in, who they report to, and the contract that defines what they are paid. Every HR and payroll process in NestERP starts from a record here.
Nothing in payroll can compute without both an employee record and a running contract. Most "payroll produced no payslips" problems trace back to this module.
2. Features¶
- Employee directory with personal, job, and work-contact details
- Departments, with a hierarchy and a manager per department
- Job positions, and the manager each employee reports to
- Work locations and working schedules (working hours per employee)
- Employment contracts carrying wage, salary structure and validity dates
- Contract states — Draft, Running, Expired, Cancelled — with expiry alerts
- Employee documents, with expiry tracking (via Cybrosys OpenHRMS)
- HR settings per employee: bank account for salary payment, identification numbers
- Employee self-service through the portal, showing their own record
- Badges and rewards (
hr_gamification) - Multi-company employee assignment
3. Where to find it¶
- Menu: Employees → Employees / Departments / Configuration
- Technical names:
hr,hr_contract,hr_gamification - Tier: Odoo core (Community Edition)
- Available in: Odoo 16, 17 and 18.
hr_contractis required by our stack on 17 and 18.
4. Modules used¶
| Module | Tier | Why it is needed |
|---|---|---|
hr |
Odoo core | Employee records, departments, job positions |
hr_contract |
Odoo core | Contracts, wage and salary-structure assignment — payroll cannot run without it |
hr_gamification |
Odoo core | Badges, required by OpenHRMS |
hr_payroll_community |
Third-party (Cybrosys) | Salary structures and rules. Odoo's official payroll is Enterprise-only. |
hr_payroll_account_community |
Third-party (Cybrosys) | Posts payslips to accounting |
ohrms_core and the OpenHRMS suite |
Third-party (Cybrosys) | Loans, salary advances, resignation, transfers, document expiry, HR dashboard |
NestERP custom modules that build on Employees¶
| Module | Odoo version | What it adds |
|---|---|---|
payroll_custom_module |
17 · 18 | Tanzanian statutory rules, payslip batches, payroll payment registration, bank export |
payroll_department_filter |
17 · 18 | Department filter on the Generate Payslips wizard |
employee_info_export |
17 · 18 | Employee data export to Excel, including bank details and structure |
5. Configuration¶
- Create the company structure first — Settings → Users & Companies → Companies. Employee records attach to a company and moving them later is messy.
- Create departments — Employees → Departments. Set the parent department and the manager. Department structure drives payroll filtering and most HR reporting, so agree it with the client before loading employees.
- Create job positions — Configuration → Job Positions.
- Define working schedules — Configuration → Working Schedules. The default is a full-time week; part-time or shift patterns need their own schedule.
- Create work locations — Configuration → Work Locations.
- Create the employees. Required for payroll: department, job position, manager, working schedule, and on the HR Settings tab the bank account for salary payment.
- Create a contract per employee — Employees → Contracts. Set the wage, the salary structure, the start date, and set the state to Running.
- Enable employee self-service if the client wants staff to see their own records — requires a portal user linked to the employee.
Configuration traps
- An employee without a Running contract produces no payslip, and the payslip generation wizard will not tell you why. It simply returns an empty batch.
- A contract without a salary structure computes nothing.
- A missing bank account on the employee breaks the payroll bank export at the last step of the month, when it is most expensive to discover.
- Department is used as the payroll filter. Employees left without a department disappear from department-filtered payslip generation.
- Deleting an employee with payroll history is blocked, and should be. Archive instead.
6. How it's used¶
Onboarding a new employee¶
- HR Officer — Employees → Employees → New. Fills personal details, department, job position, manager and working schedule.
- HR Officer — completes the HR Settings tab: bank account, identification numbers.
- HR Officer — creates the contract with wage and salary structure, and sets it to Running.
- HR Manager — reviews and confirms the contract.
- System Administrator — creates a user account if the employee needs system access.
Employee leaving¶
- HR Officer — sets the contract end date; the contract moves to Expired.
- HR Officer — archives the employee record. Do not delete it — payroll history depends on it.
Ongoing maintenance¶
- HR Officer — updates contracts on salary review; a wage change during employment is a new contract or an amended one, depending on the client's practice.
- HR Manager — monitors expiring contracts and documents.
Screenshots needed
Save to docs/assets/employees/: employee list view · employee form showing the HR
Settings tab · a Running contract · department hierarchy · working schedule
configuration.
7. Access rights¶
| Group | Can do |
|---|---|
| Employees / Officer | Create and edit employee records and contracts |
| Employees / Administrator | All of the above, plus departments, job positions, working schedules, and configuration |
| Employee (own record) | Read their own employee record through the portal |
Sensitive fields — wage, bank account, identification numbers — are restricted to HR groups,
not visible to ordinary users. Multi-company deployments restrict employees by company;
hr_multi_company (Cybrosys) extends this where the client's structure needs more.
8. Version differences (16 / 17 / 18)¶
- Views use
attrs/states. hr_contractis not required by our Odoo 16 modules — the 16 line carries no payroll.
attrsandstatesremoved from views.- The version of the Thalia reference instance, and the primary payroll platform today.
<tree>elements superseded by<list>.editable="0"is required where an empty attribute previously sufficed. This came up during the payroll v18 upgrade.- Mail-template rendering is stricter — a template referencing a field that does not resolve now raises rather than rendering empty. Relevant to HR notification templates.
hr_contractstill exists as a separate module and is depended on by our payroll stack on 18.
9. Known limitations¶
- No official payroll on Community. Odoo's
hr_payrollis Enterprise. Everything payroll in NestERP is built on Cybrosyshr_payroll_community, a Tier 2 dependency. This is the single largest third-party exposure in the product. - No appraisals.
hr_appraisalis Enterprise. - No employee referral programme. Enterprise.
- No planning or shift-scheduling app. Enterprise.
- Fleet, employee skills and document expiry are either absent or thin on Community;
document expiry comes from Cybrosys
oh_employee_documents_expiry. - No approval workflow on contract changes in core — a user with HR Administrator rights can change a wage with no second signature.
Needs verification on the Thalia live instance
- The department structure actually in use
- How many employees, and how many hold Running contracts
- Which salary structures exist and which is the default
- Whether every employee has a bank account set for the payroll export
- Which OpenHRMS modules are installed live versus merely present on disk
- Whether employee self-service / portal access is in use
- Whether
hr_multi_companyis active, and the company structure