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')