Skip to content

Loan GL Setup

Guide to the actual loan GL rule model used by the current loan runtime.

Navigation: Administration → Accounting → GL Posting Rules

Overview

Loan accounting now depends on three layers working together:

  1. loan-product account mappings
  2. loan-product GL rule bindings
  3. global LOAN_GL_RULE system-tag bindings

The runtime resolves a loan posting operation by tag key first, then prefers a matching product-bound rule header, then executes the detail handlers.

Required LOAN_GL_RULE Operations

OperationTag KeyProduct Bind?Notes
DisbursementDISBURSEYesAlways
Disbursement reversalDISBURSE_REVYesIf disbursement reversal is allowed
RepaymentREPAYMENTYesAlways
Repayment reversal familyREPAY_CASH_REV, REPAY_CASH_EXCESS_REV, REPAY_DEPOSIT_ACCOUNT_REV, REPAY_DEPOSIT_ACCOUNT_EXCESS_REV, REPAY_BANK_REV, REPAY_BANK_EXCESS_REV, REPAY_SPLIT_REVYesAll point to one repayment-reversal header
Interest accrualINT_ACCRUEYesAccrual products only
Interest accrual reversalINT_ACCRUE_REVYesAccrual products only
Interest capitalizationINT_CAPITALIZEYesCapitalized / compound products only
Interest capitalization reversalINT_CAPITALIZE_REVYesCapitalized / compound products only
Interest suspenseINT_SUSPENDYesInterest-bearing products with suspense handling
Interest suspense releaseINT_SUSPEND_RELEASEYesInterest-bearing products with suspense handling
ProvisionPROVISIONYesIf provisioning is enabled
Provision reversalPROVISION_REVYesIf provision reversal is supported
Write-offWRITEOFFYesIf write-off is allowed
Write-off reversalWRITEOFF_REVYesIf write-off reversal is supported
RecoveryRECOVERYYesIf written-off recovery is allowed
Recovery reversalRECOVERY_REVYesIf recovery reversal is supported
WaiverLOAN_WAIVERYesWAIVER is aliased to LOAN_WAIVER in tags
Waiver reversalWAIVER_REVYesIf waiver reversal is supported
RestructureRESTRUCTUREYesIf restructure has GL impact
Collateral-funded repaymentREPAY_COLLATERALOnly if usedSpecial collateral-disposal flow, not standard repayment

Product Account Mappings

These product mappings are the primary source of truth for core loan accounts:

  • coa_id
  • interest_receivable_coa_id
  • interest_income_coa_id
  • provision_expense_coa_id
  • provision_liability_coa_id
  • recovery_income_coa_id
  • writeoff_expense_coa_id

For fee and penalty income, runtime currently falls back to pricing-item account resolution because there are no dedicated product-level fee/penalty mappings yet.

Rule Headers, Detail Lines, and Handlers

All headers below should be posting_mode = SYSTEM.

1. LOAN.DISBURSE.SYSTEM via DISBURSE

Detail NameLine TypeNatureHandler / SourceAmount
DISBURSE DRDEBITDOMAIN_RESOLVEDLOAN_RECEIVABLE_RESOLVESYSTEM
DISBURSE CRCREDITDOMAIN_RESOLVEDCASH_BANK_RESOLVESYSTEM

2. LOAN.DISBURSE.REVERSAL.SYSTEM via DISBURSE_REV

Detail NameLine TypeNatureHandler / SourceAmount
LOAN.DISBURSE.REV.DR.FUNDDEBITDOMAIN_RESOLVEDCASH_BANK_RESOLVESYSTEM
LOAN.DISBURSE.REV.CR.RECVCREDITDOMAIN_RESOLVEDLOAN_RECEIVABLE_RESOLVESYSTEM

3. LOAN.REPAYMENT.SYSTEM via REPAYMENT

Detail NameLine TypeNatureHandler / SourceAmount
LOAN_REPAYMENT_SOURCE_DEBITDEBITDOMAIN_RESOLVEDLOAN_REPAYMENT_SOURCE_RESOLVESYSTEM
LOAN_REPAYMENT_SPLIT_CREDITCREDITDOMAIN_RESOLVEDLOAN_REPAYMENT_SPLITSYSTEM

4. LOAN.REPAYMENT.REVERSAL.SYSTEM via repayment-reversal tags

Bound to:

  • REPAY_CASH_REV
  • REPAY_CASH_EXCESS_REV
  • REPAY_DEPOSIT_ACCOUNT_REV
  • REPAY_DEPOSIT_ACCOUNT_EXCESS_REV
  • REPAY_BANK_REV
  • REPAY_BANK_EXCESS_REV
  • REPAY_SPLIT_REV
Detail NameLine TypeNatureHandler / SourceAmount
LOAN_REPAYMENT_REVERSAL_SPLIT_DEBITDEBITDOMAIN_RESOLVEDLOAN_REPAYMENT_SPLITSYSTEM
LOAN_REPAYMENT_REVERSAL_SOURCE_CREDITCREDITDOMAIN_RESOLVEDLOAN_REPAYMENT_SOURCE_RESOLVESYSTEM

