Compliance — Annual & Periodical — Forms
Compliance — Annual & Periodical — Forms & Input Specification
Reference technical blueprint: compliance.md 7 sub-modules · 14 forms · the recurring-deadline engine on top of Statutory — schedules filings, tracks them as they happen, and dispatches reminders before they lapse.
The Compliance module operationalises the legal anchors stored in Statutory. Statutory tells the institution what it is registered for; Compliance tells it when each obligation falls due, who is on the hook, how the reminder sequence runs, and — once filed — what acknowledgement number, scan, and status the trustee pack needs to show. Domain coverage spans Form 10B (audit), FC-4 (FCRA annual), ITR-7 (income tax), GSTR-1 / GSTR-3B (GST returns), TDS 24Q + 26Q (quarterly TDS), 12A / 80G / FCRA / FSSAI / fire-safety renewals (long-cycle), audit engagements per FY, statutory trustee meetings (board / AGM / committee), and the per-channel reminder dispatch queue.
Two-key cosign applies to filing-status flips (filed_on, acknowledgement_number, status) because back-dating a filing is a major audit red flag. Audit engagements are two-key on every change because auditor identity and opinion text are legal-weight. Reminder dispatch and renewal-pipeline status changes are passive-audit-logged only.
Sub-module 1: Compliance Obligations (Master Templates)
Form 1.1 — Define Compliance Obligation
Purpose: Master template for a recurring obligation. Most rows are seeded globally (e.g. FORM-10B, FC-4, GSTR-3B) and copied into a tenant when the tenant gains a relevant Statutory registration. This form lets a tenant-admin add a tenant-specific obligation (e.g. an internal sister-trust quarterly report). Who fills: Tenant-admin. Rare — usually only at onboarding or when a custom internal cadence is needed.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Obligation Code | Text (40) | Yes | UPPERCASE alphanumeric + hyphen; unique per tenant | — | e.g. SISTER-TRUST-QTR, BOARD-MEETING-Q |
| Title | Text (255) | Yes | min 5 chars | — | Human label e.g. Form 10B — Audit Report |
| Regime | Dropdown | Yes | income-tax / fcra / gst / tds / state-renewal / safety / governance / internal / other | other | Drives colour coding on calendar |
| Cadence | Dropdown | Yes | monthly / quarterly / half-yearly / annual / biennial / 5-yearly / on-event / one-shot | annual | How often the filing is due |
| Cadence Anchor | Dropdown | No | fy-end / cy-end / cert-issue-date / fy-quarter-end / month-end / meeting-date / custom | fy-end | What date the cadence is anchored to |
| Due Offset (days) | Number | No | 0 – 730 | — | Days after anchor when filing is due (Form 10B = 212 days after FY-end) |
| Period Label Template | Text (40) | No | Tokens: {yyyy} {fy} {q} {mmm} |
FY {fy} (annual); Q{q} FY{fy} (quarterly); {mmm} {yyyy} (monthly) |
Generates unique period labels mechanically |
| Requires Tax Registration Kind | Dropdown | No | — / 12A / 80G / FCRA / GSTIN / TAN / PAN | — | If set, obligation only materialises for tenants holding that registration |
| Reminder Offsets (days) | Multi-int | No | Negative integers; max 6 entries | [-30, -7, -1] for tax filings; [-30, -21, -14, -7, -1] for AGMs |
T-N reminders before due date |
| Reminder Channels | Multi-select | No | email / whatsapp / postal | Channels for reminder dispatch | |
| Default Responsible User | FK (Users) | No | Active tenant users | — | Default owner; can be overridden per filing |
| Is Active | Toggle | Yes | true / false | true | Toggle off to suspend without deleting |
| Notes | Textarea | No | — | — | — |
Submit action: Creates compliance_obligations row with tenant_id set. Triggers plan_filings cron immediately so the first instance is materialised right away. If is_global_seed were set, this would be a system-wide template — restricted to super-admin only.
Related forms: Schedule Filing (2.1) is auto-generated from this template, but can also be manually created.
(Workflow note: Tenants typically never touch this form — global seeds cover the regulated obligations. It exists for niche internal cadences. Edits to cadence on an active obligation rebuild future compliance_filings rows; past rows are untouched.)
Sub-module 2: Filings (Concrete Instances)
Form 2.1 — Schedule Filing (Manual)
Purpose: Manually create a compliance_filings row for a specific period. Usually the planner cron creates these automatically; manual creation covers gap years or one-off filings.
Who fills: Tenant-admin or module-admin. Rare.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Obligation | FK (Compliance Obligation) | Yes | Active obligations for this tenant | — | The master template |
| Period Label | Text (40) | Yes | Unique with (tenant, obligation) | auto-generated from template | e.g. FY 2025-26, Q1 FY26, Apr 2026 |
| Period Start | Date | No | — | auto-derived from anchor | First day of the period |
| Period End | Date | No | After Period Start | auto-derived | Last day of the period |
| Due Date | Date | Yes | Future date (or past for backfill) | auto from anchor + offset | Original statutory due date |
| Extended Due Date | Date | No | After Due Date | — | If CBDT/MCA has notified an extension |
| Status | Dropdown | Yes | upcoming / in-progress / filed / accepted / rejected / amended / lapsed / na | upcoming | — |
| Responsible User | FK (Users) | No | inherits from obligation | — | Owner for this specific filing |
| Tax Registration Link | FK (Tax Registration) | No | If obligation requires_tax_registration_kind is set |
auto-matched | e.g. links a 12A renewal to the specific 12A row |
| Certificate Link | FK (Certificate) | No | — | — | For safety/FSSAI renewals |
| Branch | FK (Branches) | No | — | — | For per-branch filings (e.g. FSSAI per kitchen) |
| Notes | Textarea | No | — | — | — |
Submit action: Creates compliance_filings row. Triggers plan_reminders(filing_id=...) to materialise reminder_schedules rows from the obligation's reminder_offsets_days.
Related forms: Mark Filing Filed (2.2), Upload Acknowledgement (2.3), Amend Filing (2.4).
Form 2.2 — Mark Filing Filed
Purpose: Records that a filing has been submitted to the relevant portal/authority. Two-key because the filed-date timestamp is auditor-relevant. Who fills: Tenant-admin or assigned responsible user. On the day of (or shortly after) filing.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Filing | FK (Compliance Filing) | Yes | Status in {upcoming, in-progress} | from page context | — |
| Filed On | Date | Yes | Today or past 30 days; not before period_start | today | Cannot back-date >30 days without escalation |
| Acknowledgement Number | Text (127) | Yes | min 5 chars | — | The portal-issued ack/ARN/transaction ID |
| Portal Reference | Text (127) | No | — | — | URL or filing-portal record ID |
| Filed By (User) | FK (Users) | Yes | Logged-in user | current user | Who actually pressed Submit on the portal |
| Acknowledgement Custody | FK (Document Custody) | No | — | — | Pre-existing custody record; alternatively use 2.3 to upload directly |
| Penalty Amount (INR) | Decimal | No | ≥ 0 | 0 | If late, capture the late fee paid |
| Auditor Qualification (text) | Textarea | No | — | — | If filing came back with auditor qualifications |
| Status (target) | Dropdown | Yes | filed / accepted | filed | "Accepted" only when the portal confirms acceptance separately |
| Reason | Textarea | Yes | min 20 chars | — | Required by two-key — explain late filing, back-dated entries, etc. |
Submit action: Routes through submit_two_key_change. On cosign, sets filed_on, acknowledgement_number, status='filed' (or accepted), filed_by_user_id, accepted_on=today if status='accepted'. Cancels any future reminders for this filing (status='superseded'). Triggers cron_lapse review to ensure no false lapse.
Related forms: Upload Acknowledgement (2.3) often follows immediately.
Form 2.3 — Upload Acknowledgement Scan
Purpose: Attach the filing acknowledgement / portal screenshot / receipt PDF to the filing row. Who fills: Filer or tenant-admin.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Filing | FK (Compliance Filing) | Yes | Status in {filed, accepted, amended} | from page context | — |
| File | File upload | Yes | PDF/JPG/PNG; max 10 MB | — | Single file; merge multi-page first |
| Document Type | Dropdown | Yes | Filing acknowledgement / Portal screenshot / Receipt / Notice / Audit qualification letter | Filing acknowledgement | — |
| Notes | Textarea | No | — | — | — |
Submit action: Creates a new document_custody row (kind=Filing Ack) and uploads file to GCS at gs://aayojana-compliance/{tenant_id}/{filing_id}/{sha256}.pdf. Sets compliance_filings.custody_id. Audit-logged.
Related forms: Visible on Filing detail page; downloadable by tenant-admin and filer.
Form 2.4 — Amend Filing
Purpose: Captures a corrective re-filing — e.g. revised Form 10B after audit qualification, GSTR amendment. Who fills: Tenant-admin. Two-key.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Original Filing | FK (Compliance Filing) | Yes | Status in {filed, accepted, rejected} | from page context | — |
| Amendment Period Label | Text (40) | Yes | min 5 chars | "{original} (Amended)" | — |
| New Due Date | Date | No | — | original due date | Amendments sometimes have their own deadline |
| Amendment Reason | Textarea | Yes | min 50 chars | — | Detailed explanation — required for audit and for the cosigner |
| New Acknowledgement Number | Text (127) | No | — | — | If already filed, capture new ARN |
| New Filed On | Date | No | — | — | If already filed |
| Reason (cosign) | Textarea | Yes | min 30 chars | — | Two-key reason — distinct from amendment reason |
Submit action: Two-key. On cosign, creates a new compliance_filings row with amends_filing_id pointing to the original; flips the original's status='amended'; copies tax-registration / certificate / branch links from original.
Related forms: New filing surfaces in the filings list with an "Amended" badge.
Sub-module 3: Renewal Calendar (Long-Cycle)
Form 3.1 — Renewal Calendar Entry (12A · 80G · FCRA · FSSAI · Fire)
Purpose: Tracks the multi-month workflow of renewing a long-cycle registration: application prep → submission → query response → issuance. Distinct from a Filing because a renewal produces a new statutory record (new certificate number).
Who fills: Auto-created by plan_renewals cron when a Statutory expires_on is detected; tenant-admin can also add manually.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Target Kind | Dropdown | Yes | 12A / 80G / FCRA / FSSAI / fire-safety / pt / other | — | Which registration is being renewed |
| Target Tax Registration | FK (Tax Registration) | Conditional | Required if kind in {12A, 80G, FCRA, PT} | auto-matched from kind | Existing active row being renewed |
| Target Certificate | FK (Certificate) | Conditional | Required if kind in {FSSAI, fire-safety} | auto-matched | Existing active certificate being renewed |
| Expected Renewal Date | Date | Yes | Future date | source expires_on |
When the new certificate is expected to be effective |
| Application Window Opens On | Date | No | Before Expected Renewal | source expiry – 180 days | When the regulator opens the application window |
| Application Window Closes On | Date | No | Between Opens On and Renewal Date | source expiry | Application deadline |
| Status | Dropdown | Yes | upcoming / application-prepared / submitted / queries-raised / issued / rejected / lapsed / na | upcoming | Pipeline stage |
| Responsible User | FK (Users) | No | Active tenant users | — | Internal owner of the renewal |
| Notes | Textarea | No | — | — | — |
Submit action: Creates renewal_calendar row. Triggers plan_reminders(renewal_id=...) to schedule T-90 / T-30 / T-7 reminders.
Related forms: Submit Application (3.2), Issue Renewed Certificate (3.3).
Form 3.2 — Submit Renewal Application
Purpose: Marks that the renewal application has been submitted to the regulator. Who fills: Responsible user or tenant-admin.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Renewal Entry | FK (Renewal Calendar) | Yes | Status in {upcoming, application-prepared} | from page context | — |
| Application Submitted On | Date | Yes | Today or past 30 days | today | — |
| Application Reference | Text (127) | Yes | min 5 chars | — | ARN / portal reference / acknowledgement |
| Notes | Textarea | No | — | — | Any queries already raised, expected processing time, etc. |
Submit action: Sets application_submitted_on, application_reference, status='submitted'. Audit-logged.
Related forms: Issue Renewed Certificate (3.3) closes the loop.
Form 3.3 — Issue Renewed Certificate
Purpose: Records that the regulator has issued the renewed registration. Triggers creation of a new Statutory row (Tax Registration Renewal Form 2.2 or Certificate Renewal Form 3.2 in Statutory). Who fills: Tenant-admin only. Two-key flows through to Statutory.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Renewal Entry | FK (Renewal Calendar) | Yes | Status='submitted' or 'queries-raised' | from page context | — |
| Issued On | Date | Yes | Past or today | today | Date printed on the new certificate |
| New Certificate Number | Text (127) | Yes | Format per kind | — | The new number |
| New Expiry Date | Date | Yes | After Issued On | Issued On + cycle (5y for 12A/80G/FCRA, 1y for FSSAI/fire) | — |
| Issuing Authority | Text (255) | No | — | inherits from old | — |
| Reason | Textarea | Yes | min 20 chars | "Renewal issued per application ref [X]" | Two-key reason — flows into Statutory side as well |
Submit action: Two-key. On cosign:
1. Calls Statutory's renew_tax_registration (or renew_certificate) which creates a new Statutory row.
2. Updates renewal_calendar row: status='issued', issued_on, and FK to the new Statutory row (new_tax_registration_id or new_certificate_id).
3. Cancels remaining reminders for this renewal.
Related forms: Closes the pipeline; the new Statutory row is now the active anchor.
Sub-module 4: Audit Engagements (per FY)
Form 4.1 — Audit Engagement Setup
Purpose: Records the auditor relationship for a given Financial Year — appointment details, partner, fees. Two-key because auditor identity is a legal-weight fact. Who fills: Tenant-admin only. Once per FY (sometimes mid-year if auditor changes).
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| FY Label | Text (20) | Yes | Format FY YYYY-YY |
auto-suggest current FY | e.g. FY 2025-26 |
| FY Start | Date | Yes | Apr 1 typically | Apr 1 of FY | — |
| FY End | Date | Yes | Mar 31 typically; after FY Start | Mar 31 of FY | — |
| Auditor Firm Name | Text (255) | Yes | min 5 chars | — | e.g. M/s ABC & Associates, Chartered Accountants |
| Auditor FRN | Text (40) | No | ICAI Firm Registration Number; format \d{6}[A-Z]? |
— | e.g. 001234S |
| Engagement Partner Name | Text (255) | No | — | — | — |
| Engagement Partner Membership | Text (40) | No | ICAI membership number; numeric | — | — |
| Contact Email | No | RFC-822 valid | — | Audit firm primary contact | |
| Contact Phone | Text (48) | No | E.164 preferred | — | — |
| Appointed On | Date | No | Past or today | — | Board-resolution date |
| Appointment Resolution Reference | Text (127) | No | — | — | Trustee-meeting resolution number |
| Fees (INR) | Decimal | No | ≥ 0 | — | Audit fees as resolved |
| Status | Dropdown | Yes | appointed / in-fieldwork / draft / signed / qualified / adverse / disclaimer / na | appointed | — |
| Reason | Textarea | Yes | min 30 chars | — | Two-key reason for new engagement |
Submit action: Two-key. On cosign, creates audit_engagements row. Triggers plan_reminders(audit_engagement_id=...) for fieldwork-start and report-due milestones.
Related forms: Audit Sign-Off (4.2) closes the engagement.
Form 4.2 — Audit Engagement Sign-Off
Purpose: Records the final audit outcome — opinion, qualifications (if any), and management response. Who fills: Tenant-admin only. Two-key.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Engagement | FK (Audit Engagement) | Yes | Status in {in-fieldwork, draft} | from page context | — |
| Fieldwork Started On | Date | No | After Appointed On | — | — |
| Draft Received On | Date | No | After Fieldwork Start | — | — |
| Final Signed On | Date | Yes | Past or today; after Draft Received | today | Date the signed report was received |
| Opinion | Dropdown | Yes | unqualified / qualified / adverse / disclaimer | unqualified | The auditor's opinion |
| Qualifications Summary | Textarea | Conditional | Required if opinion ≠ unqualified | — | Free-text — bullet-point key qualifications |
| Management Response | Textarea | Conditional | Required if opinion ≠ unqualified | — | Trustee/management's written response |
| Response Recorded On | Date | No | After Final Signed | — | — |
| Linked Form 10B Filing | FK (Compliance Filing) | No | Form 10B filing for this FY | auto-matched | The corresponding ITR-7 / Form 10B compliance filing |
| Audit Report Custody | FK (Document Custody) | No | — | — | Where the signed report original is filed |
| Reason | Textarea | Yes | min 30 chars | — | Two-key reason — usually summarises the opinion |
Submit action: Two-key. On cosign, sets all fields, flips status to signed / qualified / adverse / disclaimer per opinion. Refuses to submit if Vitta has not period-locked the corresponding FY (cross-module check).
Related forms: Cross-references back to Form 10B / ITR-7 filing rows.
Sub-module 5: Trustee Meetings
Form 5.1 — Trustee Meeting Scheduler
Purpose: Schedules a board / AGM / special / committee meeting with statutory notice requirements. Who fills: Tenant-admin or designated secretary.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Kind | Dropdown | Yes | agm / board / special / committee | board | — |
| Title | Text (255) | Yes | min 5 chars | — | e.g. Q3 FY26 Board Meeting |
| Scheduled On | Date | Yes | Future date | — | Meeting date |
| Scheduled Time | Time | No | HH:MM | 11:00 | — |
| Venue | Text (511) | No | — | — | Physical address; or Virtual |
| Is Virtual | Checkbox | No | — | unchecked | If meeting is online |
| Notice Required Lead Days | Number | Yes | 7 / 14 / 21 | 21 (AGM); 7 (board); 14 (special) | Statutory notice period before scheduled date |
| Notice Issued On | Date | No | Before Scheduled On by Lead Days | — | Set when notice is dispatched |
| Quorum Required | Number | No | ≥ 2 | from trust-deed quorum clause | — |
| Notes | Textarea | No | — | Agenda hint | — |
Submit action: Creates trustee_meetings row with status='scheduled'. Triggers plan_reminders(trustee_meeting_id=...) — for AGMs uses richer offsets [-30, -21, -14, -7, -1]; for board/committee uses [-7, -1].
Related forms: Record Meeting Outcome (5.2), Finalise Meeting Minutes (5.3).
Form 5.2 — Record Meeting Outcome
Purpose: After the meeting, captures attendance, quorum-met status, and resolutions passed. Who fills: Secretary or tenant-admin. Same day or shortly after.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Meeting | FK (Trustee Meeting) | Yes | Status='scheduled' | from page context | — |
| Held On | Date | Yes | Past or today | scheduled date | If adjourned to a different date, capture that here |
| Status | Dropdown | Yes | held / adjourned / cancelled | held | — |
| Quorum Met | Checkbox | Yes | — | unchecked | Tick if quorum was satisfied |
| Attendees | Repeating group | Yes | Each: User FK or free-text name + role + attended (Y/N) | tenant trustees pre-loaded | Drag-drop or tick attendees |
| Resolutions Passed | Repeating group | No | Each: number, subject, type (ordinary/special), passed (Y/N), votes for, votes against | — | Free-form list of resolutions |
| Notes | Textarea | No | — | — | Adjournment reason, dissent notes, etc. |
Submit action: Updates trustee_meetings: held_on, status, quorum_met, attendees JSON, resolutions JSON. Audit-logged.
Related forms: Finalise Meeting Minutes (5.3) follows once minutes are drafted.
Form 5.3 — Finalise Meeting Minutes
Purpose: Marks the minutes as drafted, signed, and filed in custody. Who fills: Secretary; signed by chairperson; recorded by tenant-admin.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Meeting | FK (Trustee Meeting) | Yes | Status='held' | from page context | — |
| Drafted By (User) | FK (Users) | Yes | — | secretary | — |
| Minutes Signed On | Date | Yes | After Held On | today | Date chairperson signed |
| Minutes Custody | FK (Document Custody) | Yes | — | — | Where signed minutes original is filed |
| Linked AGM Filing | FK (Compliance Filing) | Conditional | Required if kind=AGM | auto-matched annual return | Cross-link to annual filing |
| Notes | Textarea | No | — | — | — |
Submit action: Sets minutes_drafted_by_user_id, minutes_signed_on, minutes_custody_id, related_filing_id. Audit-logged.
Related forms: AGM minutes link back to annual return filing.
Sub-module 6: Reminder Schedule
Form 6.1 — Reminder Schedule Configurator
Purpose: View and tune the auto-generated reminder schedule for a specific filing / renewal / engagement / meeting. Most users don't customise; this form is for one-off overrides (e.g. a specific filing needs an extra T-3 reminder). Who fills: Tenant-admin or responsible user.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Source Type | Dropdown | Yes | filing / renewal / audit-engagement / trustee-meeting | — | What this reminder is for |
| Source Reference | FK (varies by Source Type) | Yes | — | from page context | The specific row |
| Offset Days | Number | Yes | -365 to 30; negative = before due | -7 | E.g. -7 means "fire 7 days before due date" |
| Send At Time (tenant-local) | Time | Yes | HH:MM | 09:00 | Daylight-aware via tenant time_zone |
| Channels | Multi-select | Yes | email / whatsapp / postal | inherits from obligation | At least one required |
| Target User | FK (Users) | No | — | obligation default responsible | If set, overrides target_role |
| Target Role | Dropdown | No | tenant-admin / module-admin | tenant-admin | Used if Target User blank — broadcasts to all users with that role |
| Template Code | Text (64) | No | Comms-registered templates | auto-derived | e.g. compliance.filing.t-7 |
| Status | Dropdown | Yes | scheduled / cancelled | scheduled | Set "cancelled" to suppress |
Submit action: Creates or updates a reminder_schedules row. Idempotent — supersedes any prior schedule for the same (source, offset) tuple via status='superseded'.
Related forms: Cancel Reminder (6.2).
Form 6.2 — Cancel Scheduled Reminder
Purpose: Suppress a specific upcoming reminder without deleting the audit trail of having scheduled it. Who fills: Tenant-admin.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Reminder | FK (Reminder Schedule) | Yes | Status='scheduled' | from page context | — |
| Cancellation Reason | Textarea | Yes | min 20 chars | — | Visible in audit log |
Submit action: Sets status='cancelled'. Audit-logged.
Related forms: Reminder monitor UI surfaces cancelled rows in a separate filter.
Sub-module 7: Cross-cutting Calendar & Dashboards
Form 7.1 — Compliance Calendar Filter
Purpose: Configures the master calendar view — month/week/agenda toggle, regime filter, status filter. Who fills: Anyone with module-admin role and above.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| View Mode | Dropdown | Yes | month / week / agenda-list | month | — |
| Date Range | Date range | Yes | — | current month | — |
| Regimes | Multi-select | No | income-tax / fcra / gst / tds / state-renewal / safety / governance / internal | all | Calendar colour-coding |
| Statuses | Multi-select | No | upcoming / in-progress / filed / accepted / rejected / amended / lapsed | upcoming + in-progress + lapsed | Excludes filed/accepted by default to declutter |
| Branch | FK (Branches) | No | — | all | — |
| Responsible User | FK (Users) | No | — | all | — |
| Include Trustee Meetings | Checkbox | No | — | checked | — |
| Include Renewals | Checkbox | No | — | checked | — |
| Include Reminders | Checkbox | No | — | unchecked | Reminders are noisy — off by default |
Submit action: Reloads calendar (no DB write). Related forms: Each calendar event deep-links to filing / renewal / meeting detail.
(Module-wide workflow note: A single tenant's compliance year flows like this — at FY start (April), the global obligations seeded in 0015 plus any tenant-specific ones from Form 1.1 are scanned by the daily cron_plan job, which materialises 12 months of compliance_filings rows (Form 2.1 instances) and any due renewal_calendar entries (Form 3.1). Reminders auto-fire per the obligation's offsets — tenant-admins see them in email/WhatsApp and on the dashboard. As filings happen, the responsible user uses Form 2.2 to mark filed, then 2.3 to attach the ack scan. Renewals progress through 3.1 → 3.2 → 3.3, with the final step writing back to Statutory. Audit engagements go 4.1 → 4.2 once a year, gated on Vitta period-lock. Trustee meetings cycle 5.1 → 5.2 → 5.3 throughout the year. Every status flip, two-key cosign, and reminder dispatch is captured in the Audit Trail.)