RFC 003 β Finance Library: Architecture, Doctypes & API
- Status: Accepted
- Author(s): Aditya Lohumi
- Created: 2026-02-26
- Updated: 2026-02-26
- TSC Decision: Accepted (2026-02-26)
- Supersedes: β
- Superseded by: β
1. Context & Motivation
Section titled β1. Context & MotivationβThe finance library (libs/finance) is a shared Python library that provides the complete Finance & Accounts (F&A) domain model for the business-m monorepo. It replaces the legacy F&A module and supports accounting workflows for large enterprises and public-sector organisations, including:
- Imprest / petty cash management
- Bank reconciliation
- Budget control against account heads and cost centres
- Supplier bills, debit/credit notes, payment vouchers
- General ledger entries and period closing
- Fixed asset tracking (Fixed Asset Register) with depreciation
- Employee expense claims (Travel, Daily Allowance & Other)
- Earnest Money Deposit (EMD) management
- Financial reporting via
m-ledger
All GL postings flow through the m-ledger Book-Keeper service, keeping the finance library transactional but not directly responsible for ledger I/O.
2. Dependency Graph
Section titled β2. Dependency Graphβfinance-libβββ framework-m (DocType, Field, Controller, BaseController)βββ m-core (Party, Supplier, Customer, Employee, Address)βββ m-invoice (PurchaseInvoice, SalesInvoice)βββ m-india (GST / TDS compliance, HSNCode)βββ m-ledger (Book-Keeper β all GL postings)βββ m-imprest (Petty cash / imprest workflow)βββ citadel / iam (Authentication & authorisation)3. Framework Conventions
Section titled β3. Framework ConventionsβAll doctypes extend framework_m.DocType and use framework_m.Field for field declarations. Business logic lives in per-doctype Controller classes that extend framework_m.Controller[T].
3.1 DocType Meta class
Section titled β3.1 DocType Meta classβEvery doctype carries a Meta inner class with the following flags:
| Flag | Default | Meaning |
|---|---|---|
requires_auth |
False |
Whether requests require a valid auth token (dev off) |
apply_rls |
False |
Row-level security enforcement |
naming_rule |
"autoincrement" |
Primary-key strategy |
is_submittable |
varies | Whether the document has a submit/cancel lifecycle |
api_resource |
True |
Expose CRUD via the REST API |
show_in_desk |
True |
Show in the Desk UI sidebar |
permissions |
All β All | Role-based access map (production will restrict) |
3.2 Controller lifecycle hooks
Section titled β3.2 Controller lifecycle hooksβclass XxxController(Controller[Xxx]): doctype = Xxx
async def before_save(self, doc: Xxx) -> None: ... async def after_save(self, doc: Xxx) -> None: ... async def before_submit(self, doc: Xxx) -> None: ... async def after_submit(self, doc: Xxx) -> None: ... async def before_cancel(self, doc: Xxx) -> None: ... async def after_cancel(self, doc: Xxx) -> None: ... async def after_naming(self, doc: Xxx) -> None: ... # optimistic naming3.3 Child Tables
Section titled β3.3 Child TablesβParentβchild relationships are modelled with a list[ChildDocType] field on the parent and parent: str / parent_type: str fields on the child. The child doctype has show_in_desk: False and is_submittable: False.
4. Doctype Catalogue
Section titled β4. Doctype CatalogueβPhase 00 β Foundation
Section titled βPhase 00 β Foundationβ4.1 Company
Section titled β4.1 CompanyβRepresents the legal entity for which accounts are maintained.
File: doctypes/company/doctype.py
| Field | Type | Notes |
|---|---|---|
name |
str |
Company Name (PK) |
abbr |
str(2β5) |
Short abbreviation |
default_currency |
str |
Base currency code (e.g., INR) |
chart_of_accounts_template |
`str | None` |
Meta: is_submittable=False, api_resource=True, show_in_desk=True
Controller: Stub (before_save, after_save).
4.2 FiscalYear
Section titled β4.2 FiscalYearβFinancial year definition (e.g., βFY 2026-27β, AprilβMarch).
File: doctypes/fiscal_year/doctype.py
| Field | Type | Notes |
|---|---|---|
name |
str |
Human-readable name (PK) |
start_date |
datetime |
Timezone-aware start datetime |
end_date |
datetime |
Timezone-aware end datetime |
is_closed |
bool |
False until explicitly closed |
Note: Dates must be timezone-aware
datetimeobjects, not naive strings. See Β§10 β Decision 5.
Meta: is_submittable=False
Controller: Stub.
4.3 AccountingPeriod
Section titled β4.3 AccountingPeriodβMonthly or quarterly sub-periods within a
FiscalYear, used to gate GL postings.
File: doctypes/accounting_period/doctype.py
| Field | Type | Notes |
|---|---|---|
name |
str |
Period label (e.g., βQ1 2026β) |
fiscal_year |
str |
FK β FiscalYear |
start_date |
datetime |
Timezone-aware start datetime |
end_date |
datetime |
Timezone-aware end datetime |
is_closed |
bool |
When True, postings are blocked |
Meta: is_submittable=False
Controller: Stub. Future: validate overlapping periods on before_save.
Phase 01 β F&A Masters
Section titled βPhase 01 β F&A Mastersβ4.4 Account
Section titled β4.4 AccountβGeneral ledger account. Supports tree structure (group/leaf) via
parent_account. Syncs withm-ledgerautomatically onafter_savewith a manual fallback action on failure.
File: doctypes/account/doctype.py
| Field | Type | Notes |
|---|---|---|
name |
str |
Account Name (PK) |
account_type |
str |
`Asset |
parent_account |
`str | None` |
is_group |
bool |
True = folder node, False = leaf (postable) |
company |
str |
FK β Company |
ledger_account_id |
`str | None` |
Meta: is_submittable=False
Controller: See Β§10 β Decision 1. Sync to Book-Keeper on after_save; if sync fails, surface a manual βSync to Ledgerβ action.
4.5 CostCenter
Section titled β4.5 CostCenterβDepartmental or project-based cost allocation node. Supports tree structure via
parent_cost_center.
File: doctypes/cost_center/doctype.py
| Field | Type | Notes |
|---|---|---|
name |
str |
Cost Center Name (PK) |
company |
str |
FK β Company |
parent_cost_center |
`str | None` |
is_group |
bool |
Tree group indicator |
Meta: is_submittable=False
Controller: Stub.
4.6 FinanceSupplier
Section titled β4.6 FinanceSupplierβ1-to-1 financial extension of
m-coreβsSupplier. Holds payment terms, default expense account, and Tax ID.
File: doctypes/finance_supplier/doctype.py
| Field | Type | Notes |
|---|---|---|
supplier |
str |
FK β m-core.Supplier |
company |
str |
FK β Company |
tax_id |
`str | None` |
payment_terms |
`str | None` |
default_expense_account |
`str | None` |
Meta: is_submittable=False
Controller: Stub.
4.7 FinanceCustomer
Section titled β4.7 FinanceCustomerβ1-to-1 financial extension of
m-coreβsCustomer. Holds credit limit, default income account, and Tax ID.
File: doctypes/finance_customer/doctype.py
| Field | Type | Notes |
|---|---|---|
customer |
str |
FK β m-core.Customer |
company |
str |
FK β Company |
tax_id |
`str | None` |
credit_limit |
float |
Maximum outstanding (0 = unlimited) |
default_income_account |
`str | None` |
Meta: is_submittable=False
Controller: Stub. Future: enforce credit_limit on invoice submission.
Phase 03 β Bank & Reconciliation
Section titled βPhase 03 β Bank & Reconciliationβ4.8 BankAccount
Section titled β4.8 BankAccountβMaster record for a companyβs bank account. Links to a GL
Accountfor ledger posting.
File: doctypes/bank_account/doctype.py
| Field | Type | Notes |
|---|---|---|
account_name |
str |
Human label (e.g., βSBI Currentβ) |
bank_name |
str |
e.g., βState Bank of Indiaβ |
account_number |
str |
Unique bank account number |
ifsc_code |
`str | None` |
branch |
`str | None` |
company |
str |
FK β Company |
gl_account |
`str | None` |
is_active |
bool |
Soft-delete flag |
Meta: is_submittable=False
4.9 BankStatement
Section titled β4.9 BankStatementβRepresents an uploaded bank statement for a period. Contains a child table of transaction entries.
File: doctypes/bank_statement/doctype.py
| Field | Type | Notes |
|---|---|---|
statement_number |
str(β€50) |
Unique statement reference |
bank_account |
str |
FK β BankAccount |
from_date |
date |
Period start |
to_date |
date |
Period end |
opening_balance |
Decimal |
Opening balance |
closing_balance |
Decimal |
Closing balance |
status |
str |
`Draft |
entries |
list[BankStatementEntry] |
Child table |
Meta: is_submittable=True
4.10 BankStatementEntry (Child)
Section titled β4.10 BankStatementEntry (Child)β| Field | Type | Notes |
|---|---|---|
parent |
str |
FK β BankStatement |
parent_type |
str |
"BankStatement" |
txn_date |
date |
Transaction date |
description |
str |
Narration from bank |
debit |
Decimal |
Debit amount |
credit |
Decimal |
Credit amount |
balance |
`Decimal | None` |
reference_number |
`str | None` |
is_reconciled |
bool |
Matched with a GL entry |
gl_entry |
`str | None` |
Meta: is_submittable=False, show_in_desk=False
4.11 BankReconciliation
Section titled β4.11 BankReconciliationβ| Field | Type | Notes |
|---|---|---|
reconciliation_number |
str(β€50) |
Unique reconciliation reference |
bank_account |
str |
FK β BankAccount |
reconciliation_date |
date |
As-of date |
bank_statement |
str|None |
FK β BankStatement |
statement_balance |
Decimal |
Balance per bank statement |
gl_balance |
Decimal |
Balance per GL |
difference |
Decimal |
Unreconciled difference |
status |
str |
`Draft |
Meta: is_submittable=True
Phase 04 β Budget Management
Section titled βPhase 04 β Budget Managementβ4.12 Budget
Section titled β4.12 Budgetβ| Field | Type | Notes |
|---|---|---|
budget_number |
str(β€50) |
Unique budget reference |
company |
str |
FK β Company |
fiscal_year |
str |
FK β FiscalYear |
cost_center |
`str | None` |
account |
str |
FK β Account (account head) |
allocated_amount |
Decimal |
Budget ceiling |
utilized_amount |
Decimal |
Auto-computed from GL postings |
status |
str |
`Active |
Meta: is_submittable=True
See Β§10 β Decision 2. Budget validation raises a warning by default; configurable to hard-block via FinanceSettings.
4.13 BudgetRevision
Section titled β4.13 BudgetRevisionβ| Field | Type | Notes |
|---|---|---|
revision_number |
str(β€50) |
Unique revision reference |
budget |
str |
FK β Budget |
revised_date |
date |
Date of revision |
previous_amount |
Decimal |
Amount before |
revised_amount |
Decimal |
Amount after |
reason |
str |
Mandatory justification |
status |
str |
`Draft |
Meta: is_submittable=True
Phase 05 β Bills & Payments
Section titled βPhase 05 β Bills & Paymentsβ4.14 PaymentVoucher
Section titled β4.14 PaymentVoucherβ| Field | Type | Notes |
|---|---|---|
voucher_number |
str(β€50) |
Unique PV reference |
company |
str |
FK β Company |
payment_date |
date |
Date of payment |
payment_type |
str |
"Outgoing" (default) |
party_type |
str |
`Supplier |
party |
str |
FK β party record |
paid_from_account |
str |
FK β Account (Debit β Bank/Cash) |
paid_to_account |
str |
FK β Account (Credit β Payable) |
amount |
Decimal |
Payment amount |
bank_account |
`str | None` |
reference_number |
`str | None` |
reference_date |
`date | None` |
narration |
`str | None` |
cost_center |
`str | None` |
status |
str |
`Draft |
Meta: is_submittable=True
4.15 PaymentReceipt
Section titled β4.15 PaymentReceiptβ| Field | Type | Notes |
|---|---|---|
receipt_number |
str(β€50) |
Unique receipt reference |
company |
str |
FK β Company |
receipt_date |
date |
Date of receipt |
party_type |
str |
Customer |
party |
str |
FK β m-core.Customer |
received_in_account |
str |
FK β Account (Debit β Bank/Cash) |
paid_from_account |
str |
FK β Account (Credit β Receivable) |
amount |
Decimal |
Receipt amount |
bank_account |
`str | None` |
reference_number |
`str | None` |
reference_date |
`date | None` |
narration |
`str | None` |
cost_center |
`str | None` |
status |
str |
`Draft |
Meta: is_submittable=True
4.16 DebitNote
Section titled β4.16 DebitNoteβ| Field | Type | Notes |
|---|---|---|
note_number |
str(β€50) |
Unique debit note reference |
company |
str |
FK β Company |
posting_date |
date |
Posting date |
supplier |
str |
FK β m-core.Supplier |
account |
str |
FK β Account (Supplier Payable) |
amount |
Decimal |
Note amount |
reason |
str |
Narration / reason |
purchase_invoice |
`str | None` |
status |
str |
`Draft |
Meta: is_submittable=True
4.17 CreditNote
Section titled β4.17 CreditNoteβ| Field | Type | Notes |
|---|---|---|
note_number |
str(β€50) |
Unique credit note reference |
company |
str |
FK β Company |
posting_date |
date |
Posting date |
customer |
str |
FK β m-core.Customer |
account |
str |
FK β Account (Customer Receivable) |
amount |
Decimal |
Note amount |
reason |
str |
Narration / reason |
sales_invoice |
`str | None` |
status |
str |
`Draft |
Meta: is_submittable=True
Phase 06 β General Ledger
Section titled βPhase 06 β General Ledgerβ4.18 JournalEntry
Section titled β4.18 JournalEntryβ| Field | Type | Notes |
|---|---|---|
entry_number |
str(β€50) |
Unique JE reference |
company |
str |
FK β Company |
posting_date |
date |
Posting date |
entry_type |
str |
`Journal Entry |
narration |
str |
Document-level narration |
total_debit |
Decimal |
Sum of debit legs (auto-computed) |
total_credit |
Decimal |
Sum of credit legs (auto-computed) |
status |
str |
`Draft |
accounts |
list[JournalEntryAccount] |
Child table β ledger legs |
Meta: is_submittable=True β See Β§10 β Decision 4.
4.19 JournalEntryAccount (Child)
Section titled β4.19 JournalEntryAccount (Child)β| Field | Type | Notes |
|---|---|---|
parent |
str |
FK β JournalEntry |
parent_type |
str |
"JournalEntry" |
account |
str |
FK β Account |
party_type |
`str | None` |
party |
`str | None` |
cost_center |
`str | None` |
debit |
Decimal |
Debit amount |
credit |
Decimal |
Credit amount |
user_remark |
`str | None` |
Meta: is_submittable=False, show_in_desk=False
4.20 PeriodClosingVoucher
Section titled β4.20 PeriodClosingVoucherβ| Field | Type | Notes |
|---|---|---|
voucher_number |
str(β€50) |
Unique PCV reference |
company |
str |
FK β Company |
posting_date |
date |
Closing date |
fiscal_year |
str |
FK β FiscalYear being closed |
period_year_end_date |
date |
Fiscal year end date |
closing_account |
str |
FK β Account (Retained Earnings) |
net_pl_amount |
Decimal |
Net P&L transferred |
status |
str |
`Draft |
Meta: is_submittable=True
Phase 07 β Employee Expense Claims
Section titled βPhase 07 β Employee Expense Claimsβ4.21 ExpenseClaim
Section titled β4.21 ExpenseClaimβ| Field | Type | Notes |
|---|---|---|
claim_number |
str(β€50) |
Unique claim reference |
company |
str |
FK β Company |
employee |
str |
FK β m-core.Employee |
claim_date |
date |
Date claim was raised |
claim_type |
str |
`Travel |
cost_center |
`str | None` |
total_claimed_amount |
Decimal |
Auto-summed from child rows |
total_approved_amount |
Decimal |
Approver-filled |
narration |
`str | None` |
status |
str |
`Draft |
expenses |
list[ExpenseClaimDetail] |
Child table |
Meta: is_submittable=True
Multi-level approval (Department Head β Finance) is delegated to the Framework M WorkflowProtocol β See Β§10 β Decision 7.
4.22 ExpenseClaimDetail (Child)
Section titled β4.22 ExpenseClaimDetail (Child)β| Field | Type | Notes |
|---|---|---|
parent |
str |
FK β ExpenseClaim |
parent_type |
str |
"ExpenseClaim" |
expense_date |
date |
Date of expense |
description |
str |
Expense description |
expense_type |
str |
`Travel |
amount |
Decimal |
Claimed amount |
is_approved |
bool |
Approver decision per line |
approved_amount |
Decimal |
Approved amount |
Meta: is_submittable=False, show_in_desk=False
Phase 08 β Fixed Asset Register
Section titled βPhase 08 β Fixed Asset Registerβ4.23 AssetCategory
Section titled β4.23 AssetCategoryβ| Field | Type | Notes |
|---|---|---|
category_name |
str |
Unique category name |
depreciation_method |
str |
SLM (Straight Line) or WDV (Written Down Value) |
total_useful_life |
int |
Useful life in years |
frequency_of_depreciation |
int |
Months per period (12=annual, 3=quarterly) |
depreciation_account |
str |
FK β Account (Depreciation Expense) |
accumulated_depreciation_account |
str |
FK β Account (Accumulated Depreciation) |
disposal_account |
str |
FK β Account (Gain/Loss on Disposal) |
Meta: is_submittable=False
4.24 Asset
Section titled β4.24 Assetβ| Field | Type | Notes |
|---|---|---|
asset_number |
str(β€50) |
Unique asset register number |
company |
str |
FK β Company |
asset_name |
str |
Description |
asset_category |
str |
FK β AssetCategory |
purchase_date |
date |
Date of purchase |
gross_purchase_amount |
Decimal |
Original cost |
salvage_value |
Decimal |
Expected scrap value |
current_value |
Decimal |
Book value (updated by depreciation) |
location |
`str | None` |
custodian |
`str | None` |
cost_center |
`str | None` |
is_active |
bool |
False when disposed |
disposal_date |
`date | None` |
Meta: is_submittable=True
4.25 AssetMovement
Section titled β4.25 AssetMovementβ| Field | Type | Notes |
|---|---|---|
movement_number |
str(β€50) |
Unique movement reference |
asset |
str |
FK β Asset |
movement_date |
date |
Date of movement |
from_location |
`str | None` |
to_location |
str |
Destination location |
from_custodian |
`str | None` |
to_custodian |
`str | None` |
purpose |
`str | None` |
reference |
`str | None` |
Meta: is_submittable=True
4.26 DepreciationSchedule
Section titled β4.26 DepreciationScheduleβ| Field | Type | Notes |
|---|---|---|
asset |
str |
FK β Asset |
schedule_date |
date |
Date depreciation should be posted |
depreciation_amount |
Decimal |
Depreciation for this period |
accumulated_depreciation |
Decimal |
Running total after posting |
book_value_after |
Decimal |
Net book value after posting |
is_depreciated |
bool |
True once JE has been posted |
journal_entry |
`str | None` |
Meta: is_submittable=False, show_in_desk=False
Depreciation batch execution is cron-driven, configurable via FinanceSettings β See Β§10 β Decision 6.
Phase 09 β Earnest Money Deposit
Section titled βPhase 09 β Earnest Money Depositβ4.27 EMDReceipt
Section titled β4.27 EMDReceiptβ| Field | Type | Notes |
|---|---|---|
receipt_number |
str(β€50) |
Unique EMD receipt reference |
company |
str |
FK β Company |
receipt_date |
date |
Date of receipt |
party_type |
str |
`Supplier |
party |
str |
FK β party record |
amount |
Decimal |
EMD amount received |
bank_account |
`str | None` |
reference_number |
`str | None` |
ref_number |
`str | None` |
status |
str |
`Held |
Meta: is_submittable=True
4.28 EMDRefund
Section titled β4.28 EMDRefundβ| Field | Type | Notes |
|---|---|---|
refund_number |
str(β€50) |
Unique refund reference |
emd_receipt |
str |
FK β EMDReceipt |
refund_date |
date |
Date of refund |
refund_amount |
Decimal |
Refund amount (β€ receipt amount) |
bank_account |
`str | None` |
reference_number |
`str | None` |
reason |
`str | None` |
status |
str |
`Draft |
Meta: is_submittable=True
5. REST API
Section titled β5. REST APIβAll doctypes with api_resource=True automatically expose standard CRUD endpoints:
GET /api/resource/{DocType}POST /api/resource/{DocType}GET /api/resource/{DocType}/{id}PUT /api/resource/{DocType}/{id}DELETE /api/resource/{DocType}/{id}For submittable doctypes:
POST /api/resource/{DocType}/{id}/submitPOST /api/resource/{DocType}/{id}/cancelChild doctypes (BankStatementEntry, JournalEntryAccount, ExpenseClaimDetail, DepreciationSchedule) are API-accessible but excluded from the Desk UI sidebar (show_in_desk=False).
6. Relationships Overview
Section titled β6. Relationships OverviewβCompany βββββββββββββββββββββββββββββββββββ β β ββ FiscalYear ββββ AccountingPeriod β ββ Account (tree, syncs to m-ledger) β ββ CostCenter (tree) β ββ BankAccount ββββ BankStatement ββββ BankStatementEntry β ββ BankReconciliation β ββ Budget ββββ BudgetRevision β ββ PaymentVoucher (party: Supplier | Employee) ββ PaymentReceipt (party: Customer) β ββ DebitNote (party: Supplier) β ββ CreditNote (party: Customer) β ββ JournalEntry ββββ JournalEntryAccountβ ββ PeriodClosingVoucher β ββ ExpenseClaim ββββ ExpenseClaimDetail β ββ Asset ββββ DepreciationSchedule (category: AssetCategory) β ββ AssetMovement β ββ EMDReceipt ββββ EMDRefund β
FinanceSupplier βββ m-core.SupplierFinanceCustomer βββ m-core.Customer7. Integration Points
Section titled β7. Integration Pointsβ| Dependency | How Used |
|---|---|
| m-ledger | All GL postings delegated to Book-Keeper. Finance doctypes create/cancel GL entries on submit/cancel. Account auto-syncs on after_save. |
| m-core | Supplier, Customer, Employee, Party sourced from m-core. Finance adds domain extensions. |
| m-invoice | PurchaseInvoice / SalesInvoice originate in m-invoice. DebitNote/CreditNote carry back-references. |
| m-india | GST/TDS compliance, HSNCode master. Tax IDs surfaced on finance party extensions. |
| m-imprest | Imprest workflows live in m-imprest; finance consumes settlements as GL entries. |
| citadel/iam | Auth and RBAC. requires_auth and apply_rls are False for development; hardened pre-launch. |
8. Controller Lifecycle β Planned Logic
Section titled β8. Controller Lifecycle β Planned Logicβ| DocType | before_save | after_submit |
|---|---|---|
Account |
β | Sync to Book-Keeper (auto, fallback: manual) |
JournalEntry |
Validate total_debit == total_credit | Push GL entries to Book-Keeper |
PaymentVoucher |
Budget check (warn / block) | Post GL: Dr paid_from, Cr paid_to |
PaymentReceipt |
β | Post GL: Dr received_in, Cr paid_from |
DebitNote |
β | Post GL reducing Supplier payable |
CreditNote |
β | Post GL reducing Customer receivable |
Budget |
β | Lock allocation; enable utilisation tracking |
BudgetRevision |
β | Update Budget.allocated_amount |
BankReconciliation |
Compute difference |
Transition bank statement to Reconciled |
Asset |
β | Auto-generate DepreciationSchedule rows |
AssetMovement |
β | Update Asset.location / custodian |
EMDReceipt |
β | Post GL: Dr Bank, Cr EMD Liability |
EMDRefund |
Validate refund β€ receipt amount | Post GL reversal; update receipt status |
ExpenseClaim |
Sum total from child rows | Post GL on Paid status |
PeriodClosingVoucher |
Compute net P&L from m-ledger | Post closing JE to retained earnings |
9. Financial Reports
Section titled β9. Financial ReportsβReports are generated dynamically from Book-Keeper data via m-ledger. No separate doctypes required.
| Report | Source |
|---|---|
| Trial Balance | m-ledger GL aggregation |
| Profit & Loss Statement | Income / Expense account totals |
| Balance Sheet | Asset / Liability / Equity totals |
| General Ledger Statement | Per-account GL entry list |
| Bank Reconciliation Statement | BankReconciliation view |
| Accounts Payable Aging | PaymentVoucher + invoice view |
| Accounts Receivable Aging | PaymentReceipt + invoice view |
10. Architectural Decisions (Resolved)
Section titled β10. Architectural Decisions (Resolved)β| # | Question | Decision |
|---|---|---|
| 1 | Should Account sync to m-ledger automatically or on manual action? |
Auto on after_save. If sync fails, surface a manual βSync to Ledgerβ action on the document. |
| 2 | Should budget validation block PaymentVoucher submission or warn? |
Warning by default; configurable to hard-block via a budget_enforcement_mode setting in FinanceSettings (warn | block). |
| 3 | When will requires_auth / apply_rls be hardened? |
Pre-launch. All flags flipped to True and proper role permissions set as a pre-production milestone gate. |
| 4 | Should JournalEntry.is_submittable be True? |
Yes. JournalEntry has full submit/cancel lifecycle enforced by the framework. |
| 5 | FiscalYear.start_date / end_date typed as str β should this be corrected? |
Yes. All date fields must use timezone-aware datetime objects. Naive strings are not allowed. This is a required fix before implementation. |
| 6 | How is DepreciationSchedule batch processing triggered? |
Cron-driven, configurable via FinanceSettings.depreciation_cron_schedule. |
| 7 | How is multi-level ExpenseClaim approval modelled? |
Delegated to WorkflowProtocol in Framework M. The controller integrates with the workflow abstraction; no custom approval state machine is built in the finance library. |