Payroll
Generate, approve, and disburse monthly payroll batches through a locked draft → approved → paid workflow.
Overview
Payroll generates one batch per calendar month, computing every active employee's pay from their base salary using a fixed formula, then walks that batch through an immutable state machine — Draft → Approved → Paid — that mirrors how the underlying accounting entries are locked in.
Reads Base Salary from HR
Payroll pulls each active employee's base salary from their HR record. Employees with no salary set, or marked archived, are excluded from the batch entirely — they never appear as a $0 row.
Payroll Calculation
Each employee's line is calculated with a fixed rule set — there is no overtime, days-worked proration, or manual per-line deduction entry:
Base Salary
+ Allowances (5% of base)
− Tax Withholding (18% of base)
− Social/Pension Deductions (6% of base)
If an employee's computed net pay would be negative (deductions exceeding gross), that employee is skipped from the batch and an error message naming them is attached to the batch for review — the batch still generates with everyone else.
Batch Lifecycle
| State | What it means | What you can do |
|---|---|---|
| Draft | Batch generated, figures computed but nothing posted to the ledger | Approve or Cancel |
| Approved | Journal accruals posted (Debit Salary + Allowance Expense, Credit Salaries/Tax/Deductions Payable); batch is locked | Disburse via bank transfer |
| Paid | Net amount deducted from the selected bank account and Salaries Payable cleared | Export bank transfer sheet; view only |
| Cancelled | A Draft batch that was cancelled before approval | None — a new batch can be generated for the same period |
Only one batch can exist per period (e.g. one for "2026-05") unless the prior one was cancelled — trying to generate a second active batch for the same month is rejected.
Running Payroll
- Click Generate Batch and pick the target month — this computes a new Draft batch for every active, salaried employee.
- Review the payroll line grid: base salary, allowances, deductions, tax withholding, and net pay per employee.
- Click Approve & Post. TotalApp validates the journal entries balance (debits = credits) and posts the accrual — the batch is now locked and cannot be edited.
- Select the corporate Bank Clearing Account and click Register Bulk Payment to disburse. TotalApp verifies the account balance covers the total net payout before deducting it and clearing Salaries Payable.
Insufficient Funds Blocks Disbursement
If the selected bank account's balance is below the batch's total net payout, disbursement is rejected outright — there is no partial payout. Top up the account or select a different one before retrying.
Export Bank Transfer Sheet
Click Export Transfer Sheet (available once a batch is Approved or Paid) to download a CSV listing each employee's name, role, department, net pay, and a payroll reference — ready to hand to your bank for a bulk wire transfer.
AI Assistant
Payroll includes an embedded AI Assistant panel that reads the currently selected payroll batch — period, state (draft / approved / paid / cancelled), and every employee line (role, department, base salary, allowances, deductions, tax withholding, net pay) — and answers questions about the batch directly on the screen.
Batch Review
Ask for a headcount, gross/net totals, or a department cost breakdown for the selected pay period.
Variance Detection
Flag employees whose allowances, deductions, or net pay differ unusually from peers in the same role or department.
Compliance Checks
Surface missing or zero tax withholding, negative net pay, or duplicate-looking employee lines before you approve the batch.
Save as Report
Any AI response can be saved as a named report to My Reports with one click — the title is generated automatically from your prompt and the current month.
Open the panel from the vertical AI Assistant tab on the right edge of the screen. It uses the Writer Engine configured in Settings → General → Writer Engine (API, Local CLI, or in-browser engines) — no per-screen configuration is required.