/** * Copyright since 2025 Mifos Initiative * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import { Component, inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { AuthenticationService } from '../../core/authentication/authentication.service'; interface SummaryRow { code: string; name: string; /** Balance carried forward as of the start of the day — the only figure NOT derived from txns below. */ opening: number; } interface TxnRow { /** Links this transaction to the SummaryRow.code it posts against — the single source of truth for Credit/Debit totals. */ glCode: string; voucherNo: string; accountNo: string; accountName: string; particulars: string; debit: number; credit: number; } interface Branch { code: string; name: string; /** Relative size vs the base dataset below (which represents the Head Office main branch, scale 1). */ scale: number; } type TabKey = 'cash' | 'transfer' | 'clearing' | 'digital'; /** * Dummy static Cash / Clearing / Transfer summary + transaction-detail report. * * IMPORTANT: Credit/Debit (and therefore Closing) are always DERIVED from the txn * lists below (rowCredit/rowDebit), never hand-entered separately — this guarantees * the Summary view and the Transaction Details view can never go out of sync, * for any branch or for the Head Office's "All Branches" consolidated view. */ @Component({ selector: 'mifosx-cash-clearing-transfer-summary', templateUrl: './cash-clearing-transfer-summary.component.html', styleUrls: [ '../cashier-shared.scss', './cash-clearing-transfer-summary.component.scss' ], standalone: true, imports: [ CommonModule, FormsModule ] }) export class CashClearingTransferSummaryComponent { private auth = inject(AuthenticationService); asOnDate = ''; activeTab: TabKey = 'cash'; showDetails = false; /** GL/channel filter for the Transaction Details view — null means "All". */ glFilter: string | null = null; /** True when the logged-in user belongs to the Head Office (sees both branches + consolidated view). */ isHeadOffice = false; /** The logged-in user's own branch/office name, from real session credentials. */ currentOfficeName = 'Branch Office'; /** Set when a branch-level login's officeName matches one of the two dummy branches below. */ private ownBranch: Branch | null = null; /** * The two branches this demo covers. A branch-level user is matched to one of these by * their real officeName (case-insensitive substring match) so "Branch 1" logging in sees * Branch 1's figures and "Branch 2" sees Branch 2's — rename these to your real office * names if they differ. Both are proportionally scaled from the same base dataset so * every branch's own numbers stay internally consistent (Summary always equals the sum * of its own Transaction Details). */ branches: Branch[] = [ { code: 'BR1', name: 'Branch 1', scale: 1 }, { code: 'BR2', name: 'Branch 2', scale: 0.7 } ]; /** 'ALL' = consolidated across both branches; otherwise a Branch.code. Only meaningful for Head Office users. */ selectedBranchCode = 'ALL'; cashRows: SummaryRow[] = [{ code: '100001', name: 'Cash at Vault', opening: 3572000 }]; transferRows: SummaryRow[] = [ { code: '250101', name: 'Suspense Account - Transfer', opening: 85000 }, { code: '250102', name: 'Sundry Deposit Account', opening: 132500 }, { code: '250103', name: 'Inter Branch Account (Head Office)', opening: 610000 }, { code: '250104', name: 'Inward Remittance Suspense', opening: 42000 }, { code: '250105', name: 'Outward Remittance Suspense', opening: 38500 }, { code: '251001', name: 'Bank GL - SBI Current Account', opening: 1850000 }, { code: '251002', name: 'Bank GL - HDFC Bank Current Account', opening: 960000 }, { code: '251003', name: 'Bank GL - ICICI Bank Current Account', opening: 745000 }, { code: '251004', name: 'Bank GL - Axis Bank Current Account', opening: 512000 }, { code: '252001', name: 'DD Payable Account', opening: 96000 }, { code: '252002', name: 'Pay Order Payable Account', opening: 64000 }, { code: '253001', name: 'Sundry Creditors', opening: 158000 }, { code: '253002', name: 'Sundry Debtors', opening: 121000 }, { code: '254001', name: 'TDS Payable Account', opening: 28500 }, { code: '254002', name: 'GST Payable Account', opening: 19500 } ]; clearingRows: SummaryRow[] = [ { code: '300201', name: 'Outward Clearing (Cheques Sent)', opening: 265000 }, { code: '300202', name: 'Inward Clearing (Cheques Received)', opening: 198000 }, { code: '300203', name: 'Clearing Suspense Account', opening: 15500 }, { code: '300204', name: 'CTS Clearing Difference Account', opening: 4200 }, { code: '300205', name: 'Local Clearing House Account', opening: 88000 } ]; digitalRows: SummaryRow[] = [ { code: 'RTGS', name: 'RTGS - Overall', opening: 720000 }, { code: 'NEFT', name: 'NEFT - Overall', opening: 512000 }, { code: 'UPI', name: 'UPI - Overall', opening: 96000 }, { code: 'ATM', name: 'ATM - Overall', opening: 340000 }, { code: 'NACH', name: 'NACH - Overall', opening: 158000 } ]; cashTxns: TxnRow[] = [ { glCode: '100001', voucherNo: 'CSH/2607/0141', accountNo: 'Teller-01', accountName: 'Teller Counter 1 Cash Deposits (Aggregated)', particulars: 'Cash Deposit - Savings/Current Accounts', debit: 0, credit: 950000 }, { glCode: '100001', voucherNo: 'CSH/2607/0142', accountNo: 'Teller-02', accountName: 'Teller Counter 2 Cash Deposits (Aggregated)', particulars: 'Cash Deposit - Savings/Current Accounts', debit: 0, credit: 700000 }, { glCode: '100001', voucherNo: 'CSH/2607/0143', accountNo: '015020198765', accountName: 'Anita Traders', particulars: 'Cash Deposit - Current Account', debit: 0, credit: 185000 }, { glCode: '100001', voucherNo: 'CSH/2607/0144', accountNo: '015010112345', accountName: 'Ramesh Kumar Sahu', particulars: 'Cash Deposit - Savings Account', debit: 0, credit: 25000 }, { glCode: '100001', voucherNo: 'CSH/2607/0145', accountNo: '015020209988', accountName: 'Kavita Enterprises', particulars: 'Cash Deposit - Current Account', debit: 0, credit: 110000 }, { glCode: '100001', voucherNo: 'CSH/2607/0146', accountNo: 'Branch ATM', accountName: 'ATM Excess Cash Retraction', particulars: 'Excess Cash Surrendered by ATM to Vault', debit: 0, credit: 400000 }, { glCode: '100001', voucherNo: 'CSH/2607/0147', accountNo: '015010223344', accountName: 'Suresh Yadav', particulars: 'Cash Deposit - Savings Account', debit: 0, credit: 15000 }, { glCode: '100001', voucherNo: 'CSH/2607/0148', accountNo: '015030112233', accountName: 'Kiran Bhosale', particulars: 'Cash Deposit - RD Installment', debit: 0, credit: 130000 }, { glCode: '100001', voucherNo: 'CSH/2607/0149', accountNo: 'Branch ATM', accountName: 'ATM 1 Cash Loading', particulars: 'Vault to ATM Cash Transfer', debit: 700000, credit: 0 }, { glCode: '100001', voucherNo: 'CSH/2607/0150', accountNo: 'Extension Counter ATM', accountName: 'ATM 2 Cash Loading', particulars: 'Vault to ATM Cash Transfer', debit: 500000, credit: 0 }, { glCode: '100001', voucherNo: 'CSH/2607/0151', accountNo: '015010154321', accountName: 'Sunita Devi', particulars: 'Cash Withdrawal - Savings Account', debit: 12000, credit: 0 }, { glCode: '100001', voucherNo: 'CSH/2607/0152', accountNo: '015010167890', accountName: 'Mohan Lal Verma', particulars: 'Cash Withdrawal - Term Deposit Closure', debit: 75000, credit: 0 }, { glCode: '100001', voucherNo: 'CSH/2607/0153', accountNo: 'Currency Chest', accountName: 'Currency Chest Remittance', particulars: 'Surplus Cash Remitted to Currency Chest', debit: 400000, credit: 0 }, { glCode: '100001', voucherNo: 'CSH/2607/0154', accountNo: '015020278899', accountName: 'Prakash Jadhav', particulars: 'Cash Withdrawal - Current Account', debit: 210000, credit: 0 }, { glCode: '100001', voucherNo: 'CSH/2607/0155', accountNo: '015010289900', accountName: 'Snehal Kulkarni', particulars: 'Cash Withdrawal - Savings Account', debit: 18000, credit: 0 }, { glCode: '100001', voucherNo: 'CSH/2607/0156', accountNo: 'Vault', accountName: 'Vault Denomination Exchange Adjustment', particulars: 'Shortage Adjustment - Denomination Exchange', debit: 205000, credit: 0 } ]; transferTxns: TxnRow[] = [ // 250101 - Suspense Account - Transfer (credit 420000 / debit 398000) { glCode: '250101', voucherNo: 'TRF/2607/0101', accountNo: '015020145678', accountName: 'Vikram Traders', particulars: 'Suspense Recovered - Vikram Traders', debit: 0, credit: 250000 }, { glCode: '250101', voucherNo: 'TRF/2607/0102', accountNo: '015020145991', accountName: 'Rohit Sharma', particulars: 'Suspense Recovered - Rohit Sharma', debit: 0, credit: 170000 }, { glCode: '250101', voucherNo: 'TRF/2607/0103', accountNo: '015020156432', accountName: 'Meena Enterprises', particulars: 'Suspense Adjustment - Meena Enterprises', debit: 230000, credit: 0 }, { glCode: '250101', voucherNo: 'TRF/2607/0104', accountNo: '015020156877', accountName: 'Kavita Singh', particulars: 'Suspense Adjustment - Kavita Singh', debit: 168000, credit: 0 }, // 250102 - Sundry Deposit Account (credit 96000 / debit 110000) { glCode: '250102', voucherNo: 'TRF/2607/0105', accountNo: '015020167531', accountName: 'Ashok Furnitures', particulars: 'Sundry Deposit Received - Ashok Furnitures', debit: 0, credit: 60000 }, { glCode: '250102', voucherNo: 'TRF/2607/0106', accountNo: '015020167998', accountName: 'Ganesh Traders', particulars: 'Sundry Deposit Received - Ganesh Traders', debit: 0, credit: 36000 }, { glCode: '250102', voucherNo: 'TRF/2607/0107', accountNo: '015020178654', accountName: 'Geeta Boutique', particulars: 'Sundry Deposit Refunded - Geeta Boutique', debit: 70000, credit: 0 }, { glCode: '250102', voucherNo: 'TRF/2607/0108', accountNo: '015020178901', accountName: 'Manisha Enterprises', particulars: 'Sundry Deposit Refunded - Manisha Enterprises', debit: 40000, credit: 0 }, // 250103 - Inter Branch Account, Head Office (credit 1250000 / debit 1180000) { glCode: '250103', voucherNo: 'TRF/2607/0109', accountNo: 'BR-0007', accountName: 'Andheri Branch (Branch Code 0007)', particulars: 'Funds Received from Andheri Branch', debit: 0, credit: 750000 }, { glCode: '250103', voucherNo: 'TRF/2607/0110', accountNo: 'BR-0015', accountName: 'Dadar Branch (Branch Code 0015)', particulars: 'Funds Received from Dadar Branch', debit: 0, credit: 500000 }, { glCode: '250103', voucherNo: 'TRF/2607/0111', accountNo: 'BR-0012', accountName: 'Powai Branch (Branch Code 0012)', particulars: 'Fund Transfer to Powai Branch', debit: 680000, credit: 0 }, { glCode: '250103', voucherNo: 'TRF/2607/0112', accountNo: 'BR-0019', accountName: 'Thane Branch (Branch Code 0019)', particulars: 'Fund Transfer to Thane Branch', debit: 500000, credit: 0 }, // 250104 - Inward Remittance Suspense (credit 315000 / debit 300000) { glCode: '250104', voucherNo: 'TRF/2607/0113', accountNo: '015020189712', accountName: 'Suresh Patil', particulars: 'Inward Remittance Received - Suresh Patil', debit: 0, credit: 190000 }, { glCode: '250104', voucherNo: 'TRF/2607/0114', accountNo: '015020189834', accountName: 'Rahul Deshmukh', particulars: 'Inward Remittance Received - Rahul Deshmukh', debit: 0, credit: 125000 }, { glCode: '250104', voucherNo: 'TRF/2607/0115', accountNo: '015020190845', accountName: 'Lata Joshi', particulars: 'Inward Remittance Credited - Lata Joshi', debit: 175000, credit: 0 }, { glCode: '250104', voucherNo: 'TRF/2607/0116', accountNo: '015020190956', accountName: 'Farhan Sheikh', particulars: 'Inward Remittance Credited - Farhan Sheikh', debit: 125000, credit: 0 }, // 250105 - Outward Remittance Suspense (credit 275000 / debit 260000) { glCode: '250105', voucherNo: 'TRF/2607/0117', accountNo: '015020201456', accountName: 'Anil Kapoor Traders', particulars: 'Outward Remittance Booked - Anil Kapoor Traders', debit: 0, credit: 160000 }, { glCode: '250105', voucherNo: 'TRF/2607/0118', accountNo: '015020201567', accountName: 'Sameer Qureshi', particulars: 'Outward Remittance Booked - Sameer Qureshi', debit: 0, credit: 115000 }, { glCode: '250105', voucherNo: 'TRF/2607/0119', accountNo: '015020212789', accountName: 'Deepa Enterprises', particulars: 'Outward Remittance Settled - Deepa Enterprises', debit: 150000, credit: 0 }, { glCode: '250105', voucherNo: 'TRF/2607/0120', accountNo: '015020212890', accountName: 'Yogesh Pawar', particulars: 'Outward Remittance Settled - Yogesh Pawar', debit: 110000, credit: 0 }, // 251001 - Bank GL - SBI Current Account (credit 3250000 / debit 2980000) { glCode: '251001', voucherNo: 'TRF/2607/0121', accountNo: 'SBIN0001234', accountName: 'SBI Mumbai Main Branch', particulars: 'Inward Settlement via SBI Current A/c', debit: 0, credit: 1500000 }, { glCode: '251001', voucherNo: 'TRF/2607/0122', accountNo: 'SBIN0002211', accountName: 'SBI Andheri Branch', particulars: 'Inward Settlement via SBI Current A/c', debit: 0, credit: 1000000 }, { glCode: '251001', voucherNo: 'TRF/2607/0123', accountNo: 'SBIN0003322', accountName: 'SBI Thane Branch', particulars: 'Inward Settlement via SBI Current A/c', debit: 0, credit: 750000 }, { glCode: '251001', voucherNo: 'TRF/2607/0124', accountNo: 'SBIN0005678', accountName: 'SBI Pune Branch', particulars: 'Outward Settlement via SBI Current A/c', debit: 1400000, credit: 0 }, { glCode: '251001', voucherNo: 'TRF/2607/0125', accountNo: 'SBIN0006689', accountName: 'SBI Nashik Branch', particulars: 'Outward Settlement via SBI Current A/c', debit: 900000, credit: 0 }, { glCode: '251001', voucherNo: 'TRF/2607/0126', accountNo: 'SBIN0007790', accountName: 'SBI Nagpur Branch', particulars: 'Outward Settlement via SBI Current A/c', debit: 680000, credit: 0 }, // 251002 - Bank GL - HDFC Bank Current Account (credit 1840000 / debit 1725000) { glCode: '251002', voucherNo: 'TRF/2607/0127', accountNo: 'HDFC0002345', accountName: 'HDFC Bank Andheri Branch', particulars: 'Inward Settlement via HDFC Current A/c', debit: 0, credit: 900000 }, { glCode: '251002', voucherNo: 'TRF/2607/0128', accountNo: 'HDFC0003456', accountName: 'HDFC Bank Bandra Branch', particulars: 'Inward Settlement via HDFC Current A/c', debit: 0, credit: 600000 }, { glCode: '251002', voucherNo: 'TRF/2607/0129', accountNo: 'HDFC0004567', accountName: 'HDFC Bank Malad Branch', particulars: 'Inward Settlement via HDFC Current A/c', debit: 0, credit: 340000 }, { glCode: '251002', voucherNo: 'TRF/2607/0130', accountNo: 'HDFC0006789', accountName: 'HDFC Bank Borivali Branch', particulars: 'Outward Settlement via HDFC Current A/c', debit: 800000, credit: 0 }, { glCode: '251002', voucherNo: 'TRF/2607/0131', accountNo: 'HDFC0007890', accountName: 'HDFC Bank Goregaon Branch', particulars: 'Outward Settlement via HDFC Current A/c', debit: 600000, credit: 0 }, { glCode: '251002', voucherNo: 'TRF/2607/0132', accountNo: 'HDFC0008901', accountName: 'HDFC Bank Kandivali Branch', particulars: 'Outward Settlement via HDFC Current A/c', debit: 325000, credit: 0 }, // 251003 - Bank GL - ICICI Bank Current Account (credit 1420000 / debit 1360000) { glCode: '251003', voucherNo: 'TRF/2607/0133', accountNo: 'ICIC0003456', accountName: 'ICICI Bank Thane Branch', particulars: 'Inward Settlement via ICICI Current A/c', debit: 0, credit: 820000 }, { glCode: '251003', voucherNo: 'TRF/2607/0134', accountNo: 'ICIC0004567', accountName: 'ICICI Bank Ghatkopar Branch', particulars: 'Inward Settlement via ICICI Current A/c', debit: 0, credit: 600000 }, { glCode: '251003', voucherNo: 'TRF/2607/0135', accountNo: 'ICIC0007890', accountName: 'ICICI Bank Vashi Branch', particulars: 'Outward Settlement via ICICI Current A/c', debit: 760000, credit: 0 }, { glCode: '251003', voucherNo: 'TRF/2607/0136', accountNo: 'ICIC0008901', accountName: 'ICICI Bank Chembur Branch', particulars: 'Outward Settlement via ICICI Current A/c', debit: 600000, credit: 0 }, // 251004 - Bank GL - Axis Bank Current Account (credit 980000 / debit 905000) { glCode: '251004', voucherNo: 'TRF/2607/0137', accountNo: 'UTIB0004567', accountName: 'Axis Bank Dadar Branch', particulars: 'Inward Settlement via Axis Current A/c', debit: 0, credit: 560000 }, { glCode: '251004', voucherNo: 'TRF/2607/0138', accountNo: 'UTIB0005678', accountName: 'Axis Bank Sion Branch', particulars: 'Inward Settlement via Axis Current A/c', debit: 0, credit: 420000 }, { glCode: '251004', voucherNo: 'TRF/2607/0139', accountNo: 'UTIB0008901', accountName: 'Axis Bank Kurla Branch', particulars: 'Outward Settlement via Axis Current A/c', debit: 505000, credit: 0 }, { glCode: '251004', voucherNo: 'TRF/2607/0140', accountNo: 'UTIB0009012', accountName: 'Axis Bank Ghansoli Branch', particulars: 'Outward Settlement via Axis Current A/c', debit: 400000, credit: 0 }, // 252001 - DD Payable Account (credit 240000 / debit 218000) { glCode: '252001', voucherNo: 'TRF/2607/0141', accountNo: 'DD/2607/5541', accountName: 'Sanjay Mehta', particulars: 'Demand Draft Issued - Sanjay Mehta', debit: 0, credit: 140000 }, { glCode: '252001', voucherNo: 'TRF/2607/0142', accountNo: 'DD/2607/5556', accountName: 'Farida Sheikh', particulars: 'Demand Draft Issued - Farida Sheikh', debit: 0, credit: 100000 }, { glCode: '252001', voucherNo: 'TRF/2607/0143', accountNo: 'DD/2607/5498', accountName: 'Rekha Nair', particulars: 'Demand Draft Paid - Rekha Nair', debit: 128000, credit: 0 }, { glCode: '252001', voucherNo: 'TRF/2607/0144', accountNo: 'DD/2607/5487', accountName: 'Girish Rao', particulars: 'Demand Draft Paid - Girish Rao', debit: 90000, credit: 0 }, // 252002 - Pay Order Payable Account (credit 175000 / debit 160000) { glCode: '252002', voucherNo: 'TRF/2607/0145', accountNo: 'PO/2607/1187', accountName: 'Arvind Traders', particulars: 'Pay Order Issued - Arvind Traders', debit: 0, credit: 100000 }, { glCode: '252002', voucherNo: 'TRF/2607/0146', accountNo: 'PO/2607/1192', accountName: 'Neelam Gupta', particulars: 'Pay Order Issued - Neelam Gupta', debit: 0, credit: 75000 }, { glCode: '252002', voucherNo: 'TRF/2607/0147', accountNo: 'PO/2607/1145', accountName: 'Vandana Enterprises', particulars: 'Pay Order Paid - Vandana Enterprises', debit: 95000, credit: 0 }, { glCode: '252002', voucherNo: 'TRF/2607/0148', accountNo: 'PO/2607/1138', accountName: 'Tushar Bhatt', particulars: 'Pay Order Paid - Tushar Bhatt', debit: 65000, credit: 0 }, // 253001 - Sundry Creditors (credit 92000 / debit 85000) { glCode: '253001', voucherNo: 'TRF/2607/0149', accountNo: '015020223412', accountName: 'Om Stationery Suppliers', particulars: 'Vendor Bill Provided For - Om Stationery Suppliers', debit: 0, credit: 52000 }, { glCode: '253001', voucherNo: 'TRF/2607/0150', accountNo: '015020223567', accountName: 'Shubham Printers', particulars: 'Vendor Bill Provided For - Shubham Printers', debit: 0, credit: 40000 }, { glCode: '253001', voucherNo: 'TRF/2607/0151', accountNo: '015020234598', accountName: 'Shree Balaji AMC Services', particulars: 'Vendor Payment - AMC Charges', debit: 50000, credit: 0 }, { glCode: '253001', voucherNo: 'TRF/2607/0152', accountNo: '015020234678', accountName: 'Metro Security Services', particulars: 'Vendor Payment - Security Services', debit: 35000, credit: 0 }, // 253002 - Sundry Debtors (credit 68000 / debit 74000) { glCode: '253002', voucherNo: 'TRF/2607/0153', accountNo: '015020245671', accountName: 'Kiran Hardware', particulars: 'Recovery from Sundry Debtor - Kiran Hardware', debit: 0, credit: 40000 }, { glCode: '253002', voucherNo: 'TRF/2607/0154', accountNo: '015020245789', accountName: 'Vishal Electronics', particulars: 'Recovery from Sundry Debtor - Vishal Electronics', debit: 0, credit: 28000 }, { glCode: '253002', voucherNo: 'TRF/2607/0155', accountNo: '015020256784', accountName: 'Nilesh Electricals', particulars: 'Advance Given to Sundry Debtor - Nilesh Electricals', debit: 44000, credit: 0 }, { glCode: '253002', voucherNo: 'TRF/2607/0156', accountNo: '015020256890', accountName: 'Ramdas Plumbing Works', particulars: 'Advance Given to Sundry Debtor - Ramdas Plumbing Works', debit: 30000, credit: 0 }, // 254001 - TDS Payable Account (credit 46000 / debit 40000) { glCode: '254001', voucherNo: 'TRF/2607/0157', accountNo: 'TDS/2607/9911', accountName: 'TDS on FD Interest Payouts', particulars: 'TDS Deducted on FD Interest Payouts', debit: 0, credit: 28000 }, { glCode: '254001', voucherNo: 'TRF/2607/0158', accountNo: 'TDS/2607/9917', accountName: 'TDS on RD Interest Payouts', particulars: 'TDS Deducted on RD Interest Payouts', debit: 0, credit: 18000 }, { glCode: '254001', voucherNo: 'TRF/2607/0159', accountNo: 'TDS/2607/9902', accountName: 'Income Tax Department', particulars: 'TDS Remitted to Government - Quarterly Challan', debit: 24000, credit: 0 }, { glCode: '254001', voucherNo: 'TRF/2607/0160', accountNo: 'TDS/2607/9903', accountName: 'Income Tax Department', particulars: 'TDS Remitted to Government - Adjustment Challan', debit: 16000, credit: 0 }, // 254002 - GST Payable Account (credit 38000 / debit 32000) { glCode: '254002', voucherNo: 'TRF/2607/0161', accountNo: 'GST/2607/7731', accountName: 'GST on Service Charges', particulars: 'GST Collected on Service Charges', debit: 0, credit: 22000 }, { glCode: '254002', voucherNo: 'TRF/2607/0162', accountNo: 'GST/2607/7736', accountName: 'GST on Locker Rent', particulars: 'GST Collected on Locker Rent', debit: 0, credit: 16000 }, { glCode: '254002', voucherNo: 'TRF/2607/0163', accountNo: 'GST/2607/7702', accountName: 'GST Department', particulars: 'GST Remitted to Government - Monthly Return', debit: 19000, credit: 0 }, { glCode: '254002', voucherNo: 'TRF/2607/0164', accountNo: 'GST/2607/7703', accountName: 'GST Department', particulars: 'GST Remitted to Government - Late Fee Adjustment', debit: 13000, credit: 0 } ]; clearingTxns: TxnRow[] = [ // 300201 - Outward Clearing, Cheques Sent (credit 980000 / debit 910000) { glCode: '300201', voucherNo: 'CLR/2607/0031', accountNo: 'CHQ-000123', accountName: 'Rajesh Kumar Singh', particulars: 'Cheque No 000123 Sent - Rajesh Kumar Singh', debit: 0, credit: 550000 }, { glCode: '300201', voucherNo: 'CLR/2607/0032', accountNo: 'CHQ-000129', accountName: 'Manoj Tiwari', particulars: 'Cheque No 000129 Sent - Manoj Tiwari', debit: 0, credit: 430000 }, { glCode: '300201', voucherNo: 'CLR/2607/0033', accountNo: 'CHQ-000145', accountName: 'Nisha Agarwal', particulars: 'Outward Clearing Realised - Nisha Agarwal', debit: 520000, credit: 0 }, { glCode: '300201', voucherNo: 'CLR/2607/0034', accountNo: 'CHQ-000151', accountName: 'Devendra Kale', particulars: 'Outward Clearing Realised - Devendra Kale', debit: 390000, credit: 0 }, // 300202 - Inward Clearing, Cheques Received (credit 875000 / debit 820000) { glCode: '300202', voucherNo: 'CLR/2607/0035', accountNo: 'CHQ-000456', accountName: 'Sameer Joshi', particulars: 'Cheque No 000456 Received - Sameer Joshi', debit: 0, credit: 500000 }, { glCode: '300202', voucherNo: 'CLR/2607/0036', accountNo: 'CHQ-000461', accountName: 'Ritu Bansal', particulars: 'Cheque No 000461 Received - Ritu Bansal', debit: 0, credit: 375000 }, { glCode: '300202', voucherNo: 'CLR/2607/0037', accountNo: 'CHQ-000478', accountName: 'Pooja Malhotra', particulars: 'Inward Clearing Passed for Payment - Pooja Malhotra', debit: 470000, credit: 0 }, { glCode: '300202', voucherNo: 'CLR/2607/0038', accountNo: 'CHQ-000483', accountName: 'Ajit Naik', particulars: 'Inward Clearing Passed for Payment - Ajit Naik', debit: 350000, credit: 0 }, // 300203 - Clearing Suspense Account (credit 60000 / debit 58000) { glCode: '300203', voucherNo: 'CLR/2607/0039', accountNo: 'CHQ-000512', accountName: 'ABC Enterprises', particulars: 'Clearing Difference Booked - ABC Enterprises', debit: 0, credit: 35000 }, { glCode: '300203', voucherNo: 'CLR/2607/0040', accountNo: 'CHQ-000519', accountName: 'Global Traders', particulars: 'Clearing Difference Booked - Global Traders', debit: 0, credit: 25000 }, { glCode: '300203', voucherNo: 'CLR/2607/0041', accountNo: 'CHQ-000534', accountName: 'XYZ Traders', particulars: 'Cheque Return - Insufficient Funds - XYZ Traders', debit: 33000, credit: 0 }, { glCode: '300203', voucherNo: 'CLR/2607/0042', accountNo: 'CHQ-000541', accountName: 'Om Textiles', particulars: 'Cheque Return - Insufficient Funds - Om Textiles', debit: 25000, credit: 0 }, // 300204 - CTS Clearing Difference Account (credit 12500 / debit 11000) { glCode: '300204', voucherNo: 'CLR/2607/0043', accountNo: 'CTS-GRID-01A', accountName: 'CTS Grid Rounding Adjustment - Batch 1 (Cr)', particulars: 'CTS Grid Rounding Adjustment - Batch 1', debit: 0, credit: 7500 }, { glCode: '300204', voucherNo: 'CLR/2607/0044', accountNo: 'CTS-GRID-01B', accountName: 'CTS Grid Rounding Adjustment - Batch 2 (Cr)', particulars: 'CTS Grid Rounding Adjustment - Batch 2', debit: 0, credit: 5000 }, { glCode: '300204', voucherNo: 'CLR/2607/0045', accountNo: 'CTS-GRID-02A', accountName: 'CTS Grid Rounding Adjustment - Batch 1 (Dr)', particulars: 'CTS Grid Rounding Adjustment - Batch 1', debit: 6500, credit: 0 }, { glCode: '300204', voucherNo: 'CLR/2607/0046', accountNo: 'CTS-GRID-02B', accountName: 'CTS Grid Rounding Adjustment - Batch 2 (Dr)', particulars: 'CTS Grid Rounding Adjustment - Batch 2', debit: 4500, credit: 0 }, // 300205 - Local Clearing House Account (credit 310000 / debit 292000) { glCode: '300205', voucherNo: 'CLR/2607/0047', accountNo: 'MUM-CH-S1', accountName: 'Mumbai Clearing House - Session I', particulars: 'CTS Grid Settlement - Session I (Cr)', debit: 0, credit: 180000 }, { glCode: '300205', voucherNo: 'CLR/2607/0048', accountNo: 'MUM-CH-S2', accountName: 'Mumbai Clearing House - Session II', particulars: 'CTS Grid Settlement - Session II (Cr)', debit: 0, credit: 130000 }, { glCode: '300205', voucherNo: 'CLR/2607/0049', accountNo: 'MUM-CH-S1D', accountName: 'Mumbai Clearing House - Session I', particulars: 'CTS Grid Settlement - Session I (Dr)', debit: 165000, credit: 0 }, { glCode: '300205', voucherNo: 'CLR/2607/0050', accountNo: 'MUM-CH-S2D', accountName: 'Mumbai Clearing House - Session II', particulars: 'CTS Grid Settlement - Session II (Dr)', debit: 127000, credit: 0 } ]; digitalTxns: TxnRow[] = [ // RTGS - Overall (credit 4850000 / debit 4620000) { glCode: 'RTGS', voucherNo: 'RTGS/2607/8891', accountNo: 'UTR-RTGS26073100234', accountName: 'Deepak Enterprises', particulars: 'RTGS Inward - Remitting Bank HDFC', debit: 0, credit: 2200000 }, { glCode: 'RTGS', voucherNo: 'RTGS/2607/8892', accountNo: 'UTR-RTGS26073100256', accountName: 'Reliance Distributors Pvt Ltd', particulars: 'RTGS Inward - Remitting Bank ICICI', debit: 0, credit: 1650000 }, { glCode: 'RTGS', voucherNo: 'RTGS/2607/8893', accountNo: 'UTR-RTGS26073100278', accountName: 'Wadia Constructions', particulars: 'RTGS Inward - Remitting Bank Axis', debit: 0, credit: 1000000 }, { glCode: 'RTGS', voucherNo: 'RTGS/2607/8894', accountNo: 'UTR-RTGS26073100891', accountName: 'Kunal Manufacturing Co.', particulars: 'RTGS Outward - Beneficiary Bank HDFC', debit: 2000000, credit: 0 }, { glCode: 'RTGS', voucherNo: 'RTGS/2607/8895', accountNo: 'UTR-RTGS26073100904', accountName: 'Bansal Steel Traders', particulars: 'RTGS Outward - Beneficiary Bank SBI', debit: 1600000, credit: 0 }, { glCode: 'RTGS', voucherNo: 'RTGS/2607/8896', accountNo: 'UTR-RTGS26073100918', accountName: 'Mehta Exports', particulars: 'RTGS Outward - Beneficiary Bank ICICI', debit: 1020000, credit: 0 }, // NEFT - Overall (credit 3260000 / debit 3105000) { glCode: 'NEFT', voucherNo: 'NEFT/2607/6712', accountNo: 'UTR-NEFT26073100589', accountName: 'Priya Sharma', particulars: 'NEFT Inward - Remitting Bank SBI', debit: 0, credit: 1500000 }, { glCode: 'NEFT', voucherNo: 'NEFT/2607/6713', accountNo: 'UTR-NEFT26073100601', accountName: 'Kunal Oberoi', particulars: 'NEFT Inward - Remitting Bank HDFC', debit: 0, credit: 1100000 }, { glCode: 'NEFT', voucherNo: 'NEFT/2607/6714', accountNo: 'UTR-NEFT26073100617', accountName: 'Sanya Kapoor', particulars: 'NEFT Inward - Remitting Bank ICICI', debit: 0, credit: 660000 }, { glCode: 'NEFT', voucherNo: 'NEFT/2607/6715', accountNo: 'UTR-NEFT26073100742', accountName: 'Sanjay Wholesale Traders', particulars: 'NEFT Outward - Beneficiary Bank SBI', debit: 1400000, credit: 0 }, { glCode: 'NEFT', voucherNo: 'NEFT/2607/6716', accountNo: 'UTR-NEFT26073100758', accountName: 'Rakesh Chandok', particulars: 'NEFT Outward - Beneficiary Bank Axis', debit: 1000000, credit: 0 }, { glCode: 'NEFT', voucherNo: 'NEFT/2607/6717', accountNo: 'UTR-NEFT26073100763', accountName: 'Meera Iyer', particulars: 'NEFT Outward - Beneficiary Bank HDFC', debit: 705000, credit: 0 }, // UPI - Overall (credit 5480000 / debit 5390000) - NPCI settlement batched by time slot { glCode: 'UPI', voucherNo: 'UPI/2607/44521', accountNo: 'NPCI-UPI-SETL-IN-01', accountName: 'UPI Inward Settlement - Morning Batch (00:00-12:00)', particulars: 'UPI Collect - Merchant/P2P Inward (Aggregated)', debit: 0, credit: 1980000 }, { glCode: 'UPI', voucherNo: 'UPI/2607/44522', accountNo: 'NPCI-UPI-SETL-IN-02', accountName: 'UPI Inward Settlement - Afternoon Batch (12:00-18:00)', particulars: 'UPI Collect - Merchant/P2P Inward (Aggregated)', debit: 0, credit: 2100000 }, { glCode: 'UPI', voucherNo: 'UPI/2607/44523', accountNo: 'NPCI-UPI-SETL-IN-03', accountName: 'UPI Inward Settlement - Evening Batch (18:00-24:00)', particulars: 'UPI Collect - Merchant/P2P Inward (Aggregated)', debit: 0, credit: 1400000 }, { glCode: 'UPI', voucherNo: 'UPI/2607/44524', accountNo: 'NPCI-UPI-SETL-OUT-01', accountName: 'UPI Outward Settlement - Morning Batch (00:00-12:00)', particulars: 'UPI Pay - Merchant/P2P Outward (Aggregated)', debit: 1850000, credit: 0 }, { glCode: 'UPI', voucherNo: 'UPI/2607/44525', accountNo: 'NPCI-UPI-SETL-OUT-02', accountName: 'UPI Outward Settlement - Afternoon Batch (12:00-18:00)', particulars: 'UPI Pay - Merchant/P2P Outward (Aggregated)', debit: 2050000, credit: 0 }, { glCode: 'UPI', voucherNo: 'UPI/2607/44526', accountNo: 'NPCI-UPI-SETL-OUT-03', accountName: 'UPI Outward Settlement - Evening Batch (18:00-24:00)', particulars: 'UPI Pay - Merchant/P2P Outward (Aggregated)', debit: 1490000, credit: 0 }, // ATM - Overall (credit 210000 / debit 685000) { glCode: 'ATM', voucherNo: 'ATM/2607/9081', accountNo: 'ATM-SETL-CR-01', accountName: 'ATM Cash Deposits - Own Branch ATM (Aggregated)', particulars: 'ATM Cash Deposit - Own Branch ATM', debit: 0, credit: 150000 }, { glCode: 'ATM', voucherNo: 'ATM/2607/9082', accountNo: 'ATM-SETL-CR-02', accountName: 'ATM Cash Deposits - Extension Counter ATM (Aggregated)', particulars: 'ATM Cash Deposit - Extension Counter ATM', debit: 0, credit: 60000 }, { glCode: 'ATM', voucherNo: 'ATM/2607/9083', accountNo: 'ATM-SETL-DR-01', accountName: 'ATM Cash Withdrawals - Own Branch ATM (Aggregated)', particulars: 'ATM Cash Withdrawal - Own Branch ATM', debit: 420000, credit: 0 }, { glCode: 'ATM', voucherNo: 'ATM/2607/9084', accountNo: 'ATM-SETL-DR-02', accountName: 'ATM Cash Withdrawals - Other Bank ATM, NFS Switch (Aggregated)', particulars: 'ATM Cash Withdrawal - Other Bank ATM (NFS)', debit: 265000, credit: 0 }, // NACH - Overall (credit 940000 / debit 865000) { glCode: 'NACH', voucherNo: 'NACH/2607/3304', accountNo: 'NACH-SETL-CR-01', accountName: 'NACH Credits - Corporate Payroll Disbursement (Aggregated)', particulars: 'NACH Credit - Salary Disbursement Batch', debit: 0, credit: 650000 }, { glCode: 'NACH', voucherNo: 'NACH/2607/3305', accountNo: 'NACH-SETL-CR-02', accountName: 'NACH Credits - Government Subsidy (DBT) Disbursement (Aggregated)', particulars: 'NACH Credit - Subsidy Disbursement Batch', debit: 0, credit: 290000 }, { glCode: 'NACH', voucherNo: 'NACH/2607/3306', accountNo: 'NACH-SETL-DR-01', accountName: 'NACH Debits - Retail Loan EMI Collection (Aggregated)', particulars: 'NACH Debit - Loan EMI Collection Batch', debit: 560000, credit: 0 }, { glCode: 'NACH', voucherNo: 'NACH/2607/3307', accountNo: 'NACH-SETL-DR-02', accountName: 'NACH Debits - Gold Loan EMI Collection (Aggregated)', particulars: 'NACH Debit - Gold Loan EMI Collection Batch', debit: 305000, credit: 0 } ]; constructor() { const d = new Date(); this.asOnDate = `${String(d.getDate()).padStart(2, '0')}-${String(d.getMonth() + 1).padStart(2, '0')}-${d.getFullYear()}`; const creds = this.auth.getCredentials(); this.isHeadOffice = this.auth.isHeadOfficeUser(); this.currentOfficeName = creds?.officeName || 'Branch Office'; if (this.isHeadOffice) { // Head Office starts on the consolidated view and can drill into either branch. this.selectedBranchCode = 'ALL'; } else { // Match the logged-in office's real name to one of the two dummy branches, so each // branch's login shows its own figures. Falls back to the unscaled base dataset // (still labelled with the user's real office name) if no branch name matches. this.ownBranch = this.branches.find((b) => this.currentOfficeName.toLowerCase().includes(b.name.toLowerCase())) || null; this.selectedBranchCode = this.ownBranch?.code || 'OWN'; } } private baseRowsFor(tab: TabKey): SummaryRow[] { switch (tab) { case 'cash': return this.cashRows; case 'transfer': return this.transferRows; case 'clearing': return this.clearingRows; case 'digital': return this.digitalRows; } } private baseTxnsFor(tab: TabKey): TxnRow[] { switch (tab) { case 'cash': return this.cashTxns; case 'transfer': return this.transferTxns; case 'clearing': return this.clearingTxns; case 'digital': return this.digitalTxns; } } private roundAmt(v: number): number { return Math.round(v / 100) * 100; } private scaleRows(rows: SummaryRow[], factor: number): SummaryRow[] { if (factor === 1) { return rows; } return rows.map((r) => ({ ...r, opening: this.roundAmt(r.opening * factor) })); } private scaleTxns(txns: TxnRow[], factor: number, branchTag?: string): TxnRow[] { if (factor === 1) { return txns; } return txns.map((t) => ({ ...t, voucherNo: branchTag ? `${branchTag}-${t.voucherNo}` : t.voucherNo, debit: this.roundAmt(t.debit * factor), credit: this.roundAmt(t.credit * factor) })); } /** Rows for a given tab, scoped to the currently selected branch (or consolidated across both, for Head Office). */ private effectiveRows(tab: TabKey): SummaryRow[] { const base = this.baseRowsFor(tab); if (!this.isHeadOffice) { return this.ownBranch ? this.scaleRows(base, this.ownBranch.scale) : base; } if (this.selectedBranchCode === 'ALL') { return base.map((r) => ({ ...r, opening: this.branches.reduce((sum, b) => sum + this.roundAmt(r.opening * b.scale), 0) })); } const branch = this.branches.find((b) => b.code === this.selectedBranchCode); return this.scaleRows(base, branch ? branch.scale : 1); } /** Transactions for a given tab, scoped to the currently selected branch (or merged across both, for Head Office). */ private effectiveTxns(tab: TabKey): TxnRow[] { const base = this.baseTxnsFor(tab); if (!this.isHeadOffice) { return this.ownBranch ? this.scaleTxns(base, this.ownBranch.scale, this.ownBranch.code) : base; } if (this.selectedBranchCode === 'ALL') { return this.branches.flatMap((b) => this.scaleTxns(base, b.scale, b.code)); } const branch = this.branches.find((b) => b.code === this.selectedBranchCode); return this.scaleTxns(base, branch ? branch.scale : 1, branch?.code); } get rowsForActiveTab(): SummaryRow[] { return this.effectiveRows(this.activeTab); } get txnsForActiveTab(): TxnRow[] { return this.effectiveTxns(this.activeTab); } /** Name of the branch/scope currently being viewed, for display in the header. */ get scopeName(): string { if (!this.isHeadOffice) { return this.currentOfficeName; } if (this.selectedBranchCode === 'ALL') { return 'All Branches (Consolidated)'; } return this.branches.find((b) => b.code === this.selectedBranchCode)?.name || ''; } setBranch(code: string): void { this.selectedBranchCode = code; this.glFilter = null; } setTab(tab: TabKey): void { this.activeTab = tab; this.glFilter = null; } toggleDetails(): void { this.showDetails = !this.showDetails; this.glFilter = null; } setGlFilter(code: string | null): void { this.glFilter = code; } /** Transactions for the Transaction Details view, narrowed to the selected GL/channel filter (or all, when null). */ get filteredTxns(): TxnRow[] { if (!this.glFilter) { return this.txnsForActiveTab; } return this.txnsForActiveTab.filter((t) => t.glCode === this.glFilter); } /** Short label for a GL filter chip — the channel code for Digital (RTGS/NEFT/...), the GL name otherwise. */ filterLabel(row: SummaryRow): string { return this.activeTab === 'digital' ? row.code : row.name; } /** Credit total for a GL row — always summed from its own txn lines, never a separate hand-entered number. */ rowCredit(row: SummaryRow, txns: TxnRow[]): number { return txns.filter((t) => t.glCode === row.code).reduce((sum, t) => sum + t.credit, 0); } /** Debit total for a GL row — always summed from its own txn lines, never a separate hand-entered number. */ rowDebit(row: SummaryRow, txns: TxnRow[]): number { return txns.filter((t) => t.glCode === row.code).reduce((sum, t) => sum + t.debit, 0); } closing(row: SummaryRow, txns: TxnRow[]): number { return row.opening + this.rowCredit(row, txns) - this.rowDebit(row, txns); } total(rows: SummaryRow[], txns: TxnRow[], key: 'opening' | 'credit' | 'debit'): number { if (key === 'opening') { return rows.reduce((sum, r) => sum + r.opening, 0); } if (key === 'credit') { return rows.reduce((sum, r) => sum + this.rowCredit(r, txns), 0); } return rows.reduce((sum, r) => sum + this.rowDebit(r, txns), 0); } totalClosing(rows: SummaryRow[], txns: TxnRow[]): number { return this.total(rows, txns, 'opening') + this.total(rows, txns, 'credit') - this.total(rows, txns, 'debit'); } txnTotal(rows: TxnRow[], key: 'debit' | 'credit'): number { return rows.reduce((sum, r) => sum + r[key], 0); } private readonly allTabs: TabKey[] = [ 'cash', 'transfer', 'clearing', 'digital' ]; /** Cash/Transfer/Clearing/Digital category pairs, scoped to the currently selected branch. */ private get categories(): Array<{ rows: SummaryRow[]; txns: TxnRow[] }> { return this.allTabs.map((tab) => ({ rows: this.effectiveRows(tab), txns: this.effectiveTxns(tab) })); } get grandOpening(): number { return this.categories.reduce((sum, c) => sum + this.total(c.rows, c.txns, 'opening'), 0); } get grandCredit(): number { return this.categories.reduce((sum, c) => sum + this.total(c.rows, c.txns, 'credit'), 0); } get grandDebit(): number { return this.categories.reduce((sum, c) => sum + this.total(c.rows, c.txns, 'debit'), 0); } get grandClosing(): number { return this.grandOpening + this.grandCredit - this.grandDebit; } /** * Branch-wise contribution to the day's overall position — shown only to Head Office * users while viewing "All Branches". Each branch's figures are derived the same way * (opening scaled, credit/debit summed from that branch's own scaled txns), so this * table can never drift from what you'd see by drilling into that branch individually. */ get branchBreakup(): Array<{ code: string; name: string; opening: number; credit: number; debit: number; closing: number; }> { return this.branches.map((b) => { const pairs = this.allTabs.map((tab) => ({ rows: this.scaleRows(this.baseRowsFor(tab), b.scale), txns: this.scaleTxns(this.baseTxnsFor(tab), b.scale, b.code) })); const opening = pairs.reduce((sum, c) => sum + this.total(c.rows, c.txns, 'opening'), 0); const credit = pairs.reduce((sum, c) => sum + this.total(c.rows, c.txns, 'credit'), 0); const debit = pairs.reduce((sum, c) => sum + this.total(c.rows, c.txns, 'debit'), 0); return { code: b.code, name: b.name, opening, credit, debit, closing: opening + credit - debit }; }); } }