HRMS · One-stop leave guide
Apply /people/leaves Policy /admin/leave/global-policy-center Balances /admin/employee-leave-config

Leave Management — One-Stop Guide

Everything needed to configure, assign, schedule, apply, and approve leave — plus a technical data-flow tab for debugging. Built from the live Tracopus leave engine (Global Policy Center, balance ledger, accrual jobs, ApprovalAuthority).

Audience: HR admins, managers, and support engineers. Related deep-dives: Leave Configuration · Policies Guide · Runtime Leave Management · Interactive policy simulator

Configure through approve

One spine from flags to a decision, plus a debug tab

The one-stop leave guide walks configure, assign, schedule, apply, and approve — with a technical data-flow tab for debugging — built from the live leave engine, not a parallel product story.

Docs · One-stop leave (linked from leave how-tos) Route /people/leaves HR Admin · Manager · support engineer

The job of this console

Follow the user-guide tab to stand up leave the first time, then use the data-flow tab when a balance or flag does not match what you published.

Seat at the table

HR and support. Employees should use Leave management how-to for apply/approve only.

The working rhythm

Walk sections in order on the guide tab. Switch to data-flow when an accrual job, flag, or approval path misbehaves. Deep-dive pages still own legal calendars, documents, and test lab.

Moments that bring you here

Greenfield leave. A production incident on balances. Training. After enabling Global Policy Center over classic types.

ⓘ
Live engine, two tabs
The debug tab does not write data. Accrual jobs, ApprovalAuthority, and Policy Center remain the writers.

Tip: use the chips above to jump. Printing this page includes both tabs.

1. How to open leave for the first time

ℹ️
Two doors
Employees / managers use People → Leave management (/people/leaves). HR admins configure first under Admin → Leave admin and Admin → Employee leave config. If the menu is missing, flags or role modules are off (see §3).

Employee / manager path

  1. Sign in

    Use an account on a team where leave is enabled.

  2. Open People → Leave management

    Direct URL: /people/leaves (legacy /hrms/leaves redirects here).

  3. Confirm balances appear

    Balance cards show PL/CL/SL (and specials). Empty cards usually mean opening balances were never imported and accrual has not run yet — not a UI bug.

  4. Apply

    Use Apply leave / create drawer: pick type, dates, half-day if needed, notes/docs, then submit.

Admin first-time path (before anyone applies)

  1. Application Config — turn on org + role leave flags (§3).
  2. Global Policy Center — publish a policy (§4–5).
  3. Holidays + working-day rules (§8).
  4. Employee leave config — dry-run OB import, then live (§9–10).
  5. Enable schedulers ACCRUAL / CF / COMP_OFF_EXPIRE (§11).
  6. Prove apply → approve on a test employee (§12–13).

2. Big picture — configure then use

flowchart LR
  A[App Config flags] --> B[Publish policy]
  B --> C[Holidays + working days]
  C --> D[Opening balances / accrual]
  D --> E[Employee applies]
  E --> F[Manager / delegate approves]
  F --> G[Balance debit + timesheet + attendance]
            
💡
Publishing ≠ balances
Publishing a policy activates eligibility and accrual rules. Tracopus does not invent opening balances. HR must import (or Adjust) balances, or wait for the monthly accrual job after go-live.

3. What must be configured (flags)

Path: Admin → Application configuration → select the org unit / team → HRMS / Modules / role templates.

Org flags (leaveAdditional)

FlagPurposeTypical go-live
leaveManagementEnabledMaster switch — APIs and jobs fail closed when offRequired
globalLeavePoliciesEnabledGlobal Policy Center runtimeRequired (preferred)
leaveEnhancementsEnabledExtended leave UX (impact drawer, etc.)Optional
leaveAutoSyncToAttendanceApproved leave → attendance LEAVE / HALF_DAYUsually on
leaveBlockNonWorkingDayLeaveReject ranges with no working daysUsually on
leaveBlockOverlapRegardlessOfTypeReject overlapping leave datesUsually on
leaveAllowNegativeBalanceAllow submit below available balanceUsually off
approvalDelegation.approvalDelegationEnabledDelegates can approve leaveAs needed

Role modules

  • peopleModules.leavesEnabled — shows People → Leave management
  • peopleModules.holidaysEnabled — People → Holidays
  • adminModules.leavePoliciesEnabled — classic policies + Employee leave config
  • adminModules.globalLeavePoliciesEnabled — Global Policy Center, Test Lab, legal calendars, working-day rules
  • Manager: approveTeamEnabled — required for approve actions
  • Optional: universalApprovalInboxEnabled — leave in /workspace/approvals