5. LOAN.INT.ACCRUAL.SYSTEM via INT_ACCRUE

Detail NameLine TypeNatureHandler / SourceAmount
Interest Accrual DrDEBITDOMAIN_RESOLVEDINTEREST_RECEIVABLE_RESOLVESYSTEM
Interest accrual crCREDITDOMAIN_RESOLVEDINTEREST_INCOME_RESOLVESYSTEM

6. LOAN.INT.ACCRUE.REVERSAL.SYSTEM via INT_ACCRUE_REV

Detail NameLine TypeNatureHandler / SourceAmount
LOAN.INT.ACCRUE.REV.DR.INCDEBITDOMAIN_RESOLVEDINTEREST_INCOME_RESOLVESYSTEM
LOAN.INT.ACCRUE.REV.CR.RECVCREDITDOMAIN_RESOLVEDINTEREST_RECEIVABLE_RESOLVESYSTEM

7. LOAN.INT.CAPITALIZE.SYSTEM via INT_CAPITALIZE

Detail NameLine TypeNatureHandler / SourceAmount
LOAN.INT.CAP.DR.PRINCIPALDEBITDOMAIN_RESOLVEDINTEREST_CAPITALIZATION_RESOLVESYSTEM
LOAN.INT.CAP.CR.RECVCREDITDOMAIN_RESOLVEDINTEREST_CAPITALIZATION_RESOLVESYSTEM

8. LOAN.INT.CAPITALIZE.REVERSAL.SYSTEM via INT_CAPITALIZE_REV

Detail NameLine TypeNatureHandler / SourceAmount
LOAN.INT.CAP.REV.DR.RECVDEBITDOMAIN_RESOLVEDINTEREST_CAPITALIZATION_RESOLVESYSTEM
LOAN.INT.CAP.REV.CR.PRINCIPALCREDITDOMAIN_RESOLVEDINTEREST_CAPITALIZATION_RESOLVESYSTEM

9. LOAN.INT.SUSPEND via INT_SUSPEND

Detail NameLine TypeNatureHandler / SourceAmount
LOAN.INT.SUSP.DR.INCDEBITDOMAIN_RESOLVEDINTEREST_INCOME_RESOLVESYSTEM
LOAN.INT.SUSP.CR.RECVCREDITTAG_RESOLVEDSuspense receivable target configured on the rule/tag sideSYSTEM

10. LOAN.INT.SUSPEND.RELEASE via INT_SUSPEND_RELEASE

Detail NameLine TypeNatureHandler / SourceAmount
LOAN.INT.SUSP.REL.DR.SUSPDEBITTAG_RESOLVEDSuspense receivable target configured on the rule/tag sideSYSTEM
LOAN.INT.SUSP.REL.CR.INCCREDITDOMAIN_RESOLVEDINTEREST_INCOME_RESOLVESYSTEM

11. LOAN.PROVISION.SYSTEM via PROVISION

Detail NameLine TypeNatureHandler / SourceAmount
LOAN.PROVISION.DR.EXPDEBITDOMAIN_RESOLVEDLOAN_PROVISION_RESOLVESYSTEM
LOAN.PROVISION.CR.LIABCREDITDOMAIN_RESOLVEDLOAN_PROVISION_RESOLVESYSTEM

12. LOAN.PROVISION.REVERSAL.SYSTEM via PROVISION_REV

Detail NameLine TypeNatureHandler / SourceAmount
LOAN.PROVISION.REV.DR.LIABDEBITDOMAIN_RESOLVEDLOAN_PROVISION_RESOLVESYSTEM
LOAN.PROVISION.REV.CR.EXPCREDITDOMAIN_RESOLVEDLOAN_PROVISION_RESOLVESYSTEM

13. LOAN.WRITEOFF.SYSTEM via WRITEOFF

Detail NameLine TypeNatureHandler / SourceAmount
LOAN.WRITEOFF.DR.EXPDEBITDOMAIN_RESOLVEDLOAN_WRITEOFF_RESOLVESYSTEM
LOAN.WRITEOFF.CR.RECVCREDITDOMAIN_RESOLVEDLOAN_WRITEOFF_RESOLVESYSTEM

14. LOAN.WRITEOFF.REVERSAL.SYSTEM via WRITEOFF_REV

Detail NameLine TypeNatureHandler / SourceAmount
LOAN.WRITEOFF.REV.DR.RECVDEBITDOMAIN_RESOLVEDLOAN_WRITEOFF_RESOLVESYSTEM
LOAN.WRITEOFF.REV.CR.EXPCREDITDOMAIN_RESOLVEDLOAN_WRITEOFF_RESOLVESYSTEM

15. LOAN.RECOVERY.SYSTEM via RECOVERY

Detail NameLine TypeNatureHandler / SourceAmount
LOAN.RECOVERY.DR.SETTLEMENTDEBITDOMAIN_RESOLVEDLOAN_RECOVERY_RESOLVESYSTEM
LOAN.RECOVERY.CR.INCOMECREDITDOMAIN_RESOLVEDLOAN_RECOVERY_RESOLVESYSTEM

