Accounting Subledger
Understand the RAC accounting subledger, including events, balanced entries, COA mappings, summary journal posting, subledgers, reconciliation, credit notes, and payment allocations.
Accounting Subledger
The Accounting Subledger is the bridge between your Rent a Car operational system and your organization's general ledger or ERP. It captures every financially significant event, generates balanced double-entry accounting records, and produces summary journal batches ready for export to your external accounting system.
The RAC CRM operates as a subledger — it does not replace your general ledger. Operational detail lives here; summary journals are posted to your ERP.
Architecture Overview
The accounting module follows a strict data flow:
Operational Transaction
→ AccountingEvent (immutable record)
→ AccountingEntry + AccountingEntryLine (balanced debits/credits)
→ Subledger Entries (customer, contract, deposit, corporate)
→ AccountingPostingBatch (summary grouping)
→ Export / ERP Integration
→ ReconciliationEvery step is auditable. No accounting record can be directly edited — corrections are made via reversal entries.
Accounting Events
An accounting event is an immutable record created whenever a financially significant action occurs. Events are the single source of truth for all downstream accounting entries.
Complete Event Type Reference
| # | Event Code | Description | Typical Debit Account | Typical Credit Account |
|---|---|---|---|---|
| 1 | invoice_issued | Invoice generated and sent to customer | Accounts Receivable | Rental Revenue |
| 2 | payment_received | Customer payment recorded | Cash/Bank | Accounts Receivable |
| 3 | payment_reversed | Payment voided or reversed | Accounts Receivable | Cash/Bank |
| 4 | payment_allocated | Payment allocated to specific invoices | Accounts Receivable (allocated) | Accounts Receivable (general) |
| 5 | deposit_collected | Security deposit captured from customer | Security Deposit Holding | Customer Deposit Liability |
| 6 | deposit_released | Security deposit returned to customer | Customer Deposit Liability | Security Deposit Holding |
| 7 | deposit_forfeited | Security deposit kept due to charges | Customer Deposit Liability | Damage/Fine Revenue |
| 8 | deposit_adjusted_to_invoice | Deposit applied against outstanding invoice | Customer Deposit Liability | Accounts Receivable |
| 9 | credit_note_issued | Credit note applied to customer balance | Rental Revenue (contra) | Accounts Receivable |
| 10 | refund_approved | Refund approved for processing | Accounts Receivable | Refund Liability |
| 11 | refund_paid | Refund sent to customer | Refund Liability | Cash/Bank |
| 12 | damage_charge_approved | Damage charge approved and billed | Accounts Receivable | Damage Revenue |
| 13 | fine_charged_to_customer | Traffic fine passed through to customer | Accounts Receivable | Fine Revenue |
| 14 | salik_charged_to_customer | Salik toll charge passed through | Accounts Receivable | Salik Revenue |
| 15 | writeoff_approved | Uncollectible balance written off | Bad Debt Expense | Accounts Receivable |
| 16 | accounting_reversal_approved | Reversal entry for a prior posting | Varies (reversal of original) | Varies (reversal of original) |
Events are created at the exact moment of the operational action and are never deleted or modified. If an error is found, a new reversal event is created instead.
Balanced Entry Generation
Every accounting entry produced by the system must be balanced — total debits must equal total credits. This is enforced at the database level.
Entry Structure
An accounting entry consists of a header and one or more lines:
| Field | Description |
|---|---|
| Entry ID | Unique identifier (UUID) |
| Event ID | Link to the originating accounting event |
| Entry Date | Date the entry is recorded |
| Tenant ID | Tenant ownership for multi-tenant isolation |
| Business Unit ID | Business unit / cost center |
| Branch ID | Branch where the transaction occurred |
| Currency | Transaction currency (default AED) |
| Status | draft, validated, approved, posted, reversed |
| Total Debit | Sum of all debit line amounts |
| Total Credit | Sum of all credit line amounts |
Each line includes:
| Field | Description |
|---|---|
| Account Code | Chart of Account code (from COA mapping) |
| Debit Amount | Debit value (0 if credit) |
| Credit Amount | Credit value (0 if debit) |
| Description | Human-readable description |
| Cost Center | Optional cost center override |
| Tax Code | VAT/tax code if applicable |
If a COA mapping is missing for a transaction type, the system routes the amount to a configured Suspense Account and flags the entry as exception. The accounting team must resolve these exceptions before the posting batch can be approved.
Chart of Account (COA) Mappings
COA mappings translate operational transaction types into the chart of accounts used by your ERP. Each tenant configures their own COA mapping.
COA Mapping Table Structure
| Field | Description |
|---|---|
| Tenant ID | Which tenant this mapping belongs to |
| Transaction Type | The event code (e.g., invoice_issued) |
| Direction | debit or credit |
| Account Code | GL account code in your ERP |
| Account Name | Human-readable name for reference |
| Cost Center | Default cost center (optional) |
| Tax Code | Default tax code (optional) |
| Is Active | Whether this mapping is currently in use |
Example COA Mapping Configuration
| Transaction Type | Direction | Account Code | Account Name | Cost Center |
|---|---|---|---|---|
invoice_issued | Debit | 1100-001 | Accounts Receivable | — |
invoice_issued | Credit | 4100-001 | Rental Revenue | CC-RENTAL |
payment_received | Debit | 1200-001 | Cash & Bank | — |
payment_received | Credit | 1100-001 | Accounts Receivable | — |
deposit_collected | Debit | 1300-001 | Security Deposit Holding | — |
deposit_collected | Credit | 2100-001 | Customer Deposit Liability | — |
damage_charge_approved | Debit | 1100-001 | Accounts Receivable | — |
damage_charge_approved | Credit | 4200-001 | Damage Revenue | CC-OPS |
fine_charged_to_customer | Debit | 1100-001 | Accounts Receivable | — |
fine_charged_to_customer | Credit | 4300-001 | Fine Revenue | CC-OPS |
writeoff_approved | Debit | 5100-001 | Bad Debt Expense | CC-FIN |
writeoff_approved | Credit | 1100-001 | Accounts Receivable | — |
Before the first posting batch can be generated, all required COA mappings must be configured. Navigate to Settings → Accounting → COA Mappings to complete this setup.
Summary Journal Posting Batches
Posting batches group validated accounting entries into summary journals for ERP export. This reduces the volume of data sent to your external system.
Posting Batch Lifecycle
| Status | Description | Who |
|---|---|---|
| Generated | Batch created by the system from approved entries | System (scheduled or manual trigger) |
| Validated | All entries balanced, no exceptions, no duplicates | System (auto on generation) |
| Pending Approval | Awaiting finance manager approval | System (auto after validation) |
| Approved | Approved for export | Finance manager (accounting:approve_posting_batch) |
| Exported | Export file generated or API call made | System (auto on approval) or manual |
| Acknowledged | ERP confirmed receipt | System (webhook) or manual confirmation |
Exception Statuses
| Status | Meaning | Action Required |
|---|---|---|
| Failed | Export failed (API error, file error) | Investigate and retry |
| Partially Failed | Some lines exported, some failed | Resolve failed lines and retry |
| Reversed | Batch reversed via reversal entries | New batch replaces this one |
| Cancelled | Batch cancelled before export | Entries return to unbatched pool |
Batch Summary Grouping
Summary journal lines group transactions by:
- Tenant — Always separated by tenant
- Business Unit — Grouped by cost center / business unit
- Branch — Grouped by branch
- Posting Date — Grouped by accounting date
- Currency — Grouped by transaction currency
- Account Code — Aggregated by GL account
- Tax Code — Separated by tax treatment
Step-by-Step: Generate and Export a Posting Batch
Navigate to Accounting → Posting Batches — View existing batches or create a new one.
Click "Generate Batch" — Select the date range for entries to include.
Review validation results — The system shows total entries, total debit/credit, and any exceptions.
Submit for approval — The batch moves to Pending Approval.
Manager reviews and approves — The finance manager opens the batch, reviews summary lines, and clicks Approve.
Export — The system generates the export file (CSV, Excel, JSON, or API push). Download or auto-transmit to ERP.
Acknowledge — Once the ERP confirms receipt, mark the batch as Acknowledged.
Subledgers
The system maintains four subledger types that provide detailed transaction histories for specific entity categories.
Customer Subledger
Shows all financial activity for a specific customer across all contracts and invoices.
| Field | Description |
|---|---|
| Customer ID | The customer's unique identifier |
| Transaction Date | Date of the financial event |
| Event Type | The accounting event code |
| Reference Document | Invoice number, payment reference, etc. |
| Debit Amount | Amount debited |
| Credit Amount | Amount credited |
| Running Balance | Outstanding balance for this customer |
| Contract Reference | Related contract number (if applicable) |
Contract Subledger
Tracks all financial entries tied to a specific rental contract.
| Field | Description |
|---|---|
| Contract ID | The contract's unique identifier |
| Transaction Date | Date of the financial event |
| Event Type | The accounting event code |
| Line Item | Specific invoice line (if applicable) |
| Debit Amount | Amount debited |
| Credit Amount | Amount credited |
| Running Balance | Net financial position of this contract |
Deposit Subledger
Tracks security deposit activity per deposit record.
| Field | Description |
|---|---|
| Deposit ID | The deposit's unique identifier |
| Transaction Date | Date of the financial event |
| Event Type | deposit_collected, deposit_released, deposit_forfeited, etc. |
| Amount | Transaction amount |
| Running Balance | Current held deposit amount |
| Related Invoice | Invoice linked to forfeiture or adjustment |
Corporate Subledger
Tracks financial activity for corporate accounts, including monthly billing batches.
| Field | Description |
|---|---|
| Corporate Account ID | The corporate account identifier |
| Transaction Date | Date of the financial event |
| Contract References | All contracts billed under this corporate account |
| Monthly Summary | Aggregated monthly charges |
| Payment History | Payments received against corporate invoices |
| Outstanding Balance | Total amount due from corporate account |
Reconciliation
Reconciliation ensures that the accounting subledger is consistent, complete, and accurate. The system supports several reconciliation views.
Reconciliation Types
| Type | What It Checks | Resolution |
|---|---|---|
| Generated but unposted entries | Entries created but not yet in a posting batch | Generate a new batch or investigate |
| Failed/partially failed batches | Export errors or partial completions | Retry failed lines or create new batch |
| Customer balance formula | Σ(invoices) − Σ(payments) − Σ(credit notes) = customer balance | Adjust entries or issue credit notes |
| Contract balance formula | Σ(line items) − Σ(allocations) = contract balance | Verify all charges are invoiced |
| Deposit liability | Σ(held deposits) = deposit liability account balance | Release or forfeit stale deposits |
| Payment clearing | Gateway settlements match recorded payments | Investigate discrepancies |
| Exported batch acknowledgement | All exported batches acknowledged by ERP | Re-export or contact ERP admin |
| Duplicate posting prevention | No duplicate entries for same event | Remove duplicates via reversal |
Reconciliation should be run at least weekly. Navigate to Accounting → Reconciliation to view the reconciliation dashboard and run checks.
Payment Allocations
Payments can be allocated across multiple invoices, and a single invoice can receive multiple payments.
Allocation Rules
- One payment may settle multiple invoices
- One invoice may have multiple payments applied
- Partial allocations are supported
- Allocations are tracked in the customer subledger
- Allocation reversals require permission and create an audit trail
Step-by-Step: Allocate a Payment Across Invoices
Open the payment record — Navigate to the payment from the customer's financial history.
Click "Allocate" — The system shows all open invoices for this customer.
Select invoices — Check the invoices to allocate against. The system auto-fills amounts.
Adjust amounts — Override auto-filled amounts for partial allocations.
Confirm allocation — The system creates allocation entries and updates invoice statuses.
Write-Offs
Write-offs are used to clear uncollectible balances. They require approval and create an audit trail.
Write-Off Lifecycle
| Status | Description |
|---|---|
| Draft | Write-off request created |
| Pending Approval | Submitted for manager approval |
| Approved | Write-off approved by authorized manager |
| Posted | Accounting entry generated and included in next posting batch |
Write-offs above the tenant-configured threshold require senior finance manager approval. All write-offs create an writeoff_approved accounting event and are fully auditable.
Required Permissions
| Action | Permission Code |
|---|---|
| View accounting entries | accounting:read |
| Configure COA mappings | accounting:configure |
| Generate accounting entries | accounting:generate_entries |
| Validate entries | accounting:validate_entries |
| Approve entries | accounting:approve_entries |
| Generate posting batch | accounting:generate_posting_batch |
| Approve posting batch | accounting:approve_posting_batch |
| Export posting batch | accounting:export_posting_batch |
| Acknowledge posting batch | accounting:acknowledge_posting_batch |
| Reverse an entry | accounting:reverse_entry |
| View reconciliation | accounting:view_reconciliation |
| Close accounting period | accounting:close_period |
| Create credit note | credit_note:create |
| Approve credit note | credit_note:approve |
| Issue credit note | credit_note:issue |
| Read subledger | subledger:read |
| Export subledger | subledger:export |
| Create write-off request | writeoff:create |
| Approve write-off | writeoff:approve |
| Post write-off | writeoff:post |
Related Pages
- Invoicing & Billing — How invoices trigger accounting events
- Traffic Fines & Salik — Fine and Salik accounting events
- Damage Charges — Damage assessment accounting flow
Invoicing & Billing
Create invoices, record payments, manage security deposits, issue credit notes, and process refunds across the rental lifecycle.
Traffic Fines & Salik
Record traffic fines and Salik toll charges, match them to contracts, bill customers, track payments, and reconcile with authorities.