* feat(accounts): add Bank Charges account for Payment Entry deductions Add an optional Bank Charges Account field on Company. When a Payment Entry has a difference between the paid and received amount (e.g. a same-currency Internal Transfer where the bank deducted a fee), that amount now books to the Bank Charges account in the deductions table instead of always going to the Exchange Gain/Loss account. Left blank, behavior is unchanged. Mirrors the resolution on both the server (set_exchange_gain_loss) and client (set_exchange_gain_loss_deduction) so the deduction row is pre-filled consistently before and after save. A user's manual account edit on an existing deduction row is preserved across recalculation, same as before this change. * fix(accounts): only route Payment Entry difference to Bank Charges for same-currency transfers Cross-currency Payment Entries were also matching the unconditional bank_charges_account precedence, misrouting a genuine exchange gain/loss into the Bank Charges account. Only prefer Bank Charges Account when paid_from and paid_to share a currency; cross-currency differences continue to book to Exchange Gain/Loss Account. * test(payment_entry): assert against actual exchange gain/loss account, not a hardcoded name CI failed: _Test Company's exchange_gain_loss_account is auto-provisioned as "Exchange Gain/Loss - _TC" by the standard chart of accounts, not the "_Test Exchange Gain/Loss - _TC" account used only by a sibling test. * fix(accounts): auto-set Bank Charges Account from chart of accounts default The standard chart of accounts already ships a "Bank Charges" ledger account, but set_default_accounts() never picked it up into the Company's bank_charges_account field, unlike its write_off_account and exchange_gain_loss_account siblings. New and existing companies now get it auto-populated the same way. --------- Co-authored-by: test <test@test.com>
Accounts module contains masters and transactions to manage a traditional double entry accounting system.
Accounting heads are called "Accounts" and they can be groups in a tree like "Chart of Accounts"
Entries are:
- Journal Entries
- Sales Invoice (Itemised)
- Purchase Invoice (Itemised)
All accounting entries are stored in the General Ledger
Payment Ledger
Transactions on Receivable and Payable Account types will also be stored in Payment Ledger. This is so that payment reconciliation process only requires update on this ledger.
Key Fields
| Field | Description |
|---|---|
account_type |
Receivable/Payable |
account |
Accounting head |
party |
Party Name |
voucher_no |
Voucher No |
against_voucher_no |
Linked voucher(secondary effect) |
amount |
can be +ve/-ve |
Design
debit and credit have been replaced with account_type and amount. against_voucher_no is populated for all entries. So, outstanding amount can be calculated by summing up amount only using against_voucher_no.
Ex:
- Consider an invoice for ₹100 and a partial payment of ₹80 against that invoice. Payment Ledger will have following entries.
| voucher_no | against_voucher_no | amount |
|---|---|---|
| SINV-01 | SINV-01 | 100 |
| PAY-01 | SINV-01 | -80 |
- Reconcile a Credit Note against an invoice using a Journal Entry
An invoice for ₹100 partially reconciled against a credit of ₹70 using a Journal Entry. Payment Ledger will have the following entries.
| voucher_no | against_voucher_no | amount |
|---|---|---|
| SINV-01 | SINV-01 | 100 |
| CR-NOTE-01 | CR-NOTE-01 | -70 |
| JE-01 | CR-NOTE-01 | +70 |
| JE-01 | SINV-01 | -70 |