16. LOAN.RECOVERY.REVERSAL.SYSTEM via RECOVERY_REV

Detail NameLine TypeNatureHandler / SourceAmount
LOAN.RECOVERY.REV.DR.INCOMEDEBITDOMAIN_RESOLVEDLOAN_RECOVERY_RESOLVESYSTEM
LOAN.RECOVERY.REV.CR.SETTLEMENTCREDITDOMAIN_RESOLVEDLOAN_RECOVERY_RESOLVESYSTEM

17. LOAN.WAIVER.SYSTEM via LOAN_WAIVER

LOAN_WAIVER_RESOLVE is detail-name-sensitive. Use these names exactly.

Detail NameLine TypeNatureHandler / SourceAmount
LOAN.WAIVER.DR.IMPACTDEBITDOMAIN_RESOLVEDLOAN_WAIVER_RESOLVESYSTEM
LOAN.WAIVER.CR.CONTROLCREDITDOMAIN_RESOLVEDLOAN_WAIVER_RESOLVESYSTEM

18. LOAN.WAIVER.REVERSAL.SYSTEM via WAIVER_REV

Use these names exactly.

Detail NameLine TypeNatureHandler / SourceAmount
LOAN.WAIVER.REV.DR.CONTROLDEBITDOMAIN_RESOLVEDLOAN_WAIVER_RESOLVESYSTEM
LOAN.WAIVER.REV.CR.IMPACTCREDITDOMAIN_RESOLVEDLOAN_WAIVER_RESOLVESYSTEM

19. LOAN.RESTRUCTURE.SYSTEM via RESTRUCTURE

Detail NameLine TypeNatureHandler / SourceAmount
LOAN.RESTRUCTURE.DR.PRINCIPALDEBITDOMAIN_RESOLVEDINTEREST_CAPITALIZATION_RESOLVESYSTEM
LOAN.RESTRUCTURE.CR.INTERESTCREDITDOMAIN_RESOLVEDINTEREST_CAPITALIZATION_RESOLVESYSTEM

Note: current source does not have a separate RESTRUCTURE_REV tag/op. Restructure reversal is not a first-class GL operation today the way repayment, write-off, recovery, waiver, accrual, and capitalization reversals are.

Dynamic Handlers

Handler CodeWhat it resolvesPrimary source
LOAN_RECEIVABLE_RESOLVEPrincipal receivable/control sideloan_product.coa_id plus borrower sub-ledger context
CASH_BANK_RESOLVEDisbursement settlement sidecash/bank/deposit/teller/wallet context
LOAN_REPAYMENT_SOURCE_RESOLVERepayment debit/source siderepayment channel context
LOAN_REPAYMENT_SPLITRepayment credit split across principal/interest/fees/penalty/tax/excessloan transaction/component context
INTEREST_RECEIVABLE_RESOLVEInterest receivableproduct interest_receivable_coa_id, then pricing-item fallback
INTEREST_INCOME_RESOLVEInterest incomeproduct interest_income_coa_id, then pricing-item fallback
INTEREST_CAPITALIZATION_RESOLVEPrincipal-vs-interest side for capitalization/restructureproduct principal and interest-receivable accounts
LOAN_PROVISION_RESOLVEProvision expense/liabilityproduct provision mappings
LOAN_WRITEOFF_RESOLVEWrite-off expense/receivableproduct write-off and control mappings
LOAN_RECOVERY_RESOLVERecovery settlement/incomesettlement channel plus product recovery-income mapping
LOAN_WAIVER_RESOLVEWaiver impact/control linesproduct mappings plus pricing-item fee/penalty accounts

System Tag Guidance

  • Keep only one active valid header binding per tag key for the global standard flow.
  • If a tag still points at a deleted header id, deactivate that binding.
  • Keep LOAN_WAIVER as the waiver tag key. Do not rename it to WAIVER.
  • Keep REPAY_COLLATERAL only for collateral-disposal repayment flows.
  • Do not create fake reversal tags for operations that source code does not resolve.

Validation Checklist

  • [ ] Product account mappings exist for principal, interest, provision, recovery, and write-off where required
  • [ ] Every enabled lifecycle operation has both a product binding and a LOAN_GL_RULE tag binding
  • [ ] All DOMAIN_RESOLVED lines have the correct handler attached
  • [ ] Waiver headers use the exact impact/control detail names above
  • [ ] Reversal tags point at dedicated reversal headers, not the forward header
  • [ ] No active LOAN_GL_RULE tag binding points at a deleted or rejected rule header
  • [ ] Accrual products have both INT_ACCRUE and INT_ACCRUE_REV
  • [ ] Capitalized/compound products have both INT_CAPITALIZE and INT_CAPITALIZE_REV

Runtime Resolution Flow

text
Loan operation
  -> resolve LOAN_GL_RULE tag key
  -> resolve approved header
  -> prefer matching product-bound header
  -> execute detail handlers
  -> each handler resolves the actual COA/sub-ledger

If the tag, header, product binding, detail binding, or required mapped account is missing, the runtime should fail clearly instead of falling back silently.

PinkApple ERP by Stat Solutions Network