diff --git a/addons/sale/models/payment.py b/addons/sale/models/payment.py index 1d6b8a0a680055bedacb0530fac334f04debd912..b5f5e0b8964f0b3d075fc606dac1016f50c32f8e 100644 --- a/addons/sale/models/payment.py +++ b/addons/sale/models/payment.py @@ -113,10 +113,10 @@ class PaymentTransaction(models.Model): # invoice the sale orders if needed self._invoice_sale_orders() res = super(PaymentTransaction, self)._reconcile_after_transaction_done() - if self.env['ir.config_parameter'].sudo().get_param('sale.automatic_invoice'): + if self.env['ir.config_parameter'].sudo().get_param('sale.automatic_invoice') and any(so.state in ('sale', 'done') for so in self.sale_order_ids): default_template = self.env['ir.config_parameter'].sudo().get_param('sale.default_email_template') if default_template: - for trans in self.filtered(lambda t: t.sale_order_ids): + for trans in self.filtered(lambda t: t.sale_order_ids.filtered(lambda so: so.state in ('sale', 'done'))): trans = trans.with_company(trans.acquirer_id.company_id).with_context( mark_invoice_as_sent=True, company_id=trans.acquirer_id.company_id.id, @@ -130,9 +130,11 @@ class PaymentTransaction(models.Model): for trans in self.filtered(lambda t: t.sale_order_ids): trans = trans.with_company(trans.acquirer_id.company_id)\ .with_context(company_id=trans.acquirer_id.company_id.id) - trans.sale_order_ids._force_lines_to_invoice_policy_order() - invoices = trans.sale_order_ids._create_invoices() - trans.invoice_ids = [(6, 0, invoices.ids)] + confirmed_orders = trans.sale_order_ids.filtered(lambda so: so.state in ('sale', 'done')) + if confirmed_orders: + confirmed_orders._force_lines_to_invoice_policy_order() + invoices = confirmed_orders._create_invoices() + trans.invoice_ids = [(6, 0, invoices.ids)] @api.model def _compute_reference_prefix(self, values): diff --git a/addons/sale/tests/test_sale_transaction.py b/addons/sale/tests/test_sale_transaction.py index cd7c5dad4f7378760fdd0f2209caf5fffb36e99a..8bc551302341ce681142402eb694a481bfacefd6 100644 --- a/addons/sale/tests/test_sale_transaction.py +++ b/addons/sale/tests/test_sale_transaction.py @@ -58,3 +58,17 @@ class TestSaleTransaction(AccountTestInvoicingCommon): with mute_logger('odoo.addons.sale.models.payment'): self.transaction._post_process_after_done() self.assertEqual(self.order.state, 'draft', 'a transaction for an incorrect amount should not validate a quote') + + def test_sale_transaction_partial_delivery(self): + """Test that with automatic invoice and invoicing policy based on delivered quantity, a transaction for the partial + amount does not validate the SO.""" + # set automatic invoice + self.env['ir.config_parameter'].sudo().set_param('sale.automatic_invoice', 'True') + # modify order total + self.order.order_line[0].price_unit = 200.0 + # invoicing policy is based on delivered quantity + self.product_a.invoice_policy = 'delivery' + self.transaction._set_transaction_done() + with mute_logger('odoo.addons.sale.models.payment'): + self.transaction.sudo()._post_process_after_done() + self.assertEqual(self.order.state, 'draft', 'a partial transaction with automatic invoice and invoice_policy = delivery should not validate a quote')