Sign + Issue + Lock + Archive — close the file
The last 4 steps. Partner signs the report, firm issues to the client, the engagement file locks (read-only forever), and the entire pack is archived as a SHA-256-verified ZIP for the 7-year retention period mandated by ISA 230 + Oman OAAA.
The 4 closing acts
Step 1 — Sign the audit report
Partner clicks "Sign final report"
From the Audit Report page → Sign & finalise. The system requires re-authentication (password + optional 2FA). Stamps: signer name, role, ISO timestamp, IP, user-agent.
Partner's signature image renders
The PNG signature stored against the partner's profile (Settings → Signatures) is rendered into the PDF at the correct position. Firm letterhead, firm stamp, partner block all populate.
EQCR signs (if required)
Independent EQCR partner reviews + signs final. Two signatures appear on the PDF — partner + EQCR.
"DRAFT" watermark removed
The signed final has no watermark. The system flips the document type from draft_audit_report to signed_audit_report. The draft is preserved in the file but marked superseded.
Step 2 — Issue to the client
Compose issuance email
From Communications → Issue audit report. Auto-template: branded HTML, signed PDF attached, FS notes attached, courtesy cover letter. Partner reviews wording.
Send
System sends via firm SMTP. Client's primary contact + finance head + (optional) regulator. Each recipient logged with delivery status (sent / delivered / opened).
Activity stamp
Job timeline records: "Audit report issued by [Partner] on [timestamp] to [N recipients]". Becomes part of the audit trail.
Step 3 — Lock the engagement file
Click "Lock engagement"
From the job dashboard → Close engagement. The system runs final completeness checks: are all workpapers EQCR-signed? Is the audit report signed? Is the issuance email sent? If yes, lock proceeds.
What "locked" means
Workpapers, AJEs, FS, notes, disclosures — all read-only. No edits possible. Status flags:
jobs.status = 'archived',workpapers.status = 'locked'. Audit-log records the lock with user + timestamp.Unlock procedure (rare)
Only super_admin / partner can unlock. Requires written reason > 50 characters. Captured in audit log. Used for: subsequent-event amendments, regulator-mandated re-issuance.
Step 4 — Archive (the 7-year vault)
This is the part most other systems miss. The audit-evidence file must be retained, intact, for 7 years per ISA 230 + Oman OAAA. AuditPro builds a self-contained archive ZIP:
Engagement-AlBahja-FY2025-{JOB-ID}.zip · sha256: a3f8...e201
├── 01-engagement/
│ ├── engagement-letter-signed.pdf
│ ├── independence-confirmation.pdf
│ └── client-acceptance-memo.pdf
├── 02-trial-balance/
│ ├── tb-original-uploaded.csv (sha256: ...)
│ ├── tb-adjusted.csv
│ └── ajes-register.pdf
├── 03-workpapers/
│ ├── A-100-Planning.pdf
│ ├── B-100-Cash.pdf
│ ├── ... (12 workpapers, all EQCR-signed)
│ └── _signoffs-matrix.csv
├── 04-fs-pack/
│ ├── SFP.pdf · SPL.pdf · SCF.pdf · SOCIE.pdf
│ ├── notes-1-to-24.pdf
│ └── disclosure-checklist.pdf
├── 05-audit-report/
│ └── Audit-Report-AlBahja-FY2025-SIGNED.pdf
├── 06-completion/
│ ├── completion-summary.pdf
│ └── readiness-pdf.pdf
├── 07-audit-trail/
│ └── audit-log-{JOB-ID}.csv (every action, timestamped)
└── _manifest.json (sha256 + size per file)
SHA-256 integrity
Every file in the archive has its SHA-256 hash recorded in _manifest.json. The ZIP itself has a top-level SHA-256. If anyone tampers with even one byte, the hash mismatch is detected on next integrity check. The hash is logged in the database, in the audit trail, and (if configured) in an off-site log so it cannot be quietly overwritten.
The retention promise
| Aspect | How it's enforced |
|---|---|
| 7 years | retention_until = report_date + 7 years stamped on the engagement |
| SHA-256 | Manifest + top-level ZIP hash; mismatch alerts ops |
| Off-site copy | Nightly rclone to Backblaze B2 / S3 / Wasabi (configurable) |
| 3-2-1 backup | 3 copies, 2 media, 1 off-site |
| Restore drill | Quarterly: pick a random archive, restore, verify hash, log |
| Auto-purge | After 7 years + grace period, system flags for purge — partner reviews + approves |
| Legal hold | Any engagement under regulatory inquiry can be marked legal-hold — never auto-purges |
Step-by-step archive
Trigger the build
From the locked job → Build archive. Service walks every related table, exports each artefact as PDF, packages the folder structure shown above, computes hashes, builds ZIP.
Verify integrity
System recomputes hashes from ZIP contents and compares to manifest. Match = good. Mismatch = abort + alert ops.
Off-site sync
Nightly cron (`bin/cron-offsite-backup.sh`) syncs new archives to remote object storage. Logs success / failure. Email alert if 2 nights in a row fail.
Issue to client
Optional: client gets a copy of the archive (PDF set only — workpapers stay internal). Most firms send only the FS pack + audit report.
Done
Engagement is closed, file is locked, archive is hashed, off-site copy lives in 2 datacentres. The audit firm's professional liability is now properly evidenced for 7 years.
On a fully-completed audit job → Build archive. Watch the progress dialog: 32 PDFs generated, manifest hashed, ZIP packed in ~6 seconds. Download the archive, open it in your file manager — every artefact is there, every hash matches.
Don't let off-site backup go silent. The cron sends a nightly success log; configure the alerting so a failed sync pages someone within 24h. Audit firms have lost their licence to practice over evidence-file destruction. Backup is non-negotiable.
Pick a random closed engagement every quarter, restore from off-site, verify hash, open the audit report PDF. Log the result. Document this drill — peer reviewers and regulators love seeing it. Backup that hasn't been tested is hope, not preparedness.
You're done
From "client TB imported" to "signed audit report locked in 7-year SHA-256-verified archive" — the entire IFRS / ISA-compliant audit lifecycle, walked end-to-end. The next engagement starts at Phase 0. The system has made the work easier, but the professional judgement remains the auditor's.
Open the ZIP → manifest.json → 32 hashed PDFs → audit-log.csv showing every click, every sign-off, every AJE posting from day 1 to day 80 of the engagement. Reproducible audit evidence — exactly what ISA 230 demands.