From 08094b7caca3d7bd8f88afaa21660d3626250075 Mon Sep 17 00:00:00 2001
From: benjamin <benjamin@le-filament.com>
Date: Thu, 15 Sep 2022 15:34:07 +0200
Subject: [PATCH] [add] banking mandate change from mandate form for draft and
 open bordereau

---
 __manifest__.py                            |  2 +
 models/__init__.py                         |  1 +
 models/account_banking_mandate.py          | 54 ++++++++++++++++++++++
 security/ir.model.access.csv               |  1 +
 views/account_banking_mandate.xml          | 29 ++++++++++++
 wizard/__init__.py                         |  1 +
 wizard/mandate_change_bordereau_wizard.py  | 40 ++++++++++++++++
 wizard/mandate_change_bordereau_wizard.xml | 37 +++++++++++++++
 8 files changed, 165 insertions(+)
 create mode 100644 models/account_banking_mandate.py
 create mode 100644 views/account_banking_mandate.xml
 create mode 100644 wizard/mandate_change_bordereau_wizard.py
 create mode 100644 wizard/mandate_change_bordereau_wizard.xml

diff --git a/__manifest__.py b/__manifest__.py
index 64b1d36..573139b 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -31,6 +31,7 @@
         "templates/report_scop_bordereau_refund.xml",
         "templates/report_union_sociale.xml",
         # Views
+        "views/account_banking_mandate.xml",
         "views/account_move.xml",
         "views/res_config_settings.xml",
         "views/scop_cotisation_cg.xml",
@@ -40,6 +41,7 @@
         "report/scop_contribution_report.xml",
         # Wizards
         "wizard/export_journal_wizard_view.xml",
+        "wizard/mandate_change_bordereau_wizard.xml",
         "wizard/scop_cotisation_cg_regul_wizard.xml",
         "wizard/scop_bordereau_update_liasse_wizard.xml",
         "wizard/scop_bordereau_payment_mode_wizard.xml",
diff --git a/models/__init__.py b/models/__init__.py
index 872bf77..5694e7b 100644
--- a/models/__init__.py
+++ b/models/__init__.py
@@ -1,6 +1,7 @@
 # © 2021 Le Filament (<http://www.le-filament.com>)
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 
+from . import account_banking_mandate
 from . import account_move
 from . import res_company
 from . import res_config_settings
diff --git a/models/account_banking_mandate.py b/models/account_banking_mandate.py
new file mode 100644
index 0000000..44eb99c
--- /dev/null
+++ b/models/account_banking_mandate.py
@@ -0,0 +1,54 @@
+# © 2020 Le Filament (<http://www.le-filament.com>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo import models
+
+
+class AccountBankingMandate(models.Model):
+    _inherit = "account.banking.mandate"
+
+    # ------------------------------------------------------
+    # Button functions
+    # ------------------------------------------------------
+    def set_bordereau_mandate(self):
+        return {
+            "name": "Affectation du nouveau mandat",
+            "type": "ir.actions.act_window",
+            "res_model": "account.banking.mandate.change.bordereau.wizard",
+            "views": [[False, "form"]],
+            "target": "new",
+        }
+
+    # ------------------------------------------------------
+    # Business functions
+    # ------------------------------------------------------
+    def _select_open_bordereau(self):
+        self.ensure_one()
+        bordereau_ids = self.env["scop.bordereau"].search(
+            [
+                ("partner_id", "=", self.partner_id.id),
+                ("state", "not in", ("paid", "cancel")),
+            ]
+        )
+        return bordereau_ids
+
+    def _change_bordereau_mandate(self, bordereau):
+        """
+        Affecte le mandat courant pur le bordereau passé en paramètre
+        et les factures associées
+        :param bordereau : objet scop.bordereau
+        """
+        payment_mode = self.env["account.payment.mode"].search(
+            [("payment_method_id.code", "=", "sepa_direct_debit")]
+        )
+        bordereau.update(
+            {
+                "payment_mode_id": payment_mode.id,
+            }
+        )
+        invoice_ids = bordereau.invoice_ids.filtered(
+            lambda i: i.state in ("draft", "posted")
+            and i.payment_state in ("draft", "not_paid", "partial")
+        )
+        for invoice in invoice_ids:
+            self._change_invoice_mandate(invoice)
diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv
index 7c925ce..3bb8d51 100644
--- a/security/ir.model.access.csv
+++ b/security/ir.model.access.csv
@@ -17,3 +17,4 @@ access_scop_cotisation_cg_wizard,access_scop_cotisation_cg_wizard,model_scop_cot
 access_export_journal_cg_wizard,access_export_journal_cg_wizard,model_export_journal_cg_wizard,base.group_user,1,1,1,1
 access_scop_bordereau_change_liasse_wizard,access_scop_bordereau_change_liasse_wizard,model_scop_bordereau_change_liasse_wizard,base.group_user,1,1,1,1
 access_scop_bordereau_change_payment_mode_wizard,access_scop_bordereau_change_payment_mode_wizard,model_scop_bordereau_change_payment_mode_wizard,base.group_user,1,1,1,1
