| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Point of Sale (point_of_sale)
• Discuss (mail) • Inventory (stock) • Invoicing (account) |
| Lines of code | 248 |
| Technical Name |
qt_pos_no_change_on_bank |
| License | LGPL-3 |
| Website | https://odootips.com |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Point of Sale (point_of_sale)
• Discuss (mail) • Inventory (stock) • Invoicing (account) |
| Lines of code | 248 |
| Technical Name |
qt_pos_no_change_on_bank |
| License | LGPL-3 |
| Website | https://odootips.com |
In standard Odoo POS, a cashier can overpay using a Bank method (card, transfer, etc.),
which may create change and sometimes leads to inconsistent payment lines
(negative or 0.00 lines) that can cause accounting imbalances.
This module enforces a strict and safe rule:
Bank methods can never generate change. If change is needed, it must originate
only from Cash.
- ✅ No change on Bank - Bank methods are capped to the remaining amount
- ✅ Change only from Cash - Cash can exceed total and generate change
- ✅ Dangerous mix blocked - If Cash already overpays, adding Bank is blocked
- ✅ No negatives (sales) - Negative amounts are blocked in normal sales
- ✅ No 0.00 lines - It is automatically removed upon validation
- ✅ Consolidation - Reuses existing payment line instead of duplicates
- ✅ Central validator - One invariant enforcer runs after each payment event
- ✅ Final hard-check - Prevents validation if invariants are violated
- ✅ Refunds excluded - Rules apply only when
total > 0 - ✅ No core overrides - Uses OWL patches and standard extension mechanisms
- ✔ Community
-
✔
Enterprise
(On-premises) - ✔ Odoo.sh
- ✘ Online
📦 Dependencies
- • Point of Sale (point_of_sale)
💻 Technical
- • OWL Patches (JS)
- • No Python dependencies
- • Centralized invariant validator
- • License: LGPL-3
Use the following scenarios to validate the behavior in a real POS session:
| # | Scenario | Expected result |
|---|---|---|
| 01 | Total 17.11, Cash 20 + click Bank | BLOCKS Bank (change already from cash) |
| 02 | Add Bank twice | Consolidates into a single line (non-terminal) |
| 03 | Cash 20 on total 17.11 | Allowed, shows change 2.89 |
| 04 | Bank 10 + Cash 7.11 (total 17.11) | Allowed, no negatives |
| 05 | Validate with a negative or 0.00 line | It is automatically removed upon validation |
| 06 | Total 23.01, Bank 200 | BLOCKS / caps Bank to max allowed (no change) |
| 07 | Total 23.01, Bank 10 + Cash 20 | Allowed, change originates from cash |
| 08 | Try +/- (negative) on any line | BLOCKS in normal sales |
Why this matters
Preventing "change" on bank methods ensures that card/transfer payments remain accurate and do not indirectly create negative compensation lines. This reduces the risk of cash/bank imbalances and improves auditability.
Steps:
- Copy the
qt_pos_no_change_on_bankfolder into your Odoo custom addons directory - Restart the Odoo server
- Go to Apps, remove the "Apps" filter, and search for "POS No Change on Bank Payments"
- Click Install
- Open a POS session and test the payment screen rules
For questions, bug reports, or feature requests, please contact us:
Please log in to comment on this module