details:   https://code.tryton.org/tryton/commit/5492328ef6dd
branch:    default
user:      Cédric Krier <[email protected]>
date:      Thu Jul 16 15:58:16 2026 +0200
description:
        Warn when resetting to draft or cancelling production with pending 
purchase lines
diffstat:

 modules/production_outsourcing/message.xml   |   6 +++
 modules/production_outsourcing/production.py |  44 +++++++++++++++++++++++++--
 2 files changed, 46 insertions(+), 4 deletions(-)

diffs (79 lines):

diff -r 0985df4c4cf2 -r 5492328ef6dd modules/production_outsourcing/message.xml
--- a/modules/production_outsourcing/message.xml        Thu Jul 16 15:57:11 
2026 +0200
+++ b/modules/production_outsourcing/message.xml        Thu Jul 16 15:58:16 
2026 +0200
@@ -3,6 +3,12 @@
 this repository contains the full copyright notices and license terms. -->
 <tryton>
     <data grouped="1">
+        <record model="ir.message" id="msg_pending_purchase_draft">
+            <field name="text">The productions "%(productions)s" cannot be 
reset to draft as they have pending purchases.</field>
+        </record>
+        <record model="ir.message" id="msg_pending_purchase_cancel">
+            <field name="text">The productions "%(productions)s" cannot be 
cancelled as they have pending purchases.</field>
+        </record>
         <record model="ir.message" id="msg_pending_purchase_done">
             <field name="text">The productions "%(productions)s" cannot be 
processed as they have pending purchases.</field>
         </record>
diff -r 0985df4c4cf2 -r 5492328ef6dd 
modules/production_outsourcing/production.py
--- a/modules/production_outsourcing/production.py      Thu Jul 16 15:57:11 
2026 +0200
+++ b/modules/production_outsourcing/production.py      Thu Jul 16 15:58:16 
2026 +0200
@@ -130,9 +130,27 @@
     def draft(cls, productions):
         pool = Pool()
         PurchaseLine = pool.get('purchase.line')
+        Warning = pool.get('res.user.warning')
         super().draft(productions)
-        PurchaseLine.delete([l for p in productions for l in p.purchase_lines
-                if l.purchase_state in {'draft', 'cancelled'}])
+        to_delete, pendings = [], set()
+        for production in productions:
+            for line in production.purchase_lines:
+                if line.purchase_state in {'draft', 'cancelled'}:
+                    to_delete.append(line)
+                else:
+                    pendings.add(production)
+        if pendings:
+            names = ', '.join(p.rec_name for p in pendings[:5])
+            if len(pendings) > 5:
+                names += '...'
+            warning_name = Warning.format('pending_purchase.draft', pendings)
+            if Warning.check(warning_name):
+                raise PurchaseWarning(
+                    warning_name,
+                    gettext(
+                        'production_outsourcing.msg_pending_purchase_draft',
+                        productions=names))
+        PurchaseLine.delete(to_delete)
 
     @classmethod
     @ModelView.button
@@ -140,9 +158,27 @@
     def cancel(cls, productions):
         pool = Pool()
         PurchaseLine = pool.get('purchase.line')
+        Warning = pool.get('res.user.warning')
         super().cancel(productions)
-        PurchaseLine.delete([l for p in productions for l in p.purchase_lines
-                if l.purchase_state in {'draft', 'cancelled'}])
+        to_delete, pendings = [], set()
+        for production in productions:
+            for line in production.purchase_lines:
+                if line.purchase_state in {'draft', 'cancelled'}:
+                    to_delete.append(line)
+                else:
+                    pendings.add(production)
+        if pendings:
+            names = ', '.join(p.rec_name for p in pendings[:5])
+            if len(pendings) > 5:
+                names += '...'
+            warning_name = Warning.format('pending_purchase.cancel', pendings)
+            if Warning.check(warning_name):
+                raise PurchaseWarning(
+                    warning_name,
+                    gettext(
+                        'production_outsourcing.msg_pending_purchase_cancel',
+                        productions=names))
+        PurchaseLine.delete(to_delete)
 
     @classmethod
     @ModelView.button

Reply via email to