• Mahmoud Aglan's avatar
    feat(installments): add early settlement — full principal-only payoff with interest waiver · a64e13fa
    Mahmoud Aglan authored
    - InstallmentCalculator: calculateEarlySettlement() sums all pending principal and interest separately; settlement_amount = principal only, all interest waived
    - InstallmentController: earlySettlement() (confirmation page), processEarlySettlement() (executes: single PaymentService call, zeros interest on each settled row, marks plan completed + is_cash_settled=1, dispatches installment.early_settled), settlementReceipt() (print view)
    - Routes: GET/POST /installments/{id}/early-settlement, GET /installments/{id}/settlement-receipt/{receiptId}
    - show.php:  تسوية مبكرة button (requires installment.pay permission, only when active + pending > 0)
    - early_settlement.php: breakdown table (original due / interest waived / principal to pay), pending items preview, mandatory confirmation checkbox, submit disabled until checked
    - settlement_receipt.php: print-ready receipt showing original balance, interest waived, amount paid, settled items list, amount in words, stamp/signature area
    - PaymentService: early_settlement payment type label
    - Architecture Map: section 5.6, new route rows, new event row
    Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
    a64e13fa
show.php 19.9 KB