From 030fb41717120c4f51a814ef5a9b339871e35805 Mon Sep 17 00:00:00 2001 From: benjamin <benjamin@le-filament.com> Date: Thu, 6 Jun 2024 10:45:27 +0200 Subject: [PATCH] [UPD] add remove mandate functions --- models/account_banking_mandate.py | 36 +++++++++++++++---- views/account_banking_mandate.xml | 10 ++++++ wizard/__init__.py | 1 + .../account_banking_mandate_change_wizard.py | 7 ++-- .../account_banking_mandate_change_wizard.xml | 11 ++++++ wizard/scop_deces_wizard.py | 29 +++++++++++++++ 6 files changed, 85 insertions(+), 9 deletions(-) create mode 100644 wizard/scop_deces_wizard.py diff --git a/models/account_banking_mandate.py b/models/account_banking_mandate.py index 052afb5..6de4846 100644 --- a/models/account_banking_mandate.py +++ b/models/account_banking_mandate.py @@ -44,7 +44,7 @@ class AccountBankingMandate(models.Model): ) return invoice_ids - def _change_invoice_mandate(self, invoice): + def _change_invoice_mandate(self, invoice_ids): """ Affecte le mandat courant pur la facture passée en paramètre :param invoice : objet account.move @@ -54,10 +54,32 @@ class AccountBankingMandate(models.Model): ) if not payment_mode: raise UserError(_("Aucun mode de prélèvement SEPA configuré.")) - invoice.update( - { - "payment_mode_id": payment_mode.id, - "partner_bank_id": self.partner_bank_id.id, - "mandate_id": self.id, - } + + for invoice in invoice_ids: + invoice.update( + { + "payment_mode_id": payment_mode.id, + "partner_bank_id": self.partner_bank_id.id, + "mandate_id": self.id, + } + ) + + def _remove_invoice_mandate(self, invoice_ids): + """ + Supprime le mandat courant pur la facture passée en paramètre + :param invoice : objet account.move + """ + payment_mode = self.env["account.payment.mode"].search( + [("name", "ilike", "Virement")] ) + if not payment_mode: + raise UserError(_("Aucun mode de paiement 'Virement' configuré.")) + for invoice in invoice_ids: + invoice.update( + { + "payment_mode_id": payment_mode.id, + "partner_bank_id": False, + "mandate_id": False, + } + ) + self.partner_id.customer_payment_mode_id = payment_mode diff --git a/views/account_banking_mandate.xml b/views/account_banking_mandate.xml index 8f7189d..4e7a24a 100644 --- a/views/account_banking_mandate.xml +++ b/views/account_banking_mandate.xml @@ -26,8 +26,18 @@ class="btn-outline-info" style="margin-left: 15px;" string="Affecter ce mandat aux factures ouvertes" + context="{'action_type': 'update_mandate'}" attrs="{'invisible': [('state', '!=', 'valid')]}" /> + <button + name="set_invoice_mandate" + type="object" + class="btn-outline-danger" + style="margin-left: 15px;" + string="Affecter 'Virement' aux factures et cotisations ouvertes" + context="{'action_type': 'remove_mandate'}" + attrs="{'invisible': [('state', 'not in', ['expired', 'cancel'])]}" + /> </div> </xpath> </field> diff --git a/wizard/__init__.py b/wizard/__init__.py index e0feed5..7ba516d 100644 --- a/wizard/__init__.py +++ b/wizard/__init__.py @@ -4,3 +4,4 @@ from . import account_banking_mandate_change_wizard from . import account_move_reversal from . import account_payment_line_create +from . import scop_deces_wizard diff --git a/wizard/account_banking_mandate_change_wizard.py b/wizard/account_banking_mandate_change_wizard.py index 45fafcb..a7a5a54 100644 --- a/wizard/account_banking_mandate_change_wizard.py +++ b/wizard/account_banking_mandate_change_wizard.py @@ -35,5 +35,8 @@ class AccountBankingMandateChange(models.TransientModel): ) def change_mandate(self): - for invoice in self.invoice_ids: - self.mandate_id._change_invoice_mandate(invoice) + if self.env.context.get("action_type") == "update_mandate": + self.mandate_id._change_invoice_mandate(self.invoice_ids) + + elif self.env.context.get("action_type") == "remove_mandate": + self.mandate_id._remove_invoice_mandate(self.invoice_ids) diff --git a/wizard/account_banking_mandate_change_wizard.xml b/wizard/account_banking_mandate_change_wizard.xml index b3ebc09..2e796d1 100644 --- a/wizard/account_banking_mandate_change_wizard.xml +++ b/wizard/account_banking_mandate_change_wizard.xml @@ -32,6 +32,8 @@ string="Partenaire" /> <field name="invoice_date_due" /> + <field name="payment_mode_id" optional="show" /> + <field name="mandate_id" optional="show" /> <field name="amount_untaxed_signed" string="Total HT" /> <field name="amount_total_signed" @@ -63,6 +65,15 @@ string="Affecter le mandat" class="btn-primary" confirm="Valider le changement de mandat ?" + invisible="context.get('action_type') != 'update_mandate'" + /> + <button + name="change_mandate" + type="object" + string="Supprimer le mandat" + class="btn-danger" + confirm="Valider la suppression des mandats et le passage en virement ?" + invisible="context.get('action_type') != 'remove_mandate'" /> <button special="cancel" string="Cancel" /> </footer> diff --git a/wizard/scop_deces_wizard.py b/wizard/scop_deces_wizard.py new file mode 100644 index 0000000..d2954c0 --- /dev/null +++ b/wizard/scop_deces_wizard.py @@ -0,0 +1,29 @@ +# © 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 ScopDecesWizard(models.TransientModel): + _inherit = "scop.deces.wizard" + + def deces_action(self): + super().deces_action() + partner_id = self.env["res.partner"].browse(self.partner_id) + mandate_ids = self.env["account.banking.mandate"].search( + [ + ("partner_id", "=", partner_id.id), + ("state", "=", "valid"), + ("company_id", "=", self.env.company.id), + ] + ) + if mandate_ids: + for mandate in mandate_ids: + mandate.update({"state": "expired"}) + invoice_ids = self.env["account.move"].search([ + ("mandate_id", "=", mandate.id), + ("move_type", "in", ("out_invoice", "out_refund")), + ("state", "in", ("draft", "posted")), + ("payment_state", "in", ("draft", "not_paid", "partial")), + ]) + mandate._remove_invoice_mandate(invoice_ids) -- GitLab