Menu rule: UI needs org leaveManagementEnabled and role peopleModules.leavesEnabled. APIs gate on the org flag only.

4. What to update — admin screen map

What you updateWhereRoute
Type entitlements, accrual, CF, specialsGlobal Policy Center → policy version/admin/leave/global-policy-center
Leave type catalog (classic fallback)Leave policies/admin/leave-policies
Per-employee balances / OB importEmployee leave config/admin/employee-leave-config
Official holidaysLegal calendars + People holidays/admin/leave/legal-calendars, /people/holidays
Weekly offsWorking day rules/admin/leave/working-day-rules
Pre-publish dry-run scenariosPolicy Test Lab / Simulator/admin/leave/policy-test-lab
Approval coverage when manager awayDelegation/admin/delegation
Org / role flagsApplication Config/admin/application-config

5. How to create / publish a new leave policy

Primary console: Admin → Leave admin → Global Policy Center.

  1. Create or select a jurisdiction

    Examples: IN, IN-KA, IN-MH, AE. Used for resolve, holiday calendars, and working-day scope.

  2. Apply a country / CFA template into a draft

    Choose CFA-IN-KA, CFA-IN-MH, CFA-IN-HR, CFA-IN-TN-CBE, or a blank draft. Edit entitlements, accrual, carry-forward, and special-leave JSON while unpublished.

  3. Simulate / Policy Test Lab

    Dry-run resolve for a sample employee. Lab scenarios may gate publish. Open /admin/leave/policy-test-lab.

  4. Assign holiday calendar key

    Key must match People → Holidays location keys (e.g. IN-KA).

  5. Configure working-day rules

    Team default, jurisdiction pattern (e.g. Mon–Fri or Sun–Thu), or employee override.

  6. Publish the version

    Published versions are immutable. To change rules later, clone a new draft and publish again. Publish activates accrual eligibility — it does not create balances.

flowchart TD
  J[Jurisdiction] --> T[Apply template]
  T --> D[Edit draft version]
  D --> S[Simulate / Test Lab]
  S --> H[Holiday key + WDR]
  H --> P[Publish]
  P --> R[Accrual + eligibility live]
            

APIs (for automation / support): jurisdictions POST /api/v2/leave/global/jurisdictions · apply template POST /api/v2/leave/global/templates/{id}/apply · simulate POST /api/v2/leave/global/simulate · publish POST /api/v2/leave/global/versions/{versionId}/publish.

6. Supported leave policies — how each is configured

PL means Privilege Leave (earned) — not paternity. Paternity is PATERNITY.

CodeNameHow to configureKey runtime rulesStatus
PLPrivilege Leave GLP version entitlements + monthly accrual; CF max in rules Fiscal Apr–Mar; CF max 45; excess LAPSE (or ENCASH if re-published) Shipped
CLCasual Leave Location pack entitlements (MH/HR/TN); no CF Lapses at fiscal year end; not in KA pack Shipped
SLSick Leave Location pack (KA/HR/TN); document rules for medical proof Medical certificate when ≥3 days; no CF Shipped
MATERNITYMaternity specialLeave[] in published GLP; FE child # maps days Female; min 80 service days; 182/182/84/84; proof; auto end from start Shipped
PATERNITYPaternity Special leave rules in GLP Male; 5 consecutive days; window 7 days before or 45 after event Shipped
MSLMilestone Leave Tenure grant rules in GLP Grant at 5/10/15/20y; 5-day block; partial use forfeits remainder Shipped
WWLWellness Leave KA female special in CFA-IN-KA 1 day/month; ±3 day apply window; lapses last working day of month Shipped
COMPOFFCompensatory Off Comp-off policy + attendance credit coupling Weekend/statutory ≥6h or weekday >15h; expire 90 days Shipped
FLOATINGFloating Holiday Floating catalogue + calendar-year budget Employee picks published option; Jan renew credits entitlement Shipped
UNPAID / ULUnpaid / LOP Catalog type; LOP coupling where enabled No entitlement balance required in typical setups Shipped
ADOPTION / MISCARRIAGESpecial stubs Catalog only until HR confirms days Entitlement days TBD Stub

Always needs approval

Leave requests always go through approval — even when attendance auto-approves for some bands.

Two leave years

Earned leave uses fiscal Apr–Mar. Floating holiday budget uses calendar Jan–Dec.

Server trusts day count

