Skip to main content

Reassessment events

Over the life of a lease, modifications and remeasurement events occur: the lessor adjusts payments, the lessee extends the term, an indexation clause triggers, an asset is impaired or returned. Each event is captured in a LeaseReassessmentEvent record with before/after snapshots, supporting evidence, balanced GL postings, and an approval route — and once posted to GL it is immutable.

The four event entry points

LeaseReassessmentService exposes four entry points; all are administration-scoped (ADR-005), all return the persisted event payload, all stamp the sourceLease FK for ADR-022 audit:

Indexation — recordIndexationEvent

Use when a CPI / fixed-percent / sector-index clause fires. Pass the new payment amount; the service builds the before/after snapshot, recomputes the post-event liability from the new payment stream, and applies a catch-up RoU adjustment (IFRS 16.42). The event-type is indexation-remeasurement.

Extension-option reassessment — recordExtensionOptionReassessment

Use when the operator decides an extension option is now "reasonably certain" (or no longer). Pass the updated extensionOptions array. Schedule length changes, the post-event liability is recomputed, and the GL gets a catch-up adjustment for the new horizon. The event-type is extension-option-reassessment.

Modification — recordModification

Use for scope / term / payment / IBR-reset modifications per IFRS 16.44. Pass the field overrides and (optionally) the remeasurement approach:

  • catch-up-adjustment (default) — new IBR at modification date applies; liability + RoU adjusted in the period.
  • prospective — future schedule absorbs the change; no GL line in the modification period.
  • separate-lease — IFRS 16.44 separate-lease branch; the caller creates a new lease record.

The event-type is auto-resolved from the field-delta:

Field deltaEvent-type
Only basePaymentAmountpayment-modification
Any nonCancellableTermMonths changeterm-modification
Only ibrPercentIBR-reset
Anything elsescope-modification

Impairment — recordImpairment

Use when the RoU asset is impaired (damage, end-of-use). Pass the recoverable value; the service writes the RoU down to that value and emits a P&L loss line (Dr. lease-modification-gain-loss, Cr. rou-asset). Reversal (positive delta) is supported. The event-type is impairment.

Status, threshold, and decidesk routing (REQ-LR-007)

Every event is created with one of two statuses:

  • pending-approval — RoU adjustment magnitude exceeds the EUR 100,000 decidesk threshold. The caller fires a webhook to decidesk; GL posting is blocked until the board approves.
  • approved — RoU adjustment below the threshold; auto-approved.

approvalThresholdCents() returns the current threshold (10_000_000 = EUR 100,000 in cents).

Reassessment-number sequence

Numbers are sequential per lease: <leaseNumber>-reassess-001, …-002, … The next number is derived from the count of prior events for the source lease (administration-scoped). Two-event race conditions are handled by OR's own id uniqueness.

Immutability (REQ-LR-006)

Once postedToGl is set, the event is immutable. Corrections create a new event ("adjustment reassessment") that references the original via correctionOf.

Examples

Indexation (CPI +2.1 %)

$service->recordIndexationEvent(
leaseContractId: 'lease-v',
administrationId: 'adm-1',
newPaymentAmount: 1021.0, // was 1000.0
triggerDescription: 'CPI +2.1% YoY',
approver: 'person-1',
);

Extension reasonably certain

$service->recordExtensionOptionReassessment(
leaseContractId: 'lease-v',
administrationId: 'adm-1',
updatedExtensionOptions: [
['months' => 24, 'exerciseLikelihood' => 'reasonably-certain'],
],
triggerDescription: 'Board decision: renew for 2 years',
approver: 'person-2',
);

Scope modification (extra floor on a building lease)

$service->recordModification(
leaseContractId: 'lease-r',
administrationId: 'adm-1',
newTerms: [
'nonCancellableTermMonths' => 96, // was 60
'basePaymentAmount' => 150_000.0, // was 100_000.0
'ibrPercent' => 5.5,
],
approach: 'catch-up-adjustment',
triggerDescription: 'Extra floor + extended term',
approver: 'person-3',
);

Impairment (damaged vehicle)

$service->recordImpairment(
leaseContractId: 'lease-v',
administrationId: 'adm-1',
recoverableValue: 5_000.0,
triggerDescription: 'Vehicle damaged, recoverable per insurer',
approver: 'person-4',
);