2
📅

Compliance — Annual & Periodical — Forms

Renewal calendar · returns · audit tracking

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 email 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 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.)