Financial Management
Why this is a runtime problem, not a CRUD problem
Every growing business eventually collides with the same wall: journal entries live in a spreadsheet, supplier invoices live in email, bank reconciliation is a monthly fire drill, and nobody agrees on which number is correct. The root cause is not a missing screen — it is that double-entry bookkeeping is a constraint system, not a data store. Debits must equal credits before posting. A fiscal period must be open before an entry can land in it. A journal entry that was prepared by one accountant must not be posted by the same person. None of these rules fit neatly into a generic form builder.
A candid scope note. AuraBoot Finance covers the operational core: GL, AR, AP, journal approval workflows, supplier invoices with three-way matching, payment recording, bank reconciliation, expense claims, cost centers, and financial reporting. It is not a country-specific accounting compliance suite. It does not ship statutory chart-of-accounts for individual jurisdictions, built-in e-invoicing connectors for every country's tax authority, or localized VAT return filing. If your primary requirement is regulatory filing for a specific country, evaluate that gap honestly before choosing this solution. What AuraBoot provides is a clean, configurable operational layer on which country-specific compliance logic can be layered — either as your own plugin or via the optional tax-compliance plugin for supported regions.
With that scope clear: the full approval-and-posting pipeline is a command graph, not a hand-coded controller chain. The fiscal period lifecycle is a first-class state machine. Segregation of duties between preparers and approvers is enforced by the permission system — not by a comment in the code.
Data model summary
The Finance plugin ships 30 models across six functional areas:
- GL core:
fin_account(hierarchical chart of accounts, five account types),fin_fiscal_period(monthly periods with open / soft-close / hard-close / locked lifecycle),fin_journal_entry+fin_journal_line(double-entry vouchers with approval workflow),fin_gl_balance(period-aggregated debit/credit balances). - AR / AP:
fin_ar_transaction(customer receivables from shipments or manual invoices),fin_ap_transaction(vendor payables from receipts),fin_supplier_invoice+fin_supplier_invoice_line(supplier invoice capture),fin_three_way_match(PO vs receipt vs invoice matching with tolerance and hold resolution),fin_payment(payment / receipt records linked to AR / AP with auto-journal generation). - Expenses:
fin_expense_claim(employee reimbursement with draft / pending / approved / paid lifecycle). - Banking:
fin_bank_account,fin_bank_statement+fin_bank_statement_line,fin_reconciliation(statement-line-to-journal matching). - Multi-currency:
fin_currency(ISO 4217 master),fin_exchange_rate(rate history); all journal entries carry both transaction-currency and base-currency totals. - Cost accounting:
fin_cost_center,fin_cost_element,fin_cost_allocation_rule,fin_standard_cost,fin_cost_variance. - Reporting / KPI:
fin_report_template+fin_report_line,fin_financial_report,fin_voucher_template,fin_kpi_definition+fin_kpi_snapshot,fin_restatement.
Key commands
The solution ships over 60 commands. The journal entry state machine is the clearest illustration of the constraint enforcement:
| Command | Shape | Permission | Why it matters |
|---|---|---|---|
fin:create_journal_entry | Create | fin.financial.manage | Auto-generates entry number JE-{yyyyMMdd}-{seq}, sets status draft |
fin:submit_journal_entry | StateTransition | fin.financial.manage | draft / rejected → submitted; preparer initiates review |
fin:approve_journal_entry | StateTransition | fin.financial.admin | submitted → approved; requires separate role from submitter |
fin:post_journal_entry | StateTransition + handler | fin.financial.manage | Runs server-side handler: validates debit = credit, updates fin_gl_balance |
fin:reverse_journal_entry | StateTransition | fin.financial.admin | posted → voided; creates offsetting entry |
fin:approve_three_way_match | StateTransition | fin.financial.admin | Approves PO/receipt/invoice match; auto-creates AP transaction |
fin:reconcile_bank_statement | Action | fin.bank_recon.manage | Matches statement lines to journal entries; flags unmatched lines |
The fin:post_journal_entry command carries a handler field that invokes server-side Java logic. No amount of client-side validation replaces this: the handler is the only place that atomically validates balance and updates GL in the same transaction.
Invoice-to-payment lifecycle
Supplier Invoice arrives
|
v
[fin_supplier_invoice: draft]
|
submit
|
v
[submitted]
|
approve / reject
|
v
[approved] ──reject──> [rejected] ──resubmit──> [submitted]
|
v
Three-Way Match created (fin_three_way_match)
PO amount vs receipt amount vs invoice amount
|
within tolerance?
/ \
yes no
| |
v v
[match: approved] [match: hold] ──resolve hold──> [approved]
|
v
AP Transaction created (fin_ap_transaction)
|
v
Payment recorded (fin_payment)
|
v
Journal Entry auto-generated → posted to GL
Permission example
A realistic Finance team has at least two tensions to encode: separation of duties (the person who prepared a journal entry should not be the one who posts it) and team segmentation (AR staff should not see or touch AP transactions).
Segregation of duties — journal posting:
- Role
fin_accountantholdsfin.financial.manage— can create, submit, and post entries. - The approval step (
fin:approve_journal_entry) requiresfin.financial.admin. - In practice, companies configure the approval step as mandatory for any entry above a threshold and assign
fin.financial.adminonly to Finance Managers. The preparer can submit but cannot approve their own entry.
AR / AP team segregation:
- AR Specialist role:
fin.financial.read,fin.payment.manage(record receipts against AR) — nofin.supplier_invoice.manage, nofin.bank_recon.manage. - AP Specialist role:
fin.supplier_invoice.manage,fin.payment.manage(record payments against AP) — nofin.financial.admin(cannot approve or post GL entries).
Field-level cost-center masking:
- Cost Accountant role holds
fin.cost.readandfin.cost.manage— can seefin_cost_centerallocation rates and standard cost cards. - AR / AP roles do not hold
fin.cost.read— cost-center breakdown fields are hidden on their journal-line views.
All five permission layers (RBAC, org scope, ReBAC, ABAC, field-level) are evaluated in order by the same platform pipeline used in every other use case.
How to get it
- Community: install the plugin from source:
aura plugin publish plugins/finance --yes, then runaura exec fin:init_chart_of_accountsto seed a default chart of accounts. - Standard: white-label the platform and ship the Finance plugin as part of your vertical.
- Professional: get the Finance solution with pre-wired menus, roles, dashboards, and the optional
tax-complianceextension for supported regions. - Enterprise: same package plus managed period-close orchestration, country-specific compliance packs as separate verticals, advanced multi-entity consolidation, and SLA-backed support.
See Pricing for the full edition comparison.
Enterprise note — Managed period-close orchestration (automated soft-close checks, hard-close gate enforcement across entities, reconciliation completion gating), country-specific compliance packs (statutory chart-of-accounts, jurisdiction-level VAT return filing, e-invoicing bureau connectors) delivered as separately versioned verticals, and advanced multi-entity consolidation with intercompany elimination are commercial-only capabilities. The open-core GL / AR / AP / payment runtime described above is the same in every edition.
Next steps
- System overview — how plugins, commands, and the runtime fit together
- Command pipeline — the execution contract enforced by
fin:post_journal_entry - Permissions — the five-layer model used in the SoD and team-segregation examples above
- Plugin manifest — how the Finance plugin declares its 30 models and 60+ commands