Workflow: OKR Cycle — Planning & Evaluation
Modules involved: OKR (Circulation · OKRs · Key Results · Check-ins · Approval) · Goals · DataPulse
Who uses it: Management · Department Managers · All Employees
Typical duration: One cycle = 1 quarter or 1 year (configured in Circulation)
Overview
The OKR module implements the Objectives & Key Results methodology. A complete cycle covers: defining the period (Circulation), creating objectives with quantifiable key results (OKRs + Key Results), periodic progress check-ins with optional hierarchical approval, and closing the cycle when progress reaches 100%.
Important distinctions:
- OKR = subjective progress on user-defined objectives (periodic check-in)
- Goals = separate module; automatically tracks real CRM metrics (invoices, leads, contracts) against a numerical target — no manual check-in
- DataPulse = read-only analytics dashboard; has no own tables, does not integrate with OKR
tblhr_checkinsfrom the HR module = physical attendance (start/stop time at workplace) — has no connection to OKR check-ins
Mandatory condition: Without at least one record in
tblokr_setting_circulationwith validfrom_date/to_date, the OKR module does not work correctly. This is the first setting to configure.
Flow diagram
[CYCLE SETUP — admin, once per period]
│
├── Circulation: define period (e.g., Q1 2026: 01.01–31.03)
├── Units: units of measure (%, RON, number of items)
├── Questions: questions displayed at each check-in
├── Evaluation Criteria: evaluation scores per criterion
└── Approval Setting (optional): who approves check-ins
│
↓
[CREATE OKR]
│
├── Type: Personal (1) · Department (2) · Company (3)
├── Display: Public (1) · Private (2)
├── Objective + Key Results (target, unit, plan)
└── approval_status = 0 (draft)
│
↓
[PERIODIC CHECK-IN]
│
├── User opens okr/checkin_detailt/{id}
├── Fills in per Key Result: achieved, progress (0–100%), confidence_level
├── Fills in: evaluation_criteria (score), comment, answers to Questions
├── Sets: recently_checkin (today) + upcoming_checkin (future date)
└── Submit → approval_status = 3 (Waiting for Approval)
│
↓
[CHECK-IN APPROVAL]
│
├── If NO Approval Setting exists for the relevant department/OKR:
│ → approval_status = 1 (Auto-approved) ← immediately
│
└── If Approval Setting EXISTS:
├── System resolves approvers (direct_manager / department_manager / fixed staff)
├── Notification sent to first approver
├── Approver approves (approve=1) or rejects (approve=-1)
│ → If all approve: approval_status = 1
│ → If anyone rejects: approval_status = 2
└── Creator notified with approved_checkin / rejected_checkin
│
↓
[PROGRESS UPDATED]
│
├── okrs.progress = average of all Key Result progress values
├── If progress = 100% → okrs.status = 1 (Finished)
└── Immutable log in tblokrs_checkin_log (complete snapshot)
│
↓
[CYCLE CLOSURE]
│
├── OKRs with status=1 (Finished) are fully achieved
├── Cycle report: progress · confidence levels · check-in history
└── Admin can view reports (requires reports → view permission)
[CYCLE CLOSED ✓]
Step by step
1. Cycle configuration (admin)
Where: /admin/okr → Settings
1a. Circulation — mandatory
Tab: Settings → Circulation → Add Circulation
| Field | Type | Description |
|---|---|---|
name_circulation |
varchar | E.g., "Q1 2026", "Annual 2026" |
from_date |
DATE | First day of the period |
to_date |
DATE | Last day of the period |
The system automatically detects the current cycle via MONTH(NOW()) = month(from_date) AND YEAR(from_date) = YEAR(NOW()). If no cycle exists with from_date in the current month, new OKRs cannot be linked to an active cycle.
1b. Units
Tab: Settings → Units → Add Unit
Examples: %, RON, USD, Items, No. of clients. Units are selectable on each Key Result.
1c. Questions (optional)
Tab: Settings → Questions → Add Question
Questions configured here appear mandatorily on the check-in form for all users. E.g., "What went well?", "What blockers exist?", "What help do you need?".
1d. Evaluation Criteria (optional)
Tab: Settings → Evaluation Criteria → Add Criteria
Numerical scores on defined criteria (e.g., group_criteria=1, name="Output quality", scores=85). At check-in, the user selects a criterion and the system records the score.
1e. Approval Setting (optional)
Tab: Settings → Approval Process → Add Approval
If you do not configure any approval rules, all check-ins are automatically approved (approval_status = 1 immediately after submit).
| Field | Description |
|---|---|
name |
Rule name |
department |
IDs of targeted departments (FIND_IN_SET lookup) |
okrs |
IDs of specific targeted OKRs (alternative to department) |
setting |
JSON with approver chain (nodes) |
choose_when_approving |
0 = system resolves approver automatically; 1 = user chooses approver at check-in time |
number_day_approval |
Deadline in days for each approver |
notification_recipient |
Additionally notified staff (CC) |
Approver types in JSON setting:
| Approver type | How it is resolved |
|---|---|
direct_manager |
tblstaff.team_manage of the user doing the check-in |
department_manager |
tbldepartments.manager_id of the OKR's department |
staff |
Fixed staffid specified explicitly |
Note: For
direct_manageranddepartment_manager, theteam_managefield on staff andmanager_idon department must be populated. If missing, resolution fails and the check-in may remain blocked.
2. Creating an OKR
Where: /admin/okr → New OKR
| Field | Values | Notes |
|---|---|---|
type |
1=Personal · 2=Department · 3=Company |
Personal: person_assigned = current user |
display |
1=Public · 2=Private |
Private: visible only to owner + creator |
circulation |
FK → tblokr_setting_circulation | Active cycle |
okr_superior |
FK → another OKR | Parent OKR (for OKR hierarchy) |
okr_cross |
list of IDs | Cross-referenced OKRs |
category |
FK → tblokr_setting_category | Objective category |
Required permission:
okr → viewORokr → view_ownORis_admin(). Users withview_owncan only create personal OKRs (type=1) assigned to themselves.
Key Results
Added after OKR creation. Each Key Result has:
| Field | Description |
|---|---|
main_results |
Key result description |
target |
Target value (number) |
unit |
FK → tblokr_setting_unit |
plan |
Action plan |
tasks |
IDs of CRM Tasks linked to this Key Result |
3. Periodic check-in
Where: /admin/okr → click OKR → Check-in button
Access condition: approval_status must be 0 (draft) or 1 (approved). If it is 2 (rejected) or 3 (pending), the check-in button is hidden.
At each check-in, the system completely replaces the rows in tblokrs_checkin for that OKR (does not add — overwrites the current state). History is kept in tblokrs_checkin_log (immutable).
Fields filled in per Key Result:
| Field | Required | Description |
|---|---|---|
achieved |
Yes | Current realized value |
progress |
Yes | Percentage 0–100 |
confidence_level |
Yes | 1=Is fine · 2=Not so good · 3=Very good |
evaluation_criteria |
If configured | Score from defined grid |
comment |
No | Free comment |
answer |
If Questions exist | Answers to questions from Settings |
OKR-level fields:
| Field | Description |
|---|---|
recently_checkin |
Today's date (current check-in) |
upcoming_checkin |
Planned date of next check-in |
Aggregate progress calculation:
total_progress = (sum of all KR progress values) / (number of KRs × 100) × 100
If total_progress = 100 → okrs.status = 1 (Finished) and complete_okrs = 1.
4. Approval workflow
Without configured approval rules: check-in is automatically approved (approval_status = 1) immediately after submit.
With approval rules:
Submit check-in
→ approval_status = 3 (Waiting)
→ system searches for Approval Setting via FIND_IN_SET(department) or FIND_IN_SET(okrs_id)
→ first approver notified
Approver opens request → approves or rejects
→ all approvers approve → approval_status = 1
→ any rejection → approval_status = 2
→ creator notified
If choose_when_approving = 1, the user doing the check-in manually selects the approver from a dropdown at the time of submit.
5. Goals — separate module
Where: /admin/goals
Goals automatically tracks real CRM metrics against a numerical target. No manual check-in, no approval.
goal_type |
What it automatically measures |
|---|---|
1 |
Payments received (from tblinvoicepaymentrecords) |
2 |
Leads converted to clients |
3 |
New clients from leads |
4 |
All new clients |
5 |
Contracts added (per type) |
6 |
Proposals converted |
7 |
Contracts by start date |
8 |
Total invoices |
At the end of the period (end_date), if the target was not reached and notify_when_fail=1, the system sends a notification. Similarly for target achievement with notify_when_achieve=1.
6. DataPulse
Where: /admin/datapulse
Read-only analytics dashboard with 16 chart types (payments per agent, clients by county, leads by source, logged time per employee, etc.). Has no own tables — reads directly from core CRM tables. Requires no configuration and has no granular permissions (any authenticated staff can access).
OKR Statuses
| Field | Value | Label |
|---|---|---|
okrs.status |
0 |
Unfinished |
okrs.status |
1 |
Finished (set automatically when progress=100%) |
okrs.approval_status |
0 |
Draft |
okrs.approval_status |
1 |
Approved |
okrs.approval_status |
2 |
Rejected |
okrs.approval_status |
3 |
Waiting for Approval |
Required permissions
| Permission | Access |
|---|---|
okr → view |
View all OKRs in the system |
okr → view_own |
View only own OKRs (person_assigned = self or creator = self) |
okr → edit |
Edit OKRs (view_own can only edit their own) |
okr → delete |
Delete |
| OKR Settings | is_admin() exclusively |
reports → view |
Access to the Report section in OKR |
Gotchas
| Problem | Cause | Solution |
|---|---|---|
| OKRs do not appear in dashboard | Missing Circulation with from_date in current month |
Create a cycle with from_date = first day of current month |
| Check-in button does not appear | approval_status is 2 or 3 |
Approver must process previous request before a new check-in |
| Approver does not receive notification | team_manage or manager_id not set on staff/department |
Fill in fields in HR → Staff and Settings → Departments respectively |
| Check-in deleted previous progress | Correct behavior — check-in overwrites current state | Complete history is found in tblokrs_checkin_log |
choose_when_approving=1 but dropdown does not appear |
Approver not set in approval_setting | Verify that choose_when_approving=1 in the respective setting |
Module references
- OKR — module documentation
- Goals — automatic CRM targets
- DataPulse — analytics dashboard
- HR — Staff —
team_managefield for direct_manager - HR — Payroll — bonus_kpi fed from OKR progress