Skip to content
Extraits de code Groupes Projets
Valider 30e26ea0 rédigé par Benjamin - Le Filament's avatar Benjamin - Le Filament
Parcourir les fichiers

[add] banking mandate change from mandate form for draft and open invoices

parent 5e90d839
Branches
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -10,6 +10,7 @@
"installable": True,
"depends": [
"account",
"account_banking_mandate",
"account_banking_sepa_direct_debit",
"account_payment_order",
"cgscop_account",
......@@ -19,6 +20,7 @@
],
"data": [
"security/ir.model.access.csv",
"views/account_banking_mandate.xml",
"views/account_move.xml",
"views/account_payment_order.xml",
"views/account_payment_line.xml",
......@@ -26,6 +28,7 @@
"views/res_partner.xml",
"report/scop_contribution_report.xml",
"wizard/account_payment_line_create_view.xml",
"wizard/account_banking_mandate_change_wizard.xml",
],
"qweb": [
"static/src/xml/*.xml",
......
# © 2019 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 account_payment_order
from . import chart_template
......
# © 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_invoice_mandate(self):
return {
"name": "Affectation du nouveau mandat",
"type": "ir.actions.act_window",
"res_model": "account.banking.mandate.change.wizard",
"views": [[False, "form"]],
"target": "new",
}
# ------------------------------------------------------
# Business functions
# ------------------------------------------------------
def _select_open_invoices(self):
self.ensure_one()
invoice_ids = self.env["account.move"].search(
[
("partner_id", "=", self.partner_id.id),
("move_type", "in", ("out_invoice", "out_refund")),
("state", "in", ("draft", "posted")),
("payment_state", "in", ("draft", "not_paid", "partial")),
]
)
return invoice_ids
def _change_invoice_mandate(self, invoice):
"""
Affecte le mandat courant pur la facture passée en paramètre
:param invoice : objet account.move
"""
payment_mode = self.env["account.payment.mode"].search(
[("payment_method_id.code", "=", "sepa_direct_debit")]
)
invoice.update(
{
"payment_mode_id": payment_mode.id,
"partner_bank_id": self.partner_bank_id.id,
"mandate_id": self.id,
}
)
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_scop_contribution_report_user,access_scop_contribution_report_user,model_scop_contribution_report,base.group_user,1,0,0,0
access_account_banking_mandate_change_wizard,access_account_banking_mandate_change_wizard,model_account_banking_mandate_change_wizard,account.group_account_manager,1,1,1,1
<?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_form_inherit" model="ir.ui.view">
<field name="name">scop.view.mandate.form</field>
<field name="model">account.banking.mandate</field>
<field name="inherit_id" ref="account_banking_mandate.view_mandate_form" />
<field name="priority" eval="90" />
<field name="arch" type="xml">
<xpath expr="//group[@name='main']" position="before">
<div class="col-12 mt16 mb16" name="change_mandate_button">
<button
name="set_invoice_mandate"
type="object"
class="btn-outline-info"
string="Affecter ce mandat aux factures ouvertes"
attrs="{'invisible': [('state', '!=', 'valid')]}"
/>
</div>
</xpath>
</field>
</record>
</data>
</odoo>
# © 2020 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_change_wizard
from . import account_move_reversal
from . import account_payment_line_create
# © 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.wizard"
_description = "Wizard changement mandat"
@api.model
def _default_mandate_id(self):
return self.env.context.get("active_id")
@api.model
def _default_invoice_ids(self):
invoice_ids = (
self.env["account.banking.mandate"]
.browse(self.env.context.get("active_id"))
._select_open_invoices()
)
return invoice_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")
invoice_ids = fields.Many2many(
comodel_name="account.move",
string="Factures",
default=_default_invoice_ids,
)
def change_mandate(self):
for invoice in self.invoice_ids:
self.mandate_id._change_invoice_mandate(invoice)
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record id="account_banking_mandate_change_wizard_form" model="ir.ui.view">
<field name="name">account.banking.mandate.change.wizard.form</field>
<field name="model">account.banking.mandate.change.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="invoice_ids" />
<field
name="invoice_ids"
mode="tree"
domain="[('partner_id', '=', partner_id), ('state', 'in', ('draft', 'posted')), ('payment_state', 'in', ('draft', 'not_paid', 'partial')), ('move_type', 'in', ('out_invoice', 'out_refund'))]"
>
<tree
editable="bottom"
create="0"
edit="0"
delete="1"
decoration-info="state == 'draft'"
>
<field name="partner_id" invisible="1" />
<field name="name" decoration-bf="1" />
<field name="partner_member_number" />
<field name="invoice_date" />
<field
name="invoice_partner_display_name"
string="Partenaire"
/>
<field name="invoice_date_due" />
<field name="amount_untaxed_signed" string="Total HT" />
<field
name="amount_total_signed"
decoration-bf="1"
string="Total TTC"
/>
<field
name="state"
widget="badge"
decoration-success="state == 'posted'"
decoration-info="state == 'draft'"
/>
<field
name="payment_state"
widget="badge"
decoration-danger="payment_state == 'not_paid'"
decoration-warning="payment_state in ('partial', 'in_payment')"
decoration-success="payment_state in ('paid', 'reversed')"
/>
<field name="currency_id" invisible="1" />
<field name="company_currency_id" invisible="1" />
<field name="company_id" invisible="1" />
</tree>
</field>
<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>
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter