Workflow: HR Performance Review — Evaluation & Payroll
Modules involved: OKR · HR (Promotions · Warnings · Workshops · Awards) · HR Profile (Bonus/Discipline · Contracts · Training) · HR Payroll
Who uses it: HR Manager · Department Managers · Employees
Typical duration: Quarterly cycle (OKR check-ins) + monthly cycle (payroll) + annual cycle (full review)
Overview
CRMConnect does not have a dedicated "annual review" form — the performance review is assembled from multiple independent modules. Each module contributes a distinct piece:
| Module / Table | Contribution |
|---|---|
OKR (tblokrs + tblokrs_checkin) |
Objective progress + qualitative evaluation per check-in |
HR Profile (tblbonus_discipline) |
Formal bonus or disciplinary record |
HR Profile (tblhr_promotions) |
Promotion log (role/designation change) |
HR Profile (tblhr_warnings) |
Formal warnings |
HR (tblhr_workshops) |
Training/workshop participation |
HR Payroll (tblhrp_bonus_kpi) |
KPI bonus manually entered in payroll |
HR Payroll (tblhrp_payslips) |
Monthly payslip (triggered manually) |
Critical note —
tblhr_checkins: Thetblhr_checkinstable in the HR module represents physical attendance (entry/exit time at the workplace), NOT OKR check-ins. The two have no connection.
Payroll does not run automatically. There is no cron or automatic trigger for payroll. Each payslip is created and closed manually by HR.
Flow diagram
[CYCLE PREPARATION — HR admin, once per period]
│
├── OKR: create Circulation (period) + Units + Questions + Evaluation Criteria
├── HR Payroll: configure payslip template + earning list + deductions + taxes
└── HR Profile: staff contracts with contract_status='valid'
│
↓
[OBJECTIVE SETTING — beginning of period]
│
├── Manager/Employee creates personal OKRs (type=1) linked to Circulation
└── Key Results defined: target, unit, plan
│
↓
[PERIODIC CHECK-INS — throughout the period]
│
├── Employee completes check-in: achieved, progress, confidence_level, evaluation_criteria
├── Optional approval (if Approval Setting configured): manager approves/rejects
└── Immutable log created in tblokrs_checkin_log at each check-in
│
↓
[FORMAL EVALUATION — at end of period]
│
├── [A] Manager records Bonus/Disciplinary in HR Profile
│ → tblbonus_discipline + tblbonus_discipline_detail per employee
│
├── [B] Manager records Warning (if applicable)
│ → tblhr_warnings (from_user_id, user_id, title, type_id)
│
└── [C] Manager reviews Workshop/Training participation
→ tblhr_workshops + tblhr_workshop_employees
│
↓
[PROMOTION (if applicable)]
│
├── HR records promotion: tblhr_promotions (user_id, designation_id, title, date)
└── ⚠ Promotion is a LOG — does not automatically update the designation on staff record
HR must manually update the designation field on the employee record
│
↓
[KPI BONUS → PAYROLL]
│
├── HR manually enters KPI bonus in HR Payroll:
│ tblhrp_bonus_kpi: staffid, month_bonus_kpi, bonus_kpi (value)
└── When generating payslip, the bonus_kpi column (taking_method='system')
automatically pulls the value from this table
│
↓
[PAYSLIP GENERATION — monthly, manual]
│
├── Prerequisite check: staff contract with contract_status='valid' for the relevant month
├── HR Payroll → Payslips → New Payslip:
│ payslip_month, payslip_template_id, payslip_range
├── Status: payslip_opening (editable)
├── System automatically aggregates (if integrations are active):
│ - Timesheets: days worked, paid/unpaid leave
│ - HR Profile: salary from contract, role, personal data
│ - Commission: month's commissions
│ - KPI Bonus: from tblhrp_bonus_kpi
├── HR reviews and adjusts values in spreadsheet
└── HR Payroll → Payslip → Close Payslip → status: payslip_closing
→ writes tblhrp_payslip_details (final details per employee)
→ writes tblhrp_income_taxs (calculated tax)
[COMPLETE CYCLE ✓ — OKR closed · Bonus recorded · Salary processed]
Step by step
1. HR Payroll configuration (admin — once only)
Where: /admin/hr_payroll → Settings
1a. Integrations
| Option | Value | Effect |
|---|---|---|
integrated_hrprofile |
1 |
Pulls salary + employee data from HR Profile (contracts, role, tax code) |
integrated_timesheets |
1 |
Pulls days worked/leave from Timesheets module |
integrated_commissions |
1 |
Includes month's commissions from Commission module |
standard_working_time |
160 (default) |
Standard working hours per month |
integration_actual_workday |
"W,B" (default) |
Attendance codes that count as a working day |
integration_paid_leave |
"AL,HO,EB" (default) |
Paid leave codes |
integration_unpaid_leave |
"U,SI,UB,P" (default) |
Unpaid leave codes |
1b. Taxes and income tax
Where: HR Payroll → Settings → Income Tax Rates
Enter tax brackets in tblhrp_income_tax_rates:
| Field | Description |
|---|---|
tax_bracket_value_from / to |
Taxable income range |
tax_rate |
Tax rate (%) |
equivalent_value |
Bracket equivalent value |
And rebates (exemptions) in tblhrp_income_tax_rebates: code, description, value.
1c. Payslip template
Where: HR Payroll → Settings → Payslip Templates → New Template
A template defines:
- Which employees/departments/roles are included (
department_id,role_employees,staff_employees) - The columns displayed (
payslip_columns— fromtblhrp_payroll_columns) - Per-staff exceptions (
except_staff)
Available system columns (automatically populated when taking_method='system'):
column_key |
Source |
|---|---|
actual_workday |
Timesheets |
paid_leave |
Timesheets (codes AL, HO, EB) |
unpaid_leave |
Timesheets (codes U, SI, UB, P) |
gross_pay |
Calculated from contract |
commission_amount |
tblhrp_commissions (from Commission module) |
bonus_kpi |
tblhrp_bonus_kpi (manually entered by HR) |
income_tax_paye |
Calculated from brackets |
net_pay |
gross_pay - deductions - taxes |
total_cost |
Total employer cost |
1d. Employee contract (required for payroll)
Where: HR Profile → Staff → employee record → Contracts tab
Critical condition: Only contracts with contract_status = 'valid' are included in payroll. Staff without a valid contract in the relevant month do not appear in the payslip.
| Contract field | Description |
|---|---|
contract_code |
Contract number |
name_contract |
FK → tblhr_staff_contract_type |
start_valid / end_valid |
Validity period |
contract_status |
Must be 'valid' |
hourly_or_month |
Remuneration type |
2. OKR — setting objectives
Where: /admin/okr → New OKR
Create personal OKRs (type=1) for each employee being evaluated:
| Field | Recommended value |
|---|---|
type |
1 (Personal) |
person_assigned |
employee staffid |
circulation |
Cycle for the evaluation period |
display |
1 (Public) — visible to manager |
Add Key Results with a numeric target, unit (e.g., %, RON, no. of projects) and action plan.
Full OKR reference: See Workflow 20 — OKR Cycle for details on check-ins and approval.
3. Formal Bonus/Disciplinary (HR Profile)
Where: /admin/hr_profile → Bonus & Discipline → Add
tblbonus_discipline fields:
| Field | Description |
|---|---|
name |
Event name (e.g., "Q1 performance bonus") |
id_criteria |
JSON array with IDs from tblrec_criteria (evaluation criteria) |
type |
Type (1=bonus) |
from_time |
Reference period |
approver |
staffid of approver (single-step approval) |
status |
Record status |
Per-employee details (tblbonus_discipline_detail):
| Field | Description |
|---|---|
staff_id |
The employee concerned |
lever_bonus |
Bonus level |
formality |
Form (e.g., cash, letter) |
formality_value |
Value (amount or text) |
description |
Justification |
Evaluation criteria used (tblrec_criteria — Recruitment module, reused):
Fields score_des1..score_des5 define 5 descriptive score levels per criterion.
4. Formal warnings
Where: /admin/hr → Warnings → Add Warning
| Field | Description |
|---|---|
from_user_id |
Who issues the warning (manager/HR) |
user_id |
The employee receiving it |
title |
Warning subject |
type_id |
Warning type (from lookup) |
img |
Attachment (document) |
5. Promotion
Where: /admin/hr → Employee → employee record → Add Promotion
| Field | Description |
|---|---|
title |
Promotion name (e.g., "Promoted to Senior Developer") |
user_id |
The promoted employee |
designation_id |
New role (from tbldesignations) |
date |
Effective date |
Note:
tblhr_promotionsis a journal — it does not automatically update thedesignation_idfield ontblstaff. HR must manually update the employee record after recording the promotion.
6. Training / Workshop
Where: /admin/hr → Workshops → Add Workshop
| Field | Description |
|---|---|
description |
Training description |
mode |
internal or external |
cost |
Training cost |
date_start / date_end |
Period |
type_id |
Workshop type (from lookup) |
trainer_id / trainer_name |
The trainer |
Add participants in tblhr_workshop_employees: link user_id + workshop_id.
7. KPI bonus in payroll
Where: /admin/hr_payroll → Bonus KPI → Add
| Field | Description |
|---|---|
staffid |
The employee |
month_bonus_kpi |
Month (e.g., 2026-03) |
bonus_kpi |
Bonus value (varchar 100 — amount or percentage) |
When generating the payslip for that month, the bonus_kpi column (with taking_method='system' and function_name='bonus_kpi') automatically pulls the value from this table.
8. Generating and closing a payslip
Where: /admin/hr_payroll → Payslips → New Payslip
Payslip statuses:
| Status | Meaning |
|---|---|
payslip_opening |
Payslip open — editable, calculations update |
payslip_closing |
Payslip closed — final values written to tblhrp_payslip_details |
Steps:
- New Payslip: fill in
payslip_month(month),payslip_template_id,payslip_range(interval within month) - System generates JSON spreadsheet in
payslip_dataaggregating all configured sources - HR reviews values in the editable spreadsheet (Luckysheet format)
- Adjust manually if needed (special deductions, corrections)
- Close Payslip (requires
hrp_payslip → editpermission):- Parses the spreadsheet
- Writes
tblhrp_payslip_details(one row per employee with all final values) - Writes
tblhrp_income_taxs(calculated tax per employee) - Status becomes
payslip_closing
- HR can redo a closed payslip: Reset button → status returns to
payslip_opening
Approval workflows in HR
| Module | Table | Mechanism |
|---|---|---|
| OKR check-in | tblokr_approval_setting + tblokr_approval_details |
Full multi-step with deadline + notifications |
| Bonus/Discipline | tblbonus_discipline.approver |
Single approver, varchar field — no tracking table |
| Resignation/Departure | tblhr_list_staff_quitting_work.approval |
Simple varchar field: 'approved' |
| Payslip | No approval | Closed manually by HR with hrp_payslip → edit permission |
Required permissions
| Module | Permission | Access |
|---|---|---|
| OKR | okr → view / view_own |
View OKRs |
| OKR | OKR Settings | is_admin() exclusively |
| HR | hr_employees → view/create/edit/delete |
Employee records |
| HR | hr_workshops → view/create/edit/delete |
Training |
| HR | hr_awards → view/create |
Awards |
| HR | hr_warnings → view/create |
Warnings |
| HR Profile | hr_profile → view/edit |
Extended employee data, contracts |
| HR Payroll | hr_payroll → view |
View payslips |
| HR Payroll | hrp_payslip → edit |
Close payslip (Close Payslip) |
| HR Payroll | hrp_settings → view |
Payroll configuration |
Gotchas
| Problem | Cause | Solution |
|---|---|---|
| Employee does not appear in payslip | Missing contract or contract_status ≠ 'valid' |
Add/validate contract in HR Profile → Contracts |
| KPI bonus does not appear in payslip | tblhrp_bonus_kpi empty for that month |
Manually enter the bonus in HR Payroll → Bonus KPI |
| Commission does not appear in payslip | integrated_commissions=0 or commission module inactive |
Enable integration from HR Payroll → Settings |
| Days worked are 0 | integrated_timesheets=0 or Timesheets have no data |
Enable integration and verify timesheets are completed |
| Promotion did not change employee's role | tblhr_promotions is only a log |
Manually update the Designation field on the Staff record |
| Incorrectly closed payslip | payslip_closing is final |
Use the Reset Payslip button to return to payslip_opening and correct |
| OKR check-in blocked | approval_status=3 (pending) |
Approver must process previous request |
tblhr_checkins shows attendance, not OKR |
Different modules — common confusion | hr_checkins = physical attendance; OKR check-ins are in tblokrs_checkin |
Module references
- Workflow 20 — OKR Cycle — full details on OKR check-ins and approval
- Workflow 19 — Commission — commissions integrated in payroll
- HR — Staff — employee records
- HR — Payroll — payroll module documentation
- HR — Recruitment — evaluation criteria (
tblrec_criteria) - Timesheets — attendance and days worked
Create the OKR circulation period before the performance cycle starts — staff cannot log check-ins against a period that has not been set up, and mid-period goal creation misses the early-cycle data that makes trend analysis meaningful.
Performance reviews are most credible when based on quantitative OKR progress data. Require weekly check-ins throughout the cycle rather than a single update at review time — a single data point is an opinion; a trend is evidence.