Sarah is moving an existing company onto Zetta HRM mid-year. Instead of importing each module separately and hoping the order is right, she downloads one workbook with a tab for every entity — departments, designations, employees, salary structures, leave types, holidays, loans, and opening balances — fills in what she has, and uploads it once.
The system validates the whole workbook, shows her a single cross-module preview, and configures nothing until she approves. Because she is joining part-way through the year, she also brings each employee's opening balances so the first payroll run continues cleanly instead of resetting year-to-date totals to zero.
Later, when she just needs to correct one module or add a batch of new hires, she uses the standard single-module import. And every month she exports reports for payroll reviews, finance, and auditors.
### Import & Start Working — the guided onboarding (one workbook)
### Single-module import (top-ups and corrections)
### Export
| Failure | What the user sees | What happens next |
|---|---|---|
| Workbook sheet has invalid format or a renamed/reordered header | Row- and sheet-level validation errors in the combined report | Fix the flagged cells (or re-download the template) and re-upload |
| Some rows are invalid but others are fine | "X created, Y failed" per module, with a downloadable error report | Valid rows still apply; fix the failed rows and re-apply |
| Apply stops part-way (e.g. a later module errors) | Session marked PARTIAL/FAILED; already-applied modules stay | Re-apply resumes from the first incomplete module — earlier modules are not re-created |
| Statutory provisioning hiccups during apply | Apply still completes; the statutory step is reported as failed | Re-apply — statutory setup re-runs idempotently and seeds the rows |
| A module references another that is not in the file yet (e.g. an employee's department) | Row-level "not found" error for that reference | Include the referenced rows, or import that module first |
| Single-module CSV has duplicate rows | Rows skipped or corrected per the module's unique key | De-duplicate and retry |
| Scenario | Behavior | Why |
|---|---|---|
| Nothing is applied before approval | Validate and preview only stage data; approval flips the gate | The guarantee: you see every change before it touches your workspace |
| Mid-year onboarding with opening balances | YTD seeds carry into the first payroll run; statutory caps continue, not reset | A joiner part-way through the tax year withholds correctly |
| Re-importing the same opening balances or existing loans | Re-import corrects in place rather than duplicating | Imports key on stable unique fields and are idempotent |
| Records created by an import are deleted, then the same file is uploaded again | Validation is recomputed against the current database and the rows are written again | The check is against live data, not against the upload log — deleting the rows changes exactly what a cached answer was describing |
| The same file is uploaded twice with nothing deleted in between | The stored copy is reused, the rows that already exist are skipped, and pressing Execute Import twice does not import twice | Repeating an upload should be free of consequence, not free of checking |
| A deliberate clean slate is wanted for a file uploaded before | Tick Force re-import before uploading: it ignores everything staged from the earlier attempt | Rarely needed, but there when you want no shared state with the previous try |
An attendance file writes Check In as 09:00 | Read as 9 AM in the company's timezone, set on the company profile | A wall-clock time means the wall where your people work, not wherever the server happens to be |
An attendance row runs 22:00 → 06:00 | The checkout lands on the next day and the day is eight hours long | Imported days go through the same calculation as punched ones, which knows a shift can cross midnight |
| An attendance row leaves Shift Name blank | The employee's effective shift assignment is used, then the company default | A blank cell is the file declining to say, not the employee having no schedule — and with no shift there is nothing to measure lateness or overtime against |
| An attendance row leaves Status blank | Status is derived from the punches: an arrival past the grace period imports as Late, not Present | The file states facts; the system draws the conclusions, the same way it does for a live punch |
| An attendance file fills Late Minutes and also has a Check In | The punches win and Late Minutes is recomputed | A row that states both can contradict itself; the derived figure is the one every other day in the table was measured with. Files with no punches still use the column |
| Existing (already-disbursed) loans | Imported as active with paid installments already marked, so they are never re-deducted | Onboarded loans reflect real outstanding state, not a fresh schedule |
| Combined workbook vs single template | Both are offered on the Import Center; the workbook is the guided full setup, single templates are top-ups | One file for go-live, focused files for day-to-day corrections |
| Large export generation | Jobs move through PENDING → PROCESSING → COMPLETED/FAILED | Visibility for long-running background tasks |