From e96bceedf6c8977b13721966e18f0502caf34c3e Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Mon, 9 Mar 2026 14:49:11 +0700 Subject: [PATCH] feat: Add handling for POS orders without payment records by routing amounts to split sales via a fallback cash payment method. --- models/pos_session.py | 49 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/models/pos_session.py b/models/pos_session.py index 617709b..3e343e9 100644 --- a/models/pos_session.py +++ b/models/pos_session.py @@ -154,6 +154,55 @@ class PosSession(models.Model): if float_is_zero(order_amount, precision_rounding=self.currency_id.rounding): continue + if not order.payment_ids: + # Assume cash payment method for 0-total orders to ensure proper routing and naming + cash_pm = self.payment_method_ids.filtered(lambda pm: pm.type == 'cash')[:1] + fallback_pm_id = cash_pm.id if cash_pm else False + + regular_part_amount = order_sale_amounts['regular_amount'] + discount_part_amount = order_sale_amounts['discount_amount'] + regular_part_amount_converted = order_sale_amounts['regular_amount_converted'] + discount_part_amount_converted = order_sale_amounts['discount_amount_converted'] + regular_part_tax = order_sale_amounts['regular_tax_amount'] + discount_part_tax = order_sale_amounts['discount_tax_amount'] + + def add_unsplit_entry(part_amount, part_amount_converted, part_tax_amount, is_discount_part): + if float_is_zero(part_amount, precision_rounding=self.currency_id.rounding): + return + + target_account_id = sale_key[0] + if fallback_pm_id and cash_pm: + original_account = self.env['account.account'].browse(target_account_id) + is_income_account = original_account.account_type in ('income', 'income_other') + if is_income_account: + if is_discount_part: + if cash_pm.discount_account_id: + target_account_id = cash_pm.discount_account_id.id + elif cash_pm.income_account_id: + target_account_id = cash_pm.income_account_id.id + else: + if cash_pm.income_account_id: + target_account_id = cash_pm.income_account_id.id + + if fallback_pm_id: + new_sale_key = ( + target_account_id, + sale_key[1], + fallback_pm_id, + sale_key[2], + sale_key[3], + ) + else: + new_sale_key = sale_key + + split_sales[new_sale_key]['amount'] += part_amount + split_sales[new_sale_key]['amount_converted'] += part_amount_converted + split_sales[new_sale_key]['tax_amount'] += part_tax_amount + + add_unsplit_entry(regular_part_amount, regular_part_amount_converted, regular_part_tax, False) + add_unsplit_entry(discount_part_amount, discount_part_amount_converted, discount_part_tax, True) + continue + for payment in order.payment_ids: #if float_is_zero(payment.amount, precision_rounding=order.currency_id.rounding): # continue