refactor: update cash adjustment logic to suppress shortages instead of surpluses during POS session closing

This commit is contained in:
Suherdy Yacob 2026-03-31 12:07:41 +07:00
parent 9ba75d9098
commit dbc106a070
2 changed files with 6 additions and 4 deletions

View File

@ -6,13 +6,15 @@
**License:** LGPL-3 **License:** LGPL-3
## Summary ## Summary
Prevents unwanted journal entries by handling zero-amount payments and automatically adjusting negative cash differences during POS session closing. Prevents unwanted journal entries by handling zero-amount payments and automatically adjusting negative cash differences (shortages) during POS session closing.
## Features ## Features
- **Phantom Difference Prevention:** Relies on standard Odoo mechanisms to ensure no journal items are created when the expected cash mathematically matches the inputted cash (e.g. opening with 150k and closing with 150k, or opening with 200k, selling 100k, and closing with 300k). - **Phantom Difference Prevention:** Relies on standard Odoo mechanisms to ensure no journal items are created when the expected cash mathematically matches the inputted cash (e.g. opening with 150k and closing with 150k, or opening with 200k, selling 100k, and closing with 300k).
- **Shortage Suppression:** Automatically adjusts the real balance to match the expected balance when a shortage is detected, avoiding loss/expense journal entries.
- **Surplus Recording:** Allows standard Odoo behavior to record a surplus as a profit journal entry.
## Technical Details ## Technical Details
### Validation Override ### Validation Override
The module overrides `_validate_session` in `pos.session`: The module overrides `_validate_session` in `pos.session`:
1. **Auto-Adjustment:** Detects if `cash_register_balance_end_real` is greater than `cash_register_balance_end`. If so, it overrides the real balance to match the expected balance *before* standard accounting lines are generated, avoiding the creation of profit lines. 1. **Auto-Adjustment:** If `cash_register_balance_end_real` is greater than `cash_register_balance_end` (Cash Surplus), it records the difference using standard Odoo accounting. If `cash_register_balance_end_real` is lower than `cash_register_balance_end` (Cash Shortage), it overrides the real balance to match the expected balance *before* standard accounting lines are generated, avoiding the creation of cash diff (loss) journal entries.
2. **Zero-Amount Fix:** Iterates through all orders in the session and unlinks any payment lines where the amount is considered zero by the session's currency. 2. **Zero-Amount Fix:** Iterates through all orders in the session and unlinks any payment lines where the amount is considered zero by the session's currency.

View File

@ -124,8 +124,8 @@ class PosSession(models.Model):
for session in self: for session in self:
if session.config_id.cash_control: if session.config_id.cash_control:
difference = session.cash_register_balance_end_real - session.cash_register_balance_end difference = session.cash_register_balance_end_real - session.cash_register_balance_end
if session.currency_id.compare_amounts(difference, 0.0) > 0: if session.currency_id.compare_amounts(difference, 0.0) < 0:
session.message_post(body="Auto-adjustment: Cashier input %s overridden to expected %s to suppress positive difference of %s." % ( session.message_post(body="Auto-adjustment: Cashier input %s overridden to expected %s to suppress negative difference (shortage) of %s." % (
session.currency_id.format(session.cash_register_balance_end_real), session.currency_id.format(session.cash_register_balance_end_real),
session.currency_id.format(session.cash_register_balance_end), session.currency_id.format(session.cash_register_balance_end),
session.currency_id.format(difference) session.currency_id.format(difference)