From b608f6097c853ed990c02974f236596458e0a9bd Mon Sep 17 00:00:00 2001
From: benjamin <benjamin@le-filament.com>
Date: Tue, 21 Mar 2023 12:04:14 +0100
Subject: [PATCH] [update] wizard update bordereau payment mode

---
 wizard/scop_bordereau_payment_mode_wizard.py | 44 +++++++++++++-------
 1 file changed, 29 insertions(+), 15 deletions(-)

diff --git a/wizard/scop_bordereau_payment_mode_wizard.py b/wizard/scop_bordereau_payment_mode_wizard.py
index 14877f2..17d7490 100644
--- a/wizard/scop_bordereau_payment_mode_wizard.py
+++ b/wizard/scop_bordereau_payment_mode_wizard.py
@@ -1,7 +1,8 @@
 # Copyright 2021 Le Filament
 # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
 
-from odoo import fields, models
+from odoo import _, fields, models
+from odoo.exceptions import UserError
 
 
 class ScopBordereauChangePaymentMode(models.TransientModel):
@@ -35,35 +36,49 @@ class ScopBordereauChangePaymentMode(models.TransientModel):
     # ------------------------------------------------------
     def action_change_payment_mode(self):
         bordereau_id = self.bordereau_id
-        # Link new liasse fiscale to bordereau
         if self.change_type == "all":
+            # Affecte le mode de paiement par défaut au contact
             bordereau_id.partner_id.update(
                 {
                     "customer_payment_mode_id": self.payment_mode_id.id,
                 }
             )
-        bordereau_id.update(
-            {
-                "payment_mode_id": self.payment_mode_id.id,
-            }
-        )
-        bordereau_id.invoice_ids.update(
-            {
-                "payment_mode_id": self.payment_mode_id.id,
-            }
-        )
-        bordereau_id.invoice_ids.set_mandate()
+            # Recherche les bordereaux non payés
+            bordereau_ids = self.env["scop.bordereau"].search([
+                ("partner_id", "=", bordereau_id.partner_id.id),
+                ("state", "not in", ["paid", "cancel"]),
+            ])
+            # Recherche les factures liées aux bordereaux non payées
+            invoice_ids = bordereau_ids.mapped("invoice_ids").filtered(
+                lambda i: i.payment_state not in ["paid", "reversed"])
+        else:
+            bordereau_ids = bordereau_id
+            invoice_ids = bordereau_id.invoice_ids.filtered(
+                lambda i: i.payment_state not in ["paid", "reversed"])
+            if not invoice_ids:
+                raise UserError(_(
+                    "Tous les appels liés à ce bordereau sont payés, il n'est pas possible "
+                    "de modifier le mode de paiement"
+                ))
+
+        # Met à jour le mode de paiement sur les bordereaux
+        bordereau_ids.update({"payment_mode_id": self.payment_mode_id.id})
+        # Met à jour le mode de paiement sur les factures et attribue le mandat
+        invoice_ids.update({"payment_mode_id": self.payment_mode_id.id})
+        invoice_ids.set_mandate()
 
         journal_ids = [
             self.env.user.company_id.contribution_journal_id.id,
             self.env.user.company_id.journal_fede_com_id.id,
             self.env.user.company_id.journal_fede_cae_id.id,
+            self.env.user.company_id.journal_fede_indus_id.id,
             self.env.user.company_id.journal_ur_hdf_id.id,
             self.env.user.company_id.journal_ur_med_id.id,
         ]
+        # Met à jour le mode de paiement sur les écritures comptables
         move_line_ids = self.env["account.move.line"].search(
             [
-                ("partner_id", "=", self.bordereau_id.partner_id.id),
+                ("move_id", "in", invoice_ids.ids),
                 ("journal_id", "in", journal_ids),
                 ("full_reconcile_id", "=", False),
                 ("balance", "!=", 0),
@@ -71,7 +86,6 @@ class ScopBordereauChangePaymentMode(models.TransientModel):
                 ("account_id.internal_type", "=", "receivable"),
             ]
         )
-
         move_line_ids.update(
             {
                 "payment_mode_id": self.payment_mode_id.id,
-- 
GitLab