Period Close Workflow
The spreadsheet month-end close, moved into Odoo with a real sign-off chain and a segregation-of-duties gate.
Why this module
Period Close Workflow
Segregation of duties, enforced
On approval the code blocks the reviewer who requested it and the original preparer from signing off their own close. A different manager must approve. This is a real ICR and SOX control, raised with a named error, not a policy note in a manual.
Templates and runs stay separate
A run copies the template into independent per-run task instances. Editing this period never mutates the template and never reaches back into a prior closed run. The sign-off trio survives a reopen, and completed signers and timestamps are never overwritten by a re-mark.
Yours to keep
LGPL-3 source on disk. No activation key, no phone-home, no recurring licence. Tasks are real records, queryable and exportable, and every transition is tracked in Odoo chatter with user and timestamp. Free today, free at renewal, because there is no renewal.
Day in the life
A controller closes the March books with a clean handover.
The accountant opens a run from the Standard Monthly Close checklist for March. Setting the period end auto-fills the period start to the first of that month, leaving any custom range untouched. They work the tasks: bank reconciliation done, accruals posted, a fixed-asset query marked blocked with a reason while they wait on a vendor. The optional intercompany note is left pending, which is fine. With the asset query resolved and unblocked, they request approval. The run refuses at first because one required task is still in progress, names it, and stops. Once it clears, the run moves to pending approval and stamps them as reviewer. Their manager opens it to approve and the system blocks them only if they were the preparer or reviewer. A second manager approves, the run closes, and prepared, reviewed, and approved are all stamped with names and times. A week later a late adjustment lands. The manager reopens the run, the original sign-off trio is preserved, and the reopen is recorded against their name.
Edge cases
The cases most modules quietly ignore.
In the shipped code today, each one a place where a cheaper module silently does the wrong thing.
Clicking Mark Done on an already-done or not-applicable task is a no-op that preserves the original signer and timestamp. The audit trail cannot be quietly overwritten by a second click, and a regression test guards the prior bug where the check compared against a non-existent state.
Optional tasks (is_required false) never block the request-approval transition, so a close can proceed with optional items still pending. Only required tasks gate the close, which is verified by test.
Creating a run from a checklist with zero task templates raises an error instead of producing an empty, meaningless run.
Only an Accounting Manager can revert a completed task to pending. The reset clears the completion fields and any blocked reason, a controlled rework path that ordinary users cannot trigger and that is itself recorded in chatter.
Setting the period end auto-fills the period start to the first of that month only when the start is empty or out of range, so a deliberately custom range is left intact.
A checklist code must match an identifier pattern and be unique per company, so report and automation references stay stable even when a checklist is renamed.
What is inside
Built to do the job, end to end.
- Reusable checklist templates. Define a checklist once with ordered tasks and reuse it every period. One per cadence (monthly, quarterly, year-end) or one per subsidiary. A default Standard Monthly Close with 8 tasks installs on first install.
- Per-run task instances. Each run copies the template into independent task records with states pending, in progress, done, not applicable, and blocked. Tasks carry a sequence for close order with a drag handle to reorder, and notes plus a blocked reason where needed.
- Run lifecycle and sign-off chain. Runs move through open, in progress, pending approval, closed, and reopened. Prepared, reviewed, and approved each record a readonly signer and timestamp, giving a defensible handover trail.
- State machine guards. Approval cannot be requested while a required task is pending or in progress, and a run cannot close while any task is blocked. On approval, the preparer and the reviewer are both blocked from approving their own work.
- Reopen with history intact. An Accounting Manager can reopen a closed run for post-close adjustments. The original prepared, reviewed, and approved trio is preserved and the reopen stamps who did it and when.
- Multi-company isolation. Per-company record rules scope checklists, runs, and tasks so each company sees only its own close data.
Honest about the edges
What this does not do, so nothing surprises you.
- There is no hard predecessor lock. Tasks carry a sequence for display order and can be reordered by drag, but any task can be worked in any order. Required tasks simply must be complete before approval is requested.
- There is no append-only audit log model. The audit trail is the standard Odoo chatter (mail.thread tracking) with user and timestamp, and the signer and timestamp fields are UI-readonly rather than write-locked at the database level. A manager Reset to Pending can clear a completion for rework.
- Only one default checklist (Standard Monthly Close, 8 tasks) ships. Deeper cadence and per-subsidiary catalogues are deployment-specific and built on site.
- This module does not surface a dashboard counter and does not auto-schedule a year-end closing task. It pairs narratively with other suite modules but does not hook into them through code.
- No payment file generation, SEPA, or country tax worksheet is included here. Those live in their own suite modules.
odoo 19 month end close checklist, period close workflow odoo community, accounting close sign off chain, segregation of duties close approval odoo, financial close task tracking odoo, year end close checklist template, multi company period close odoo, close run audit trail prepared reviewed approved, reusable accounting close checklist
Languages
Available in 19 languages
The interface ships translated out of the box. Switch language in Odoo and the fields, menus, and messages follow.
Please log in to comment on this module