Create/submit recalculate numberOfDays from working week + holidays. Half-day = 0.5.

Classic fallback

If Global Leave is off, use /admin/leave-policies type catalog; accrual falls back to classic policy.

7. CFA India location packs (defaults)

Production prefill: migration 09-cfa-leave-india-production-prefill.sql. Resolve uses employee work location / jurisdiction.

PackLocationPLCLSLNotes
CFA-IN-KAKarnataka (Bengaluru)18—12WWL (female KA); +1 mandatory PH vs other states
CFA-IN-MHMaharashtra (Mumbai)187—Specials + COMPOFF + FLOATING
CFA-IN-HRHaryana (Gurugram)1888Specials + COMPOFF + FLOATING
CFA-IN-TN-CBETamil Nadu (Coimbatore)121212Lower PL vs other India packs

Shared: MATERNITY / PATERNITY / MSL / COMPOFF / FLOATING; PL CF max 45 with excess LAPSE by default.

8. Holidays & working days

Holidays

  1. Create holidays in People → Holidays with a Location key (e.g. ["IN-KA"]).
  2. Assign that key to the jurisdiction in Global Policy Center → Holiday calendars.
  3. Optional: publish Legal Calendars so official holidays sync into People holidays.

Working-day resolution (priority)

flowchart TD
  L[Leave create / submit] --> R[LeaveWorkingDayResolver]
  R --> O{Employee WDR override?}
  O -->|Yes| P[Resolved workdays]
  O -->|No| J{Employee jurisdiction?}
  J -->|Yes| JW[Jurisdiction WDR]
  JW --> P
  J -->|No| TW[Team-default WDR]
  TW -->|Hit| P
  TW -->|Miss| FB[Work schedule / shift / Mon-Fri]
  FB --> P
            
ℹ️
“Country” means leave jurisdiction
Assign the employee to a leave jurisdiction — do not rely on free-text location alone for day counting.

9. Opening balances, Adjust, and dry-run

Canonical page: Admin → Employee leave config (/admin/employee-leave-config).

  1. Select the team in the header filter so employees load.
  2. Download OB template (Opening balance template panel / header button). Rows are employee × leave type (PL/CL/SL by location). entitlementAmount and amount start blank — fill from ZingHR / HR export only.
  3. Dry-run import (never skips this)

    POST /api/v2/admin/data-import/leave-balance?userTeamId={team}&actorId={you}&dryRun=true

    Body may also include "dryRun": true (query wins). Dry-run validates only — no writes. Fix failures from reportCsv / results[].

  4. Live import — same endpoint with dryRun=false only after dry-run is clean.
  5. Single employee correction — select person → Adjust balance (opening entitlement and/or +/− available days) with a reason. Adjustments of 5+ days require a second confirmer employee id.
  6. Spot-check balance cards, then prove apply on People → Leaves.

CSV columns (template)

userTeamId, employeeId, empCode, location, suggestedPack, leaveTypeCode, leaveTypeId, entitlementAmount, amount, comment

Aliases accepted: PAT→PATERNITY, MAT→MATERNITY, COFF→COMPOFF.

flowchart TD
  AP[Published policy] --> AJ[LEAVE_ACCRUAL job]
  AJ --> BL1[Ledger credit ACCRUAL]
  HR[OB import / Adjust] --> BL2[Ledger ADJUST_HR]
  BL1 --> UI[Visible on Leave Management]
  BL2 --> UI
            

10. Make sure leaves are assigned to every employee

“Assigned” means each active employee has: (1) a resolved published policy / jurisdiction, (2) leave type balances on the ledger, (3) correct holiday + working-day resolution.

  1. Confirm published policy for the team / jurisdictions covering all work locations.
  2. Assign jurisdictions (and WDR overrides if needed) for employees whose location differs from team default.
  3. Bulk OB import for cutover so every employee × PL/CL/SL row exists — do not invent amounts.
  4. For new joiners after cutover — either Adjust on hire, include them in a follow-up import, or rely on monthly LEAVE_ACCRUAL once entitlement rules apply.
  5. Verify coverage — on Employee leave config, sample employees across locations; KPI strip shows low-balance / pending signals.
  6. Smoke apply as 2–3 employees from different packs (e.g. KA vs MH) before broad rollout.
⚠️
Empty ledger after publish is expected
Until HR imports opening balances or accrual runs, employees correctly see zero available days and cannot submit (unless leaveAllowNegativeBalance is on).

11. How schedulers pick and execute policies

