CRMconnect Azuvio · Docs

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: The tblhr_checkins table 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 — from tblhrp_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_promotions is a journal — it does not automatically update the designation_id field on tblstaff. 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:

  1. New Payslip: fill in payslip_month (month), payslip_template_id, payslip_range (interval within month)
  2. System generates JSON spreadsheet in payslip_data aggregating all configured sources
  3. HR reviews values in the editable spreadsheet (Luckysheet format)
  4. Adjust manually if needed (special deductions, corrections)
  5. Close Payslip (requires hrp_payslip → edit permission):
    • 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
  6. 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

Tip

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.

Note

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.