diff --git a/models/account_banking_mandate.py b/models/account_banking_mandate.py index 052afb5699ae64c1e34e83e06e4da4670bfa8287..6de48460685bbaf08960708a90c79e2082d937e9 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 8f7189dc362bbb6b77452db959fa6d28a01811c6..4e7a24a38a14c0e4499fd8ab708c93b49634b658 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 e0feed5416fab7eb083ee6cee672ffb42d5c700f..7ba516d5fb8846cac5148ab8d7baa7fe622ad4e4 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 45fafcbc6e3339ef4fb1bbe9d8e870d98505771e..a7a5a54d62b8e0f0253829b178fb27eb83a3e783 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 b3ebc0909444e62e59b999648d14d3aac332c463..2e796d1d361f911fc1a00b78b4ad03919a56670c 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 0000000000000000000000000000000000000000..d2954c0b3ea0b3f2c7ab883dd9a93c4425ec296a --- /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)