diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/branchday/api/BranchDayRegisterApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/branchday/api/BranchDayRegisterApiResource.java index ab0a6d421..249622985 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/branchday/api/BranchDayRegisterApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/branchday/api/BranchDayRegisterApiResource.java @@ -853,12 +853,29 @@ public class BranchDayRegisterApiResource { // disbursements use APPROVED; withdrawal is the one register that doesn't) -- filtering on // APPROVED alone silently excluded every completed withdrawal from this total, overstating // the branch's expected cash by exactly what had actually been paid out that day. - final BigDecimal withdrawals = zero(jdbcTemplate.queryForObject(""" + final BigDecimal slipWithdrawals = zero(jdbcTemplate.queryForObject(""" SELECT COALESCE(SUM(amount), 0) FROM m_clerk_withdrawal_request WHERE status = 'WITHDRAWN' AND COALESCE(txn_date, CAST(submitted_at AS DATE)) = ? """, BigDecimal.class, date)); + // Account closures pay cash over the same counter but live in their own register, so they + // were missing from this total entirely -- the branch's expected cash stayed high by exactly + // what had been handed over, reporting a shortage for a closure that balanced perfectly. + // + // cashier_disbursed_amount, not closing_amount: the member's ledger gives up the paisa-exact + // figure, but what physically leaves the drawer is that figure rounded to whole rupees, and + // this total has to agree with a physical count. Only CLOSED rows, dated on disbursed_at, + // since a closure takes nothing out of the drawer until the cashier hands it over (a + // nil-balance closure never reaches a cashier at all, hence the closure_date fallback). + final BigDecimal closureWithdrawals = zero(jdbcTemplate.queryForObject(""" + SELECT COALESCE(SUM(cashier_disbursed_amount), 0) FROM m_clerk_closure_request + WHERE status = 'CLOSED' + AND COALESCE(CAST(disbursed_at AS DATE), closure_date) = ? + """, BigDecimal.class, date)); + + final BigDecimal withdrawals = slipWithdrawals.add(closureWithdrawals); + // Cash drawn from the vault to a cashier — more physical cash sitting in the branch. final BigDecimal vaultIn = zero(jdbcTemplate.queryForObject(""" SELECT COALESCE(SUM(transfer_amount), 0) FROM m_cash_transfer