+access_account_banking_mandate_change_bordereau_wizard,access_account_banking_mandate_change_bordereau_wizard,model_account_banking_mandate_change_bordereau_wizard,cgscop_cotisation_cg.group_cotisation_cg_administrative,1,1,1,1
diff --git a/views/account_banking_mandate.xml b/views/account_banking_mandate.xml
new file mode 100644
index 0000000..98b2076
--- /dev/null
+++ b/views/account_banking_mandate.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <!--  Copyright 2020 Le Filament
+          License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).  -->
+    <data>
+
+        <record id="view_mandate_cg_form_inherit" model="ir.ui.view">
+            <field name="name">scop.cg.view.mandate.form</field>
+            <field name="model">account.banking.mandate</field>
+            <field
+                name="inherit_id"
+                ref="cgscop_cotisation.view_mandate_form_inherit"
+            />
+            <field name="priority" eval="90" />
+            <field name="arch" type="xml">
+                <xpath expr="//div[@name='change_mandate_button']" position="inside">
+                    <button
+                        name="set_bordereau_mandate"
+                        type="object"
+                        class="btn-outline-info"
+                        string="Affecter ce mandat aux bordereaux"
+                        style="margin-left: 15px; margin-right: 15px;"
+                        attrs="{'invisible': ['|', ('state', '!=', 'valid'), ('company_id', '!=', 1)]}"
+                    />
+                </xpath>
+            </field>
+        </record>
+    </data>
+</odoo>
diff --git a/wizard/__init__.py b/wizard/__init__.py
index be42db4..3a73f47 100644
--- a/wizard/__init__.py
+++ b/wizard/__init__.py
@@ -3,6 +3,7 @@
 
 from . import account_move_reversal
 from . import export_journal_wizard
+from . import mandate_change_bordereau_wizard
 from . import scop_bordereau_update_liasse_wizard
 from . import scop_bordereau_payment_mode_wizard
 from . import scop_bordereau_refund_wizard
diff --git a/wizard/mandate_change_bordereau_wizard.py b/wizard/mandate_change_bordereau_wizard.py
new file mode 100644
index 0000000..b332ccb
--- /dev/null
+++ b/wizard/mandate_change_bordereau_wizard.py
@@ -0,0 +1,40 @@
+# © 2020 Le Filament (<http://www.le-filament.com>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo import api, fields, models
+
+
+class AccountBankingMandateChange(models.TransientModel):
+    _name = "account.banking.mandate.change.bordereau.wizard"
+    _description = "Wizard changement mandat bordereaux"
+
+    @api.model
+    def _default_mandate_id(self):
+        return self.env.context.get("active_id")
+
+    @api.model
+    def _default_bordereau_ids(self):
+        bordereau_ids = (
+            self.env["account.banking.mandate"]
+            .browse(self.env.context.get("active_id"))
+            ._select_open_bordereau()
+        )
+        return bordereau_ids
+
+    mandate_id = fields.Many2one(
+        comodel_name="account.banking.mandate",
+        string="Mandat",
+        default=_default_mandate_id,
+        required=True,
+    )
+    partner_id = fields.Many2one(related="mandate_id.partner_id")
+    bordereau_ids = fields.Many2many(
+        relation="mandate_change_bordereau_wizard_scop_bordereau_rel",
+        comodel_name="scop.bordereau",
+        string="Bordereaux",
+        default=_default_bordereau_ids,
+    )
+
+    def change_mandate(self):
+        for bordereau in self.bordereau_ids:
+            self.mandate_id._change_bordereau_mandate(bordereau)
diff --git a/wizard/mandate_change_bordereau_wizard.xml b/wizard/mandate_change_bordereau_wizard.xml
new file mode 100644
index 0000000..8e798ae
--- /dev/null
+++ b/wizard/mandate_change_bordereau_wizard.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <data>
+        <record
+            id="account_banking_mandate_change_bordereau_wizard_form"
+            model="ir.ui.view"
+        >
+            <field
+                name="name"
+            >account.banking.mandate.change.bordereau.wizard.form</field>
+            <field name="model">account.banking.mandate.change.bordereau.wizard</field>
+            <field name="arch" type="xml">
+                <form string="Changement de mandat">
+                    <group>
+                        <field name="partner_id" invisible="1" />
+                        <field name="mandate_id" readonly="1" />
+                    </group>
+                    <label for="bordereau_ids" />
+                    <field
+                        name="bordereau_ids"
+                        domain="[('partner_id', '=', partner_id), ('state', 'not in', ('paid', 'cancel'))]"
+                    />
+                    <footer>
+                        <button
+                            name="change_mandate"
+                            type="object"
+                            string="Affecter le mandat"
+                            class="btn-primary"
+                            confirm="Valider le changement de mandat ?"
+                        />
+                        <button special="cancel" string="Cancel" />
+                    </footer>
+                </form>
+            </field>
+        </record>
+    </data>
+</odoo>
-- 
GitLab