feat(chequebook): per-leaf issuance charge with balance validation and fund hold

Requesting a cheque book now computes a per-leaf charge (reusing the existing
"Cheque Book Charge" facility mapping) and blocks the request at submit time if
the account can't absorb it without breaching its minimum required balance.

The charge amount is reserved via Fineract's native hold-amount mechanism when
the request is submitted, released and actually deducted (with GL posting) on
checker approval, or released back to the customer on rejection — so funds are
never left dangling on hold regardless of outcome.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Jaanu423
2026-07-16 11:19:11 +05:30
co-authored by Claude Sonnet 5
parent 3bb7fc8050
commit fde670e644
5 changed files with 425 additions and 5 deletions
@@ -409,4 +409,5 @@
<include file="parts/0386_enable_global_maker_checker.xml" relativeToChangelogFile="true"/>
<include file="parts/0387_chequeleaf_serial_unique_per_lot.xml" relativeToChangelogFile="true"/>
<include file="parts/0388_chequeleaf_returned_status.xml" relativeToChangelogFile="true"/>
<include file="parts/0389_chequebook_pending_request_hold.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd">
<!--
Tracks the hold-amount transaction (m_savings_account_transaction / m_current_account_transaction id)
placed on the account when a REQUEST_BOOK pending request is submitted, so the reserved cheque-book
issuance charge can be released cleanly at approval (then charged) or at rejection (returned to the
customer) without ever leaving funds stuck on hold.
-->
<changeSet id="0389-chequebook-pending-request-hold-column" author="CBS">
<preConditions onFail="MARK_RAN">
<not><columnExists tableName="m_chequebook_pending_request" columnName="hold_transaction_id"/></not>
</preConditions>
<addColumn tableName="m_chequebook_pending_request">
<column name="hold_transaction_id" type="BIGINT"/>
</addColumn>
</changeSet>
</databaseChangeLog>