Jobs live in fs_schedule_model. Enable via production migration 11-cfa-leave-schedules-enable.sql. Manual run (ops): POST /api/v2/admin/jobs/{scheduleType}/run?userTeamId=.

ScheduleWhenWhat it doesHow policy is picked
LEAVE_ACCRUAL 1st of month 06:00
0 0 6 1 * ?
Credits entitlements; idempotent ledger rows with periodKey=yyyy-MM (MSL uses tenure keys) Per employee: resolved published GLP → team published → classic ts_leave_policy_model
LEAVE_CARRY_FORWARD Daily 05:30
0 30 5 * * ?
CF caps, fiscal/calendar/LWD lapse from rules_json; optional ENCASH staging; also alerts missed accrual (days 1–3) Published GLP carryForward / lapseOn / excessAction
COMP_OFF_EXPIRE Daily 07:00
0 0 7 * * ?
Expire unused compensatory off (90-day rule) → encash staging Comp-off policies / ledger; also piggybacked from ACCRUAL when dedicated row missing
LEAVE_PROMOTION_RETRY Every 15 min (often off until needed) Retry failed TaskActivity promotion after approve Approved leaves with failed promotionStatus
APPROVAL_SLA_REMINDER Daily 09:00 Remind pending leave (and other domains) SUBMITTED leave in scope

If leaveManagementEnabled is false, jobs exit as SKIPPED. Check last run status on the schedule row and the accrual-source banner in Global Policy Center.

12. How employees apply for leave

  1. Open People → Leave management.
  2. Review balance cards for the leave type you need.
  3. Click Apply leave. Choose type (PL/CL/SL/special/floating), start/end, half-day if allowed, reason, and required documents.
  4. Confirm day count (server recalculates — holidays and weekly offs are excluded).
  5. Submit. System validates overlap, working days, special rules, documents, and balance; then places a pending hold on the balance and notifies the approver.
  6. Track status on the same page (CREATED → SUBMITTED → APPROVED / REJECTED). Withdraw is allowed for draft/submitted only.

Floating: you must pick a published catalogue option. Maternity: child number maps duration. Comp-off: uses credited bank entries with expiry.

13. Leave request approval process

flowchart TD
  C[CREATE draft] --> S[SUBMIT]
  S --> H[Reserve PENDING_HOLD]
  H --> N[Notify approver]
  N --> D{Approve or Reject?}
  D -->|Approve| A[Debit DEBIT_APPROVE]
  A --> P[Promote TaskActivity LEAVE]
  P --> T[Optional attendance sync]
  D -->|Reject| R[Release hold + comment]
            

Who can approve

  • Reporting manager with approveTeamEnabled — via ApprovalAuthorityService.canAct(..., LEAVE).
  • Delegate when approval delegation is enabled and scope includes LEAVE.
  • HR / admin where role policy allows acting in scope (see Approvals inbox / leave pending panel).

Where to approve

  1. People → Leave management — Pending approvals panel for requests in your scope.
  2. Workspace → Approvals (/workspace/approvals) when universal inbox is enabled.
  3. Approve or reject. Reject requires a comment; pending balance is released.
  4. On approve: ledger debit, promote leave days to timesheet TaskActivities, optional attendance LEAVE / HALF_DAY marks.

After approval — cancel / promotion failures

  • Cancel (after approve) credits balance back and reverses promotion where supported.
  • If timesheet rows are missing, check promotionStatus, GET /api/v2/leaves/.../promotion-failures, and schedule LEAVE_PROMOTION_RETRY. Manual: POST /api/v2/leaves/{id}/promote.

14. Go-live checklist

Check items locally in the browser (saved only on this device).

15. FAQ & common mistakes

SymptomLikely causeFix
Leave menu missingRole peopleModules.leavesEnabled offEnable role module; refresh session
403 on leave APIsleaveManagementEnabled falseApp Config org flag
Zero balances after publishPublish does not invent OBImport / Adjust / wait for ACCRUAL
Day count includes holidayCalendar key mismatch / WDR missingAlign holiday keys + working-day rules
Cannot approveNot manager/delegate or approveTeamEnabled offCheck ApprovalAuthority + delegation scope LEAVE
Approved but missing on timesheetPromotion failedpromotion-failures + LEAVE_PROMOTION_RETRY
Attendance not updatedleaveAutoSyncToAttendance falseEnable org flag
Wrong type for paternityUsing PLUse PATERNITY
Import dry-run failsBad emp / leave type codesFix from reportCsv