Construction loan drawdown engine¶
| ID | MOD-121 |
| System | SD05 |
| Repo | bank-credit |
| Build status | Deployed |
| Deployed | Yes |
| Last commit | 19b0610 |
Purpose¶
Manages the progressive drawdown lifecycle for construction loans. A construction loan disburses in tranches tied to defined construction milestones — slab, frame, lock-up, fixing, and completion — rather than as a single lump sum at settlement. Interest accrues only on the drawn balance. On completion, the loan converts to a standard residential mortgage with a full P&I amortisation schedule generated by MOD-112.
Compliance rationale¶
CCCFA (NZ) and NCCP (AU) responsible lending obligations extend to construction lending. CRE-002 requires that drawdowns are conditioned on verified construction progress — not on a calendar schedule alone. Releasing funds against an unverified milestone would expose the bank to a regulatory finding that it did not adequately monitor the use of credit. LVR monitoring under RBNZ BS19 (NZ) and APRA APS 112 (AU) must be updated after each drawdown: the loan balance increases with each tranche while the security value (an in-progress build) may lag or fluctuate, making per-drawdown LVR tracking an ongoing prudential requirement rather than a one-time assessment at origination.
Commercial rationale¶
Construction lending is a core product category for building societies and regional banks serving owner-builders and new build purchasers. Progressive drawdown protects both parties: the bank does not release funds until a qualifying certifier confirms the milestone is complete, and the customer is not charged interest on funds not yet drawn. Without this module, the platform can only offer land purchase loans or fully advanced loans, excluding the most common form of residential construction financing. The absence of construction lending capability would also constrain the bank's ability to serve first-home buyers using new build programmes (NZ First Home Loan, FHLDS in AU) which predominantly involve construction contracts.
Construction phases and milestone model¶
Each construction loan has a drawdown_schedule — a sequence of tranches, each with:
tranche_number— 1 = deposit/slab, 2 = frame, 3 = lock-up, 4 = fixing, 5 = completion (configurable per product)tranche_amount— dollar amount or percentage of total facilitymilestone_description— plain-text description, e.g. "Frame and roof complete"status— lifecycle state:pending→inspection_requested→certified→drawn→lapsedcertification_dateandcertifier_reference— quantity surveyor or building inspector referencedrawdown_dateandposting_id— populated when funds are released
Milestone certification is provided by an approved quantity surveyor or building inspector. The bank does not self-certify. Certifier references are stored against each tranche and are available to auditors via the credit file.
Data model¶
-- credit.construction_schedules
CREATE TABLE credit.construction_schedules (
schedule_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
loan_id UUID NOT NULL REFERENCES credit.loans(loan_id),
total_facility NUMERIC(18,2) NOT NULL,
total_drawn NUMERIC(18,2) NOT NULL DEFAULT 0,
construction_end_date DATE, -- expected completion
conversion_date DATE, -- when IO period ends and P&I begins
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active','complete','defaulted')),
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- credit.construction_tranches
CREATE TABLE credit.construction_tranches (
tranche_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
schedule_id UUID NOT NULL REFERENCES credit.construction_schedules(schedule_id),
tranche_number INT NOT NULL,
tranche_amount NUMERIC(18,2) NOT NULL,
milestone_description TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending','inspection_requested','certified','drawn','lapsed')),
certification_date DATE,
certifier_reference TEXT,
drawdown_date DATE,
posting_id UUID,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (schedule_id, tranche_number)
);
Key operations¶
Drawdown request. Agent or customer submits a drawdown request for a tranche. The system validates: tranche status is certified, all prior tranches have status drawn, and the loan is not in arrears. On validation, the drawdown is posted to the ledger via MOD-001, total_drawn is incremented, tranche status moves to drawn, and the event bank.credit.construction_drawdown_posted is emitted. MOD-063 dispatches a drawdown confirmation to the customer including the updated drawn balance.
Milestone certification. Agent uploads the certification document (stored via MOD-073 if document management is available) and records certification_date and certifier_reference. Tranche status moves to certified. MOD-063 notifies the customer that the milestone has been verified and a drawdown can now be requested.
Interest accrual on drawn balance only. MOD-005 receives total_drawn as the accrual base, not total_facility. This value is refreshed after each drawdown posting. The customer is not charged interest on committed but undrawn funds. CON-005 compliance is maintained by design — there is no mechanism to accrue on the full facility.
LVR recalculation. After each drawdown, MOD-115 is called with the updated total_drawn value. LVR is recalculated as total_drawn / current_valuation. If LVR exceeds the policy breach threshold, an alert is generated and routed to the credit team for review. The property security record is updated with the new drawn balance so that LVR history is visible in the collateral register.
Completion and conversion. When all tranches reach status drawn, or when construction_end_date is reached (whichever is first), the schedule status is set to complete. MOD-112 is triggered to generate the full P&I amortisation schedule beginning on conversion_date. MOD-063 dispatches a notification to the customer containing the first repayment date, monthly repayment amount, and remaining loan term.
Requirements¶
| ID | Requirement |
|---|---|
| FR-545 | System shall prevent drawdown disbursement unless the corresponding tranche has status certified. |
| FR-546 | System shall post each approved drawdown as a ledger debit via MOD-001 and update total_drawn atomically. |
| FR-547 | System shall supply total_drawn (not total_facility) to MOD-005 as the interest accrual base after each drawdown. |
| FR-548 | System shall trigger MOD-112 to generate a P&I amortisation schedule when all tranches reach status drawn or construction_end_date is reached. |
Module dependencies¶
Depends on¶
| Module | Title | Required? | Contract | Reason |
|---|---|---|---|---|
| MOD-001 | Double-entry posting engine | Required | — | Each drawdown tranche is posted as a ledger entry via the double-entry engine, incrementing the loan balance. |
| MOD-005 | Daily accrual calculator | Required | — | Daily interest accrual runs only on the drawn balance — the accrual calculator must receive the current drawn amount, not the full facility limit. |
| MOD-112 | Amortisation schedule engine | Required | — | After the construction phase completes and the loan converts to P&I, the amortisation schedule engine generates the full repayment schedule. |
| MOD-115 | Property security and LVR management | Required | — | LVR is recalculated after each drawdown and the property security record is updated to reflect the new drawn balance. |
| MOD-063 | Notification orchestration | Required | — | Drawdown notifications and milestone reminders are dispatched via the notification orchestration module. |
Required by¶
(No modules in this wiki currently declare a dependency on this module.)
Policies satisfied¶
| Policy | Title | Mode | How |
|---|---|---|---|
| CRE-002 | Responsible Lending Policy | GATE |
Each drawdown tranche requires a completed milestone certification before funds are released — the system will not release funds based on a schedule alone. |
| CON-004 | Product Disclosure & Sales Practice Policy | AUTO |
The customer receives an updated amortisation schedule after each drawdown, reflecting the new principal balance and any change in the interest-only period remaining. |
| CON-005 | Fee & Pricing Transparency Policy | CALC |
Interest accrues only on the drawn balance — not the total approved facility — ensuring the customer is not charged interest on undrawn funds. |
| CRE-001 | Credit Risk Management Policy | CALC |
LVR is recalculated after each drawdown using the current drawn balance against the most recent valuation, with the result fed to MOD-115. |
Capabilities satisfied¶
(No capabilities mapped)
Part of SD05 — Credit Decisioning & Loan Platform
Compiled 2026-05-22 from source/entities/modules/MOD-121.yaml