🔁 Attendance × Leave Reconciliation
The Reconciliation view is a day-by-day report that puts each employee’s attendance evidence side by side with their leave records and flags every disagreement. It lives inside the Leaves module as a toggle, and is intended for HR users with the authority to override a leave decision when the two sources disagree.
The principle: Attendance is evidence, Leave is policy, Salary is payment. The biometric punch-log tells you who actually showed up; the Leave register tells you who was authorised to be away. When those two stories don’t match, Reconciliation is where HR closes the gap — without ever overwriting attendance silently or auto-creating leaves behind the user’s back.
💡 Why Reconcile
- Catch absent-but-not-on-leave — an employee marked Absent in attendance with no Leave record. Was it forgotten leave, an unnotified absence, or genuine LWP?
- Catch on-leave-but-also-present — a Leave record overlaps with a Present punch. Either the leave was cancelled informally (mark cancelled here) or the attendance row needs a correction.
- Half-day mismatches — punched in for half the day but on full-day leave (or vice versa). Convert the leave to half-day in one click instead of manually editing both records.
- Pre-payroll cleanup — running Reconciliation before generating salary catches anomalies that would otherwise show up as wrong Paid Days.
👮 Who Can Use It
🔒 Reconciliation is visible only to roles that have the Leave Override permission on the Leaves module. Regular employees, line managers, and even HOD-level reviewers without Leave Override see only the standard Leaves list — the toggle to switch into Reconciliation is hidden for them.
The reasoning: actions inside Reconciliation create or cancel leaves on someone else’s record without manager round-trip. That requires a higher trust level than ordinary leave approval. If your HR team sits inside an existing role without Leave Override, ask the tenant Admin to enable it on that role from Settings → Roles.
📍 Where It Lives
📍 Screen: HRM → Leaves → toggle the Reconciliation view (table-search icon at the top of the Leaves list).
The Leaves module shows a small two-position toggle. The left position is the standard Leaves list; the right position switches to Reconciliation. The toggle itself is only rendered if you have Leave Override — users without it never see the right-hand switch.
📊 The Grid — Columns Explained
Each row in Reconciliation is one employee × one date — the smallest unit at which Attendance and Leave can disagree. Columns:
| Column | What it shows |
|---|---|
| Date | The calendar day, formatted dd-MMM-yyyy. |
| Employee | Full name of the employee for that day. |
| Attendance | The derived attendance status for that day — Present, Half Day, Absent, or — (no record). Coloured chip. |
| Leave | Any Leave record(s) covering that date — leave type as a chip. A grey Dismissed badge appears if the leave was previously dismissed (see below). |
| Conclusion | The system’s reading of the row: OK, Holiday, Week Off, Leave Taken, Needs Action, Mismatch, Half Mismatch, or Data Gap. |
| Action ▾ | Dropdown of fixes available for this row. Empty for OK / Holiday / Week Off / Leave Taken — those rows need no intervention. |
💡 The Conclusion column is your eye-line: anything coloured warning / danger / orange / accent is worth opening. Anything green (OK) or neutral (Holiday, Week Off) can be ignored.
🛠️ Action Menu Options
The Action ▾ menu shows only the actions that make sense for that row’s conclusion. Available options:
- Add Unpaid Leave (LWP) — creates a one-day Unpaid leave on the employee’s record. Used when an employee was Absent with no leave authorisation; the day becomes Loss of Pay.
- Add Paid Leave — creates a one-day Paid leave on the employee’s record. Used when HR retroactively authorises a paid absence that wasn’t logged in time.
- Add Unnotified Leave — creates a leave flagged as Unnotified (i.e., the employee didn’t follow the standard leave-request flow but the absence is being recorded for traceability).
- Cancel Leave — cancels the leave record on this row. Used when attendance proves the employee actually worked and the leave was filed by mistake.
- Convert to Half Day — when half-day attendance contradicts a full-day leave. The current build prompts you to make this change in the Leaves or Attendance module and reload.
- Edit Attendance — when the attendance row is wrong (bad punch, biometric error). The current build prompts you to make the change in the Attendance module and reload.
- Mark Present — quick action when the employee was actually present but no attendance row exists.
- Dismiss (Mark Reviewed) — closes the row without changing data. Used for known-and-accepted contradictions (see below).
- Skip — hides the row from the current view without persisting anything; useful for deferring a decision in this session.
📌 The exact options shown depend on what the row contains: Add Leave options only show when there is no leave for that date; Cancel Leave only shows when there is one to cancel; Mark Present only shows when attendance is missing; etc.
🔍 Mismatches-Only Filter
The toolbar has a switch labelled Mismatches only, on by default. With it on, the grid only shows rows where action is needed:
- Needs Action
- Mismatch
- Half Mismatch
- Data Gap
Turn the switch off to also see the OK / Holiday / Week Off / Leave Taken rows — useful when you want a full month’s audit trail rather than just the actionable subset.
💡 Future-dated rows are always hidden, regardless of the toggle. Reconciliation is a backward-looking screen — it has nothing to say about days that haven’t happened yet.
⚡ Auto-Approved Leaves
Any leave that you create directly from the Reconciliation grid (Add Unpaid / Add Paid / Add Unnotified) is created in Approved state — no manager round-trip, no HOD round-trip, no email reminders. The reasoning is twofold:
- The actor already holds Leave Override, which is a higher trust level than line-manager approval.
- You are recording a fact (the employee was/wasn’t here) rather than soliciting a decision.
The created leave then participates in salary calculation, leave-balance tracking, and reports the same way any approved leave would.
⚠️ Because reconciliation-created leaves bypass the normal approval chain, you should treat them as audit-significant. Use the Comments / Reason field on the resulting leave (visible from the Leaves list) to record why it was created retroactively.
👁️ Dismiss Behaviour — Audit-Only
Some contradictions are real but acceptable: a leave was approved on policy grounds even though the punch-log shows the employee was on premises briefly that day, or vice versa. Dismiss is for those rows.
- It marks the leave with an attendance-contradicted audit flag and adds a small Dismissed badge next to the leave chip in this grid.
- It does not change attendance, leave duration, leave status, leave balance, or salary calculation.
- It is purely a “I have looked at this and accepted it” record so the row stops showing up as Needs Action on future reconciliation runs.
💡 Use Dismiss when the contradiction is real but expected. If the contradiction is a mistake on either side, prefer Cancel Leave / Edit Attendance / Add Leave instead — Dismiss should never be used to hide a problem.
🚫 What Reconciliation Does Not Do
📌 Important rule: Reconciliation never overwrites attendance silently and never auto-creates leave outside this screen. Every change is initiated by a human action in the Action menu, and every change writes a normal Leave or Attendance record that you can audit afterwards.
- No auto-LWP. The system flags an Absent-no-Leave row as Needs Action, but it will never convert it to LWP on its own — that conversion only happens when you click Add Unpaid Leave.
- No bulk apply. Each row is acted on individually. Bulk actions (e.g., apply LWP to every Mismatch in March) are deferred to a future iteration.
- No retroactive re-scan. Reconciliation reads the current Attendance and Leave tables for the selected month and produces conclusions live. It does not store yesterday’s verdicts and re-run them.
- No salary impact from Dismiss. Salary keeps reading the Leave register directly. Dismissing a leave does not adjust its Paid / Unpaid flag — that’s purely a leave-side decision via Cancel or Convert.
📌 Important Notes
- Run before payroll. Reconciling each month before generating salary catches the bulk of anomalies; once salary is paid for a month, regeneration is blocked, so cleanups become harder.
- Half Mismatch needs the other module. Convert-to-Half-Day and Edit-Attendance currently prompt you to open the Leaves or Attendance module to make the change, then reload Reconciliation. They are not single-click corrections in this build.
- Dismissed leaves stay in salary. The Dismissed badge is cosmetic. If a dismissed leave should not be paid, cancel it instead.
- Filter is a switch, not a state. Mismatches-only resets to ON each time you open the screen.
💡 Tips
- Pick a monthly cadence. Run Reconciliation once a month, ideally one or two days before salary generation. The default Mismatches-only filter keeps the list short.
- Comment when you create. When you Add Unpaid / Paid / Unnotified Leave from this screen, jump to the resulting leave in the Leaves list and add a one-line reason — your future audit will thank you.
- Use Dismiss sparingly. If you find yourself dismissing dozens of rows a month, the underlying policy is probably fighting your attendance reality — fix the policy or the punch source rather than masking the rows.
- Don’t fix attendance from here. For attendance corrections, open the Attendance module and edit the day record there — that path keeps the Correction Log entry that auditors expect.
🔗 Related Articles
- Attendance — daily punch ledger that feeds the Attendance column.
- Leaves — the leave register, approval chain, and balance tracking that feed the Leave column.
- Salary — Paid Days = Total Days − Absent − LWP. Reconciliation is your last chance to clean up before salary reads these figures.
- Roles & Permissions — where the Leave Override permission is granted.

