diff --git a/account_banking_mandate/__init__.py b/account_banking_mandate/__init__.py index a9e337226..0650744f6 100644 --- a/account_banking_mandate/__init__.py +++ b/account_banking_mandate/__init__.py @@ -1,2 +1 @@ - from . import models diff --git a/account_banking_mandate/__manifest__.py b/account_banking_mandate/__manifest__.py index c38f7a1ce..a92f895c2 100644 --- a/account_banking_mandate/__manifest__.py +++ b/account_banking_mandate/__manifest__.py @@ -5,31 +5,29 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { - 'name': 'Account Banking Mandate', - 'summary': 'Banking mandates', - 'version': '12.0.2.0.0', - 'license': 'AGPL-3', - 'author': "Compassion CH, " - "Tecnativa, " - "Akretion, " - "Odoo Community Association (OCA)", - 'website': 'https://github.com/OCA/bank-payment', - 'category': 'Banking addons', - 'depends': [ - 'account_payment_order', + "name": "Account Banking Mandate", + "summary": "Banking mandates", + "version": "12.0.2.0.0", + "license": "AGPL-3", + "author": "Compassion CH, " + "Tecnativa, " + "Akretion, " + "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/bank-payment", + "category": "Banking addons", + "depends": ["account_payment_order"], + "data": [ + "views/account_banking_mandate_view.xml", + "views/account_payment_method.xml", + "views/account_invoice_view.xml", + "views/account_payment_line.xml", + "views/res_partner_bank_view.xml", + "views/res_partner.xml", + "views/bank_payment_line_view.xml", + "views/account_move_line.xml", + "data/mandate_reference_sequence.xml", + "security/mandate_security.xml", + "security/ir.model.access.csv", ], - 'data': [ - 'views/account_banking_mandate_view.xml', - 'views/account_payment_method.xml', - 'views/account_invoice_view.xml', - 'views/account_payment_line.xml', - 'views/res_partner_bank_view.xml', - 'views/res_partner.xml', - 'views/bank_payment_line_view.xml', - 'views/account_move_line.xml', - 'data/mandate_reference_sequence.xml', - 'security/mandate_security.xml', - 'security/ir.model.access.csv', - ], - 'installable': True, + "installable": True, } diff --git a/account_banking_mandate/data/mandate_reference_sequence.xml b/account_banking_mandate/data/mandate_reference_sequence.xml index cb6e2851f..6a83bb8b9 100644 --- a/account_banking_mandate/data/mandate_reference_sequence.xml +++ b/account_banking_mandate/data/mandate_reference_sequence.xml @@ -1,11 +1,9 @@ - + - - - DD Mandate Reference - account.banking.mandate - BM - - - + + DD Mandate Reference + account.banking.mandate + BM + + diff --git a/account_banking_mandate/migrations/12.0.2.0.0/post-migration.py b/account_banking_mandate/migrations/12.0.2.0.0/post-migration.py index 23a9b540e..0c30b3400 100644 --- a/account_banking_mandate/migrations/12.0.2.0.0/post-migration.py +++ b/account_banking_mandate/migrations/12.0.2.0.0/post-migration.py @@ -1,14 +1,13 @@ # Copyright 2019 Tecnativa - Pedro M. Baeza # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html -from openupgradelib import openupgrade -from openupgradelib import openupgrade_90 +from openupgradelib import openupgrade, openupgrade_90 @openupgrade.migrate(use_env=True) def migrate(env, version): - column = openupgrade.get_legacy_name('scan') - if openupgrade.column_exists(env.cr, 'account_banking_mandate', column): + column = openupgrade.get_legacy_name("scan") + if openupgrade.column_exists(env.cr, "account_banking_mandate", column): openupgrade_90.convert_binary_field_to_attachment( - env, {'account.banking.mandate': [('scan', None)]}, + env, {"account.banking.mandate": [("scan", None)]}, ) diff --git a/account_banking_mandate/migrations/12.0.2.0.0/pre-migration.py b/account_banking_mandate/migrations/12.0.2.0.0/pre-migration.py index ad0edfbfe..7b3e2f3be 100644 --- a/account_banking_mandate/migrations/12.0.2.0.0/pre-migration.py +++ b/account_banking_mandate/migrations/12.0.2.0.0/pre-migration.py @@ -4,13 +4,11 @@ from openupgradelib import openupgrade column_renames = { - 'account_banking_mandate': [ - ('scan', None), - ], + "account_banking_mandate": [("scan", None)], } @openupgrade.migrate() def migrate(env, version): - if openupgrade.column_exists(env.cr, 'account_banking_mandate', 'scan'): + if openupgrade.column_exists(env.cr, "account_banking_mandate", "scan"): openupgrade.rename_columns(env.cr, column_renames) diff --git a/account_banking_mandate/models/__init__.py b/account_banking_mandate/models/__init__.py index d7b014c69..f614e3fd0 100644 --- a/account_banking_mandate/models/__init__.py +++ b/account_banking_mandate/models/__init__.py @@ -1,4 +1,3 @@ - from . import account_banking_mandate from . import account_payment_method from . import account_invoice diff --git a/account_banking_mandate/models/account_banking_mandate.py b/account_banking_mandate/models/account_banking_mandate.py index 579be87a9..0046da86e 100644 --- a/account_banking_mandate/models/account_banking_mandate.py +++ b/account_banking_mandate/models/account_banking_mandate.py @@ -4,7 +4,7 @@ # Copyright 2020 Tecnativa - Carlos Dauden # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import models, fields, api, _ +from odoo import _, api, fields, models from odoo.exceptions import UserError, ValidationError @@ -13,71 +13,88 @@ class AccountBankingMandate(models.Model): authorization that the bank account owner gives to a company for a specific operation (such as direct debit) """ - _name = 'account.banking.mandate' + + _name = "account.banking.mandate" _description = "A generic banking mandate" - _inherit = ['mail.thread'] - _order = 'signature_date desc' + _inherit = ["mail.thread"] + _order = "signature_date desc" def _get_default_partner_bank_id_domain(self): - if 'default_partner_id' in self.env.context: - return [('partner_id', '=', self.env.context.get( - 'default_partner_id'))] + if "default_partner_id" in self.env.context: + return [("partner_id", "=", self.env.context.get("default_partner_id"))] else: return [] format = fields.Selection( - [('basic', 'Basic Mandate')], default='basic', required=True, - string='Mandate Format', track_visibility='onchange') + [("basic", "Basic Mandate")], + default="basic", + required=True, + string="Mandate Format", + track_visibility="onchange", + ) type = fields.Selection( - [('generic', 'Generic Mandate')], - string='Type of Mandate', - track_visibility='onchange' + [("generic", "Generic Mandate")], + string="Type of Mandate", + track_visibility="onchange", ) partner_bank_id = fields.Many2one( - comodel_name='res.partner.bank', string='Bank Account', - track_visibility='onchange', + comodel_name="res.partner.bank", + string="Bank Account", + track_visibility="onchange", domain=lambda self: self._get_default_partner_bank_id_domain(), - ondelete='restrict', + ondelete="restrict", index=True, ) partner_id = fields.Many2one( - comodel_name='res.partner', related='partner_bank_id.partner_id', - string='Partner', store=True, index=True) + comodel_name="res.partner", + related="partner_bank_id.partner_id", + string="Partner", + store=True, + index=True, + ) company_id = fields.Many2one( - comodel_name='res.company', string='Company', required=True, - default=lambda self: self.env['res.company']._company_default_get( - 'account.banking.mandate')) + comodel_name="res.company", + string="Company", + required=True, + default=lambda self: self.env["res.company"]._company_default_get( + "account.banking.mandate" + ), + ) unique_mandate_reference = fields.Char( - string='Unique Mandate Reference', track_visibility='onchange', - copy=False, + string="Unique Mandate Reference", track_visibility="onchange", copy=False, ) - signature_date = fields.Date(string='Date of Signature of the Mandate', - track_visibility='onchange') - scan = fields.Binary( - string='Scan of the Mandate', - attachment=True, + signature_date = fields.Date( + string="Date of Signature of the Mandate", track_visibility="onchange" ) - last_debit_date = fields.Date(string='Date of the Last Debit', - readonly=True) - state = fields.Selection([ - ('draft', 'Draft'), - ('valid', 'Valid'), - ('expired', 'Expired'), - ('cancel', 'Cancelled'), - ], string='Status', default='draft', track_visibility='onchange', + scan = fields.Binary(string="Scan of the Mandate", attachment=True,) + last_debit_date = fields.Date(string="Date of the Last Debit", readonly=True) + state = fields.Selection( + [ + ("draft", "Draft"), + ("valid", "Valid"), + ("expired", "Expired"), + ("cancel", "Cancelled"), + ], + string="Status", + default="draft", + track_visibility="onchange", help="Only valid mandates can be used in a payment line. A cancelled " - "mandate is a mandate that has been cancelled by the customer.") - payment_line_ids = fields.One2many( - comodel_name='account.payment.line', inverse_name='mandate_id', - string="Related Payment Lines") - payment_line_ids_count = fields.Integer( - compute='_compute_payment_line_ids_count', + "mandate is a mandate that has been cancelled by the customer.", ) + payment_line_ids = fields.One2many( + comodel_name="account.payment.line", + inverse_name="mandate_id", + string="Related Payment Lines", + ) + payment_line_ids_count = fields.Integer(compute="_compute_payment_line_ids_count",) - _sql_constraints = [( - 'mandate_ref_company_uniq', - 'unique(unique_mandate_reference, company_id)', - 'A Mandate with the same reference already exists for this company!')] + _sql_constraints = [ + ( + "mandate_ref_company_uniq", + "unique(unique_mandate_reference, company_id)", + "A Mandate with the same reference already exists for this company!", + ) + ] def name_get(self): result = [] @@ -85,25 +102,23 @@ class AccountBankingMandate(models.Model): name = mandate.unique_mandate_reference acc_number = mandate.partner_bank_id.acc_number if acc_number: - name = '{} [...{}]'.format(name, acc_number[-4:]) + name = "{} [...{}]".format(name, acc_number[-4:]) result.append((mandate.id, name)) return result @api.multi - @api.depends('payment_line_ids') + @api.depends("payment_line_ids") def _compute_payment_line_ids_count(self): - payment_line_model = self.env['account.payment.line'] - domain = [('mandate_id', 'in', self.ids)] + payment_line_model = self.env["account.payment.line"] + domain = [("mandate_id", "in", self.ids)] res = payment_line_model.read_group( - domain=domain, - fields=['mandate_id'], - groupby=['mandate_id'], + domain=domain, fields=["mandate_id"], groupby=["mandate_id"], ) payment_line_dict = {} for dic in res: - mandate_id = dic['mandate_id'][0] + mandate_id = dic["mandate_id"][0] payment_line_dict.setdefault(mandate_id, 0) - payment_line_dict[mandate_id] += dic['mandate_id_count'] + payment_line_dict[mandate_id] += dic["mandate_id_count"] for rec in self: rec.payment_line_ids_count = payment_line_dict.get(rec.id, 0) @@ -111,103 +126,166 @@ class AccountBankingMandate(models.Model): def show_payment_lines(self): self.ensure_one() return { - 'name': _("Payment lines"), - 'type': 'ir.actions.act_window', - 'view_mode': 'tree,form', - 'res_model': 'account.payment.line', - 'domain': [('mandate_id', '=', self.id)], + "name": _("Payment lines"), + "type": "ir.actions.act_window", + "view_mode": "tree,form", + "res_model": "account.payment.line", + "domain": [("mandate_id", "=", self.id)], } @api.multi - @api.constrains('signature_date', 'last_debit_date') + @api.constrains("signature_date", "last_debit_date") def _check_dates(self): for mandate in self: - if (mandate.signature_date and - mandate.signature_date > fields.Date.context_today( - mandate)): + if ( + mandate.signature_date + and mandate.signature_date > fields.Date.context_today(mandate) + ): raise ValidationError( - _("The date of signature of mandate '%s' " - "is in the future!") - % mandate.unique_mandate_reference) - if (mandate.signature_date and mandate.last_debit_date and - mandate.signature_date > mandate.last_debit_date): + _("The date of signature of mandate '%s' " "is in the future!") + % mandate.unique_mandate_reference + ) + if ( + mandate.signature_date + and mandate.last_debit_date + and mandate.signature_date > mandate.last_debit_date + ): raise ValidationError( - _("The mandate '%s' can't have a date of last debit " - "before the date of signature." - ) % mandate.unique_mandate_reference) + _( + "The mandate '%s' can't have a date of last debit " + "before the date of signature." + ) + % mandate.unique_mandate_reference + ) - @api.constrains('company_id', 'payment_line_ids', 'partner_bank_id') + @api.constrains("company_id", "payment_line_ids", "partner_bank_id") def _company_constrains(self): for mandate in self: - if mandate.partner_bank_id.company_id and \ - mandate.partner_bank_id.company_id != mandate.company_id: + if ( + mandate.partner_bank_id.company_id + and mandate.partner_bank_id.company_id != mandate.company_id + ): raise ValidationError( - _("The company of the mandate %s differs from the " - "company of partner %s.") % - (mandate.display_name, mandate.partner_id.name)) + _( + "The company of the mandate %s differs from the " + "company of partner %s." + ) + % (mandate.display_name, mandate.partner_id.name) + ) - if self.env['account.payment.line'].sudo().search( - [('mandate_id', '=', mandate.id), - ('company_id', '!=', mandate.company_id.id)], limit=1): + if ( + self.env["account.payment.line"] + .sudo() + .search( + [ + ("mandate_id", "=", mandate.id), + ("company_id", "!=", mandate.company_id.id), + ], + limit=1, + ) + ): raise ValidationError( - _("You cannot change the company of mandate %s, " - "as there exists payment lines referencing it that " - "belong to another company.") % - (mandate.display_name, )) + _( + "You cannot change the company of mandate %s, " + "as there exists payment lines referencing it that " + "belong to another company." + ) + % (mandate.display_name,) + ) - if self.env['account.invoice'].sudo().search( - [('mandate_id', '=', mandate.id), - ('company_id', '!=', mandate.company_id.id)], limit=1): + if ( + self.env["account.invoice"] + .sudo() + .search( + [ + ("mandate_id", "=", mandate.id), + ("company_id", "!=", mandate.company_id.id), + ], + limit=1, + ) + ): raise ValidationError( - _("You cannot change the company of mandate %s, " - "as there exists invoices referencing it that belong to " - "another company.") % - (mandate.display_name, )) + _( + "You cannot change the company of mandate %s, " + "as there exists invoices referencing it that belong to " + "another company." + ) + % (mandate.display_name,) + ) - if self.env['account.move.line'].sudo().search( - [('mandate_id', '=', mandate.id), - ('company_id', '!=', mandate.company_id.id)], limit=1): + if ( + self.env["account.move.line"] + .sudo() + .search( + [ + ("mandate_id", "=", mandate.id), + ("company_id", "!=", mandate.company_id.id), + ], + limit=1, + ) + ): raise ValidationError( - _("You cannot change the company of mandate %s, " - "as there exists journal items referencing it that " - "belong to another company.") % - (mandate.display_name, )) + _( + "You cannot change the company of mandate %s, " + "as there exists journal items referencing it that " + "belong to another company." + ) + % (mandate.display_name,) + ) - if self.env['bank.payment.line'].sudo().search( - [('mandate_id', '=', mandate.id), - ('company_id', '!=', mandate.company_id.id)], limit=1): + if ( + self.env["bank.payment.line"] + .sudo() + .search( + [ + ("mandate_id", "=", mandate.id), + ("company_id", "!=", mandate.company_id.id), + ], + limit=1, + ) + ): raise ValidationError( - _("You cannot change the company of mandate %s, " - "as there exists bank payment lines referencing it that " - "belong to another company.") % - (mandate.display_name, )) + _( + "You cannot change the company of mandate %s, " + "as there exists bank payment lines referencing it that " + "belong to another company." + ) + % (mandate.display_name,) + ) @api.multi - @api.constrains('state', 'partner_bank_id', 'signature_date') + @api.constrains("state", "partner_bank_id", "signature_date") def _check_valid_state(self): for mandate in self: - if mandate.state == 'valid': + if mandate.state == "valid": if not mandate.signature_date: raise ValidationError( - _("Cannot validate the mandate '%s' without a date of " - "signature.") % mandate.unique_mandate_reference) + _( + "Cannot validate the mandate '%s' without a date of " + "signature." + ) + % mandate.unique_mandate_reference + ) if not mandate.partner_bank_id: raise ValidationError( - _("Cannot validate the mandate '%s' because it is not " - "attached to a bank account.") % - mandate.unique_mandate_reference) + _( + "Cannot validate the mandate '%s' because it is not " + "attached to a bank account." + ) + % mandate.unique_mandate_reference + ) @api.model def create(self, vals=None): - unique_mandate_reference = vals.get('unique_mandate_reference') - if not unique_mandate_reference or unique_mandate_reference == 'New': - vals['unique_mandate_reference'] = \ - self.env['ir.sequence'].next_by_code( - 'account.banking.mandate') or 'New' + unique_mandate_reference = vals.get("unique_mandate_reference") + if not unique_mandate_reference or unique_mandate_reference == "New": + vals["unique_mandate_reference"] = ( + self.env["ir.sequence"].next_by_code("account.banking.mandate") or "New" + ) return super(AccountBankingMandate, self).create(vals) @api.multi - @api.onchange('partner_bank_id') + @api.onchange("partner_bank_id") def mandate_partner_bank_change(self): for mandate in self: mandate.partner_id = mandate.partner_bank_id.partner_id @@ -215,19 +293,17 @@ class AccountBankingMandate(models.Model): @api.multi def validate(self): for mandate in self: - if mandate.state != 'draft': - raise UserError( - _('Mandate should be in draft state.')) - self.write({'state': 'valid'}) + if mandate.state != "draft": + raise UserError(_("Mandate should be in draft state.")) + self.write({"state": "valid"}) return True @api.multi def cancel(self): for mandate in self: - if mandate.state not in ('draft', 'valid'): - raise UserError( - _('Mandate should be in draft or valid state.')) - self.write({'state': 'cancel'}) + if mandate.state not in ("draft", "valid"): + raise UserError(_("Mandate should be in draft or valid state.")) + self.write({"state": "cancel"}) return True @api.multi @@ -236,8 +312,7 @@ class AccountBankingMandate(models.Model): This is for mandates cancelled by mistake. """ for mandate in self: - if mandate.state != 'cancel': - raise UserError( - _('Mandate should be in cancel state.')) - self.write({'state': 'draft'}) + if mandate.state != "cancel": + raise UserError(_("Mandate should be in cancel state.")) + self.write({"state": "draft"}) return True diff --git a/account_banking_mandate/models/account_invoice.py b/account_banking_mandate/models/account_invoice.py index 6d67848dc..d0fa015cc 100644 --- a/account_banking_mandate/models/account_invoice.py +++ b/account_banking_mandate/models/account_invoice.py @@ -5,29 +5,32 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import api, fields, models, _ +from odoo import _, api, fields, models from odoo.exceptions import ValidationError class AccountInvoice(models.Model): - _inherit = 'account.invoice' + _inherit = "account.invoice" mandate_id = fields.Many2one( - 'account.banking.mandate', string='Direct Debit Mandate', - ondelete='restrict', - readonly=True, states={'draft': [('readonly', False)]}) + "account.banking.mandate", + string="Direct Debit Mandate", + ondelete="restrict", + readonly=True, + states={"draft": [("readonly", False)]}, + ) mandate_required = fields.Boolean( - related='payment_mode_id.payment_method_id.mandate_required', - readonly=True) + related="payment_mode_id.payment_method_id.mandate_required", readonly=True + ) @api.model def line_get_convert(self, line, part): """Copy mandate from invoice to account move line""" res = super(AccountInvoice, self).line_get_convert(line, part) - if line.get('type') == 'dest' and line.get('invoice_id'): - invoice = self.browse(line['invoice_id']) - if invoice.type in ('out_invoice', 'out_refund'): - res['mandate_id'] = invoice.mandate_id.id or False + if line.get("type") == "dest" and line.get("invoice_id"): + invoice = self.browse(line["invoice_id"]) + if invoice.type in ("out_invoice", "out_refund"): + res["mandate_id"] = invoice.mandate_id.id or False return res @api.model @@ -35,8 +38,8 @@ class AccountInvoice(models.Model): """Fill the mandate_id from the partner if none is provided on creation, using same method as upstream.""" onchanges = { - '_onchange_partner_id': ['mandate_id'], - '_onchange_payment_mode_id': ['mandate_id'], + "_onchange_partner_id": ["mandate_id"], + "_onchange_payment_mode_id": ["mandate_id"], } for onchange_method, changed_fields in list(onchanges.items()): if any(f not in vals for f in changed_fields): @@ -55,13 +58,17 @@ class AccountInvoice(models.Model): # to refund, and we also need to copy mandate from invoice to refund @api.model def _prepare_refund( - self, invoice, date_invoice=None, date=None, description=None, - journal_id=None): + self, invoice, date_invoice=None, date=None, description=None, journal_id=None + ): vals = super(AccountInvoice, self)._prepare_refund( - invoice, date_invoice=date_invoice, date=date, - description=description, journal_id=journal_id) - if invoice.type == 'out_invoice': - vals['mandate_id'] = invoice.mandate_id.id + invoice, + date_invoice=date_invoice, + date=date, + description=description, + journal_id=journal_id, + ) + if invoice.type == "out_invoice": + vals["mandate_id"] = invoice.mandate_id.id return vals def set_mandate(self): @@ -70,24 +77,29 @@ class AccountInvoice(models.Model): else: self.mandate_id = False - @api.onchange('partner_id', 'company_id') + @api.onchange("partner_id", "company_id") def _onchange_partner_id(self): """Select by default the first valid mandate of the partner""" res = super(AccountInvoice, self)._onchange_partner_id() self.set_mandate() return res - @api.onchange('payment_mode_id') + @api.onchange("payment_mode_id") def _onchange_payment_mode_id(self): super(AccountInvoice, self)._onchange_payment_mode_id() self.set_mandate() - @api.constrains('mandate_id', 'company_id') + @api.constrains("mandate_id", "company_id") def _check_company_constrains(self): for inv in self: - if inv.mandate_id.company_id and inv.mandate_id.company_id != \ - inv.company_id: - raise ValidationError(_( - "The invoice %s has a different company than " - "that of the linked mandate %s).") % - (inv.name, inv.mandate_id.display_name)) + if ( + inv.mandate_id.company_id + and inv.mandate_id.company_id != inv.company_id + ): + raise ValidationError( + _( + "The invoice %s has a different company than " + "that of the linked mandate %s)." + ) + % (inv.name, inv.mandate_id.display_name) + ) diff --git a/account_banking_mandate/models/account_move_line.py b/account_banking_mandate/models/account_move_line.py index 3df33cafe..ec923ba2d 100644 --- a/account_banking_mandate/models/account_move_line.py +++ b/account_banking_mandate/models/account_move_line.py @@ -3,47 +3,51 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import api, fields, models, _ +from odoo import _, api, fields, models from odoo.exceptions import ValidationError class AccountMoveLine(models.Model): - _inherit = 'account.move.line' + _inherit = "account.move.line" mandate_id = fields.Many2one( - 'account.banking.mandate', string='Direct Debit Mandate', - ondelete='restrict') + "account.banking.mandate", string="Direct Debit Mandate", ondelete="restrict" + ) @api.multi def _prepare_payment_line_vals(self, payment_order): - vals = super(AccountMoveLine, self)._prepare_payment_line_vals( - payment_order) - if payment_order.payment_type != 'inbound': + vals = super(AccountMoveLine, self)._prepare_payment_line_vals(payment_order) + if payment_order.payment_type != "inbound": return vals mandate = self.mandate_id - if not mandate and vals.get('mandate_id', False): - mandate = mandate.browse(vals['mandate_id']) - partner_bank_id = vals.get('partner_bank_id', False) + if not mandate and vals.get("mandate_id", False): + mandate = mandate.browse(vals["mandate_id"]) + partner_bank_id = vals.get("partner_bank_id", False) if not mandate: if partner_bank_id: - domain = [('partner_bank_id', '=', partner_bank_id)] + domain = [("partner_bank_id", "=", partner_bank_id)] else: - domain = [('partner_id', '=', self.partner_id.id)] - domain.append(('state', '=', 'valid')) + domain = [("partner_id", "=", self.partner_id.id)] + domain.append(("state", "=", "valid")) mandate = mandate.search(domain, limit=1) - vals.update({ - 'mandate_id': mandate.id, - 'partner_bank_id': mandate.partner_bank_id.id or partner_bank_id, - }) + vals.update( + { + "mandate_id": mandate.id, + "partner_bank_id": mandate.partner_bank_id.id or partner_bank_id, + } + ) return vals @api.multi - @api.constrains('mandate_id', 'company_id') + @api.constrains("mandate_id", "company_id") def _check_company_constrains(self): for ml in self: mandate = ml.mandate_id if mandate.company_id and mandate.company_id != ml.company_id: - raise ValidationError(_( - "The item %s of journal %s has a different company than " - "that of the linked mandate %s).") % - (ml.name, ml.move_id.name, ml.mandate_id.display_name)) + raise ValidationError( + _( + "The item %s of journal %s has a different company than " + "that of the linked mandate %s)." + ) + % (ml.name, ml.move_id.name, ml.mandate_id.display_name) + ) diff --git a/account_banking_mandate/models/account_payment_line.py b/account_banking_mandate/models/account_payment_line.py index 2177b1c5c..286c5e1f4 100644 --- a/account_banking_mandate/models/account_payment_line.py +++ b/account_banking_mandate/models/account_payment_line.py @@ -3,51 +3,64 @@ # Copyright 2015-16 Akretion - Alexis de Lattre # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import models, fields, api, _ -from odoo.exceptions import ValidationError, UserError +from odoo import _, api, fields, models +from odoo.exceptions import UserError, ValidationError class AccountPaymentLine(models.Model): - _inherit = 'account.payment.line' + _inherit = "account.payment.line" mandate_id = fields.Many2one( - comodel_name='account.banking.mandate', string='Direct Debit Mandate', - domain=[('state', '=', 'valid')]) + comodel_name="account.banking.mandate", + string="Direct Debit Mandate", + domain=[("state", "=", "valid")], + ) mandate_required = fields.Boolean( - related='order_id.payment_method_id.mandate_required', readonly=True) + related="order_id.payment_method_id.mandate_required", readonly=True + ) @api.multi - @api.constrains('mandate_id', 'partner_bank_id') + @api.constrains("mandate_id", "partner_bank_id") def _check_mandate_bank_link(self): for pline in self: - if (pline.mandate_id and pline.partner_bank_id and - pline.mandate_id.partner_bank_id != - pline.partner_bank_id): - raise ValidationError(_( - "The payment line number %s has the bank account " - "'%s' which is not attached to the mandate '%s' (this " - "mandate is attached to the bank account '%s').") % - (pline.name, - pline.partner_bank_id.acc_number, - pline.mandate_id.unique_mandate_reference, - pline.mandate_id.partner_bank_id.acc_number)) + if ( + pline.mandate_id + and pline.partner_bank_id + and pline.mandate_id.partner_bank_id != pline.partner_bank_id + ): + raise ValidationError( + _( + "The payment line number %s has the bank account " + "'%s' which is not attached to the mandate '%s' (this " + "mandate is attached to the bank account '%s')." + ) + % ( + pline.name, + pline.partner_bank_id.acc_number, + pline.mandate_id.unique_mandate_reference, + pline.mandate_id.partner_bank_id.acc_number, + ) + ) @api.multi - @api.constrains('mandate_id', 'company_id') + @api.constrains("mandate_id", "company_id") def _check_company_constrains(self): for pline in self: - if pline.mandate_id.company_id and pline.mandate_id.company_id != \ - pline.company_id: - raise ValidationError(_( - "The payment line number %s a different company than " - "that of the linked mandate %s).") % - (pline.name, - pline.mandate_id.display_name)) + if ( + pline.mandate_id.company_id + and pline.mandate_id.company_id != pline.company_id + ): + raise ValidationError( + _( + "The payment line number %s a different company than " + "that of the linked mandate %s)." + ) + % (pline.name, pline.mandate_id.display_name) + ) @api.multi def draft2open_payment_line_check(self): res = super(AccountPaymentLine, self).draft2open_payment_line_check() if self.mandate_required and not self.mandate_id: - raise UserError(_( - 'Missing Mandate on payment line %s') % self.name) + raise UserError(_("Missing Mandate on payment line %s") % self.name) return res diff --git a/account_banking_mandate/models/account_payment_method.py b/account_banking_mandate/models/account_payment_method.py index a453a0eb4..1c71ab489 100644 --- a/account_banking_mandate/models/account_payment_method.py +++ b/account_banking_mandate/models/account_payment_method.py @@ -1,13 +1,14 @@ # Copyright 2016 Akretion (Alexis de Lattre ) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import models, fields +from odoo import fields, models class AccountPaymentMethod(models.Model): _inherit = "account.payment.method" mandate_required = fields.Boolean( - string='Mandate Required', + string="Mandate Required", help="Activate this option if this payment method requires your " - "customer to sign a direct debit mandate with your company.") + "customer to sign a direct debit mandate with your company.", + ) diff --git a/account_banking_mandate/models/bank_payment_line.py b/account_banking_mandate/models/bank_payment_line.py index 5c0a63371..db736bc82 100644 --- a/account_banking_mandate/models/bank_payment_line.py +++ b/account_banking_mandate/models/bank_payment_line.py @@ -7,15 +7,18 @@ from odoo import api, fields, models class BankPaymentLine(models.Model): - _inherit = 'bank.payment.line' + _inherit = "bank.payment.line" mandate_id = fields.Many2one( - comodel_name='account.banking.mandate', string='Direct Debit Mandate', - related='payment_line_ids.mandate_id') + comodel_name="account.banking.mandate", + string="Direct Debit Mandate", + related="payment_line_ids.mandate_id", + ) @api.model def same_fields_payment_line_and_bank_payment_line(self): - res = super(BankPaymentLine, self).\ - same_fields_payment_line_and_bank_payment_line() - res.append('mandate_id') + res = super( + BankPaymentLine, self + ).same_fields_payment_line_and_bank_payment_line() + res.append("mandate_id") return res diff --git a/account_banking_mandate/models/res_partner.py b/account_banking_mandate/models/res_partner.py index 8bfa022a0..1413d8e0e 100644 --- a/account_banking_mandate/models/res_partner.py +++ b/account_banking_mandate/models/res_partner.py @@ -2,39 +2,43 @@ # Copyright 2017 Carlos Dauden # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import models, fields, api +from odoo import api, fields, models class ResPartner(models.Model): - _inherit = 'res.partner' + _inherit = "res.partner" mandate_count = fields.Integer( - compute='_compute_mandate_count', string="Number of Mandates", - readonly=True) + compute="_compute_mandate_count", string="Number of Mandates", readonly=True + ) valid_mandate_id = fields.Many2one( - comodel_name='account.banking.mandate', - compute='_compute_valid_mandate_id', - string='First Valid Mandate') + comodel_name="account.banking.mandate", + compute="_compute_valid_mandate_id", + string="First Valid Mandate", + ) @api.multi def _compute_mandate_count(self): - mandate_data = self.env['account.banking.mandate'].read_group( - [('partner_id', 'in', self.ids)], ['partner_id'], ['partner_id']) - mapped_data = dict([ - (mandate['partner_id'][0], mandate['partner_id_count']) - for mandate in mandate_data]) + mandate_data = self.env["account.banking.mandate"].read_group( + [("partner_id", "in", self.ids)], ["partner_id"], ["partner_id"] + ) + mapped_data = { + mandate["partner_id"][0]: mandate["partner_id_count"] + for mandate in mandate_data + } for partner in self: partner.mandate_count = mapped_data.get(partner.id, 0) @api.multi def _compute_valid_mandate_id(self): # Dict for reducing the duplicated searches on parent/child partners - company_id = self.env.context.get('force_company', False) + company_id = self.env.context.get("force_company", False) if company_id: - company = self.env['res.company'].browse(company_id) + company = self.env["res.company"].browse(company_id) else: - company = self.env['res.company']._company_default_get( - 'account.banking.mandate') + company = self.env["res.company"]._company_default_get( + "account.banking.mandate" + ) mandates_dic = {} for partner in self: @@ -43,8 +47,8 @@ class ResPartner(models.Model): partner.valid_mandate_id = mandates_dic[commercial_partner_id] else: mandates = partner.commercial_partner_id.bank_ids.mapped( - 'mandate_ids').filtered( - lambda x: x.state == 'valid' and x.company_id == company) + "mandate_ids" + ).filtered(lambda x: x.state == "valid" and x.company_id == company) first_valid_mandate_id = mandates[:1].id partner.valid_mandate_id = first_valid_mandate_id mandates_dic[commercial_partner_id] = first_valid_mandate_id diff --git a/account_banking_mandate/models/res_partner_bank.py b/account_banking_mandate/models/res_partner_bank.py index 66a2442ca..50cca9ed3 100644 --- a/account_banking_mandate/models/res_partner_bank.py +++ b/account_banking_mandate/models/res_partner_bank.py @@ -2,26 +2,40 @@ # Copyright 2014 Tecnativa - Pedro M. Baeza # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import api, fields, models, _ +from odoo import _, api, fields, models from odoo.exceptions import ValidationError class ResPartnerBank(models.Model): - _inherit = 'res.partner.bank' + _inherit = "res.partner.bank" mandate_ids = fields.One2many( - comodel_name='account.banking.mandate', inverse_name='partner_bank_id', - string='Direct Debit Mandates', - help='Banking mandates represent an authorization that the bank ' - 'account owner gives to a company for a specific operation.') + comodel_name="account.banking.mandate", + inverse_name="partner_bank_id", + string="Direct Debit Mandates", + help="Banking mandates represent an authorization that the bank " + "account owner gives to a company for a specific operation.", + ) - @api.constrains('company_id') + @api.constrains("company_id") def _company_constrains(self): for rpb in self: - if self.env['account.banking.mandate'].sudo().search( - [('partner_bank_id', '=', rpb.id), - ('company_id', '!=', rpb.company_id.id)], limit=1): + if ( + self.env["account.banking.mandate"] + .sudo() + .search( + [ + ("partner_bank_id", "=", rpb.id), + ("company_id", "!=", rpb.company_id.id), + ], + limit=1, + ) + ): raise ValidationError( - _("You cannot change the company of Partner Bank %s, " - "as there exists mandates referencing it that " - "belong to another company.") % (rpb.display_name,)) + _( + "You cannot change the company of Partner Bank %s, " + "as there exists mandates referencing it that " + "belong to another company." + ) + % (rpb.display_name,) + ) diff --git a/account_banking_mandate/security/mandate_security.xml b/account_banking_mandate/security/mandate_security.xml index 4dd34b7dd..6a568c552 100644 --- a/account_banking_mandate/security/mandate_security.xml +++ b/account_banking_mandate/security/mandate_security.xml @@ -1,21 +1,18 @@ - + - - - - - Banking Mandate multi-company - - ['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])] - - - - - - - + + Banking Mandate multi-company + + ['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])] + + + + + diff --git a/account_banking_mandate/tests/__init__.py b/account_banking_mandate/tests/__init__.py index fe40c01c2..b31a1b31b 100644 --- a/account_banking_mandate/tests/__init__.py +++ b/account_banking_mandate/tests/__init__.py @@ -1,3 +1,2 @@ - from . import test_mandate from . import test_invoice_mandate diff --git a/account_banking_mandate/tests/test_invoice_mandate.py b/account_banking_mandate/tests/test_invoice_mandate.py index 5ccf5bcd3..a3dfba874 100644 --- a/account_banking_mandate/tests/test_invoice_mandate.py +++ b/account_banking_mandate/tests/test_invoice_mandate.py @@ -1,13 +1,11 @@ - # Copyright 2017 Creu Blanca # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo.tests.common import TransactionCase from odoo.exceptions import ValidationError +from odoo.tests.common import TransactionCase class TestInvoiceMandate(TransactionCase): - def test_post_invoice_01(self): self.invoice._onchange_partner_id() @@ -16,16 +14,16 @@ class TestInvoiceMandate(TransactionCase): self.invoice.action_invoice_open() payable_move_lines = self.invoice.move_id.line_ids.filtered( - lambda s: s.account_id == self.invoice_account) + lambda s: s.account_id == self.invoice_account + ) if payable_move_lines: self.assertEqual(payable_move_lines[0].mandate_id, self.mandate) - self.env['account.invoice.payment.line.multi'].with_context( - active_model='account.invoice', - active_ids=self.invoice.ids + self.env["account.invoice.payment.line.multi"].with_context( + active_model="account.invoice", active_ids=self.invoice.ids ).create({}).run() - payment_order = self.env['account.payment.order'].search([]) + payment_order = self.env["account.payment.order"].search([]) self.assertEqual(len(payment_order.ids), 1) payment_order.payment_mode_id_change() payment_order.draft2open() @@ -34,20 +32,24 @@ class TestInvoiceMandate(TransactionCase): self.assertEqual(self.mandate.payment_line_ids_count, 1) def test_post_invoice_02(self): - partner_2 = self._create_res_partner('Jane with ACME Bank') + partner_2 = self._create_res_partner("Jane with ACME Bank") partner_2.customer_payment_mode_id = self.mode_inbound_acme - bank_account = self.env['res.partner.bank'].create({ - 'acc_number': '0023032234211', - 'partner_id': partner_2.id, - 'bank_id': self.acme_bank.id, - 'company_id': self.company_2.id - }) + bank_account = self.env["res.partner.bank"].create( + { + "acc_number": "0023032234211", + "partner_id": partner_2.id, + "bank_id": self.acme_bank.id, + "company_id": self.company_2.id, + } + ) - mandate_2 = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company_2.id, - }) + mandate_2 = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company_2.id, + } + ) mandate_2.validate() self.invoice._onchange_partner_id() @@ -55,7 +57,8 @@ class TestInvoiceMandate(TransactionCase): self.invoice.action_invoice_open() payable_move_lines = self.invoice.move_id.line_ids.filtered( - lambda s: s.account_id == self.invoice_account) + lambda s: s.account_id == self.invoice_account + ) if payable_move_lines: with self.assertRaises(ValidationError): payable_move_lines[0].mandate_id = mandate_2 @@ -67,167 +70,205 @@ class TestInvoiceMandate(TransactionCase): self.invoice.refund() def test_onchange_partner(self): - partner_2 = self._create_res_partner('Jane with ACME Bank') + partner_2 = self._create_res_partner("Jane with ACME Bank") partner_2.customer_payment_mode_id = self.mode_inbound_acme - bank_account = self.env['res.partner.bank'].create({ - 'acc_number': '0023032234211', - 'partner_id': partner_2.id, - 'bank_id': self.acme_bank.id, - 'company_id': self.company.id - }) + bank_account = self.env["res.partner.bank"].create( + { + "acc_number": "0023032234211", + "partner_id": partner_2.id, + "bank_id": self.acme_bank.id, + "company_id": self.company.id, + } + ) - mandate_2 = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - }) + mandate_2 = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company.id, + } + ) mandate_2.validate() - invoice = self.env['account.invoice'].new({ - 'partner_id': self.partner.id, - 'account_id': self.invoice_account.id, - 'type': 'out_invoice', - 'company_id': self.company.id, - }) + invoice = self.env["account.invoice"].new( + { + "partner_id": self.partner.id, + "account_id": self.invoice_account.id, + "type": "out_invoice", + "company_id": self.company.id, + } + ) invoice.partner_id = partner_2 invoice._onchange_partner_id() self.assertEqual(invoice.mandate_id, mandate_2) def test_onchange_payment_mode(self): - invoice = self.env['account.invoice'].new({ - 'partner_id': self.partner.id, - 'account_id': self.invoice_account.id, - 'type': 'out_invoice', - 'company_id': self.company.id, - }) + invoice = self.env["account.invoice"].new( + { + "partner_id": self.partner.id, + "account_id": self.invoice_account.id, + "type": "out_invoice", + "company_id": self.company.id, + } + ) invoice._onchange_partner_id() - pay_method_test = self.env['account.payment.method'].create({ - 'name': 'Test', - 'code': 'test', - 'payment_type': 'inbound', - 'mandate_required': False - }) - mode_inbound_acme_2 = self.env['account.payment.mode'].create({ - 'name': 'Inbound Credit ACME Bank 2', - 'company_id': self.company.id, - 'bank_account_link': 'variable', - 'payment_method_id': pay_method_test.id, - }) + pay_method_test = self.env["account.payment.method"].create( + { + "name": "Test", + "code": "test", + "payment_type": "inbound", + "mandate_required": False, + } + ) + mode_inbound_acme_2 = self.env["account.payment.mode"].create( + { + "name": "Inbound Credit ACME Bank 2", + "company_id": self.company.id, + "bank_account_link": "variable", + "payment_method_id": pay_method_test.id, + } + ) invoice.payment_mode_id = mode_inbound_acme_2 invoice._onchange_payment_mode_id() - self.assertEqual(invoice.mandate_id, self.env[ - 'account.banking.mandate']) + self.assertEqual(invoice.mandate_id, self.env["account.banking.mandate"]) def test_invoice_constrains(self): - partner_2 = self._create_res_partner('Jane with ACME Bank') + partner_2 = self._create_res_partner("Jane with ACME Bank") partner_2.customer_payment_mode_id = self.mode_inbound_acme - bank_account = self.env['res.partner.bank'].create({ - 'acc_number': '0023032234211', - 'partner_id': partner_2.id, - 'bank_id': self.acme_bank.id, - 'company_id': self.company_2.id - }) + bank_account = self.env["res.partner.bank"].create( + { + "acc_number": "0023032234211", + "partner_id": partner_2.id, + "bank_id": self.acme_bank.id, + "company_id": self.company_2.id, + } + ) - mandate_2 = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company_2.id, - }) + mandate_2 = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company_2.id, + } + ) mandate_2.validate() - invoice = self.env['account.invoice'].create({ - 'partner_id': self.partner.id, - 'account_id': self.invoice_account.id, - 'type': 'out_invoice', - 'company_id': self.company.id, - }) + invoice = self.env["account.invoice"].create( + { + "partner_id": self.partner.id, + "account_id": self.invoice_account.id, + "type": "out_invoice", + "company_id": self.company.id, + } + ) with self.assertRaises(ValidationError): invoice.mandate_id = mandate_2 def _create_res_partner(self, name): - return self.env['res.partner'].create({ - 'name': name - }) + return self.env["res.partner"].create({"name": name}) def _create_res_bank(self, name, bic, city, country): - return self.env['res.bank'].create({ - 'name': name, - 'bic': bic, - 'city': city, - 'country': country.id, - }) + return self.env["res.bank"].create( + {"name": name, "bic": bic, "city": city, "country": country.id} + ) def setUp(self): res = super(TestInvoiceMandate, self).setUp() - self.company = self.env.ref('base.main_company') + self.company = self.env.ref("base.main_company") - self.partner = self._create_res_partner('Peter with ACME Bank') - self.acme_bank = self._create_res_bank('ACME Bank', 'GEBABEBB03B', - 'Charleroi', - self.env.ref('base.be')) + self.partner = self._create_res_partner("Peter with ACME Bank") + self.acme_bank = self._create_res_bank( + "ACME Bank", "GEBABEBB03B", "Charleroi", self.env.ref("base.be") + ) - bank_account = self.env['res.partner.bank'].create({ - 'acc_number': '0023032234211123', - 'partner_id': self.partner.id, - 'bank_id': self.acme_bank.id, - 'company_id': self.company.id - }) + bank_account = self.env["res.partner.bank"].create( + { + "acc_number": "0023032234211123", + "partner_id": self.partner.id, + "bank_id": self.acme_bank.id, + "company_id": self.company.id, + } + ) - self.company_2 = self.env['res.company'].create({ - 'name': 'Company 2', - }) + self.company_2 = self.env["res.company"].create({"name": "Company 2"}) - self.mandate = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - }) + self.mandate = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company.id, + } + ) self.mandate.validate() - self.mode_inbound_acme = self.env['account.payment.mode'].create({ - 'name': 'Inbound Credit ACME Bank', - 'company_id': self.company.id, - 'bank_account_link': 'variable', - 'payment_method_id': - self.env.ref('account.account_payment_method_manual_in').id, - }) - bank_journal = self.env['account.journal'].search( - [('type', '=', 'bank')], limit=1) + self.mode_inbound_acme = self.env["account.payment.mode"].create( + { + "name": "Inbound Credit ACME Bank", + "company_id": self.company.id, + "bank_account_link": "variable", + "payment_method_id": self.env.ref( + "account.account_payment_method_manual_in" + ).id, + } + ) + bank_journal = self.env["account.journal"].search( + [("type", "=", "bank")], limit=1 + ) self.mode_inbound_acme.variable_journal_ids = bank_journal self.mode_inbound_acme.payment_method_id.mandate_required = True self.mode_inbound_acme.payment_order_ok = True self.partner.customer_payment_mode_id = self.mode_inbound_acme - self.invoice_account = self.env['account.account'].search( - [('user_type_id', '=', self.env.ref( - 'account.data_account_type_receivable').id), - ('company_id', '=', self.company.id)], - limit=1) - invoice_line_account = self.env['account.account'].search( - [('user_type_id', '=', self.env.ref( - 'account.data_account_type_expenses').id), - ('company_id', '=', self.company.id)], - limit=1).id + self.invoice_account = self.env["account.account"].search( + [ + ( + "user_type_id", + "=", + self.env.ref("account.data_account_type_receivable").id, + ), + ("company_id", "=", self.company.id), + ], + limit=1, + ) + invoice_line_account = ( + self.env["account.account"] + .search( + [ + ( + "user_type_id", + "=", + self.env.ref("account.data_account_type_expenses").id, + ), + ("company_id", "=", self.company.id), + ], + limit=1, + ) + .id + ) - self.invoice = self.env['account.invoice'].create({ - 'partner_id': self.partner.id, - 'account_id': self.invoice_account.id, - 'type': 'out_invoice', - 'company_id': self.company.id, - }) + self.invoice = self.env["account.invoice"].create( + { + "partner_id": self.partner.id, + "account_id": self.invoice_account.id, + "type": "out_invoice", + "company_id": self.company.id, + } + ) - self.env['account.invoice.line'].create({ - 'product_id': self.env.ref('product.product_product_4').id, - 'quantity': 1.0, - 'price_unit': 100.0, - 'invoice_id': self.invoice.id, - 'name': 'product that cost 100', - 'account_id': invoice_line_account, - }) + self.env["account.invoice.line"].create( + { + "product_id": self.env.ref("product.product_product_4").id, + "quantity": 1.0, + "price_unit": 100.0, + "invoice_id": self.invoice.id, + "name": "product that cost 100", + "account_id": invoice_line_account, + } + ) return res diff --git a/account_banking_mandate/tests/test_mandate.py b/account_banking_mandate/tests/test_mandate.py index ccd2220c6..beb037c6e 100644 --- a/account_banking_mandate/tests/test_mandate.py +++ b/account_banking_mandate/tests/test_mandate.py @@ -1,127 +1,144 @@ # © 2016 Akretion (Alexis de Lattre ) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo.tests.common import TransactionCase +from datetime import timedelta + from odoo import fields from odoo.exceptions import UserError, ValidationError -from datetime import timedelta +from odoo.tests.common import TransactionCase class TestMandate(TransactionCase): - def test_mandate_01(self): - bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') - mandate = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - }) - self.assertEqual(mandate.state, 'draft') + bank_account = self.env.ref("account_payment_mode.res_partner_12_iban") + mandate = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company.id, + } + ) + self.assertEqual(mandate.state, "draft") mandate.validate() - self.assertEqual(mandate.state, 'valid') + self.assertEqual(mandate.state, "valid") mandate.cancel() - self.assertEqual(mandate.state, 'cancel') + self.assertEqual(mandate.state, "cancel") mandate.back2draft() - self.assertEqual(mandate.state, 'draft') + self.assertEqual(mandate.state, "draft") def test_mandate_02(self): - bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') - mandate = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - }) + bank_account = self.env.ref("account_payment_mode.res_partner_12_iban") + mandate = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company.id, + } + ) with self.assertRaises(UserError): mandate.back2draft() def test_mandate_03(self): - bank_account = self.env.ref( - 'account_payment_mode.res_partner_12_iban') - mandate = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - }) + bank_account = self.env.ref("account_payment_mode.res_partner_12_iban") + mandate = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company.id, + } + ) mandate.validate() with self.assertRaises(UserError): mandate.validate() def test_mandate_04(self): - bank_account = self.env.ref( - 'account_payment_mode.res_partner_12_iban') - mandate = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - }) + bank_account = self.env.ref("account_payment_mode.res_partner_12_iban") + mandate = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company.id, + } + ) mandate.validate() mandate.cancel() with self.assertRaises(UserError): mandate.cancel() def test_onchange_methods(self): - bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') - mandate = self.env['account.banking.mandate'].new({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - }) - bank_account_2 = self.env.ref( - 'account_payment_mode.res_partner_2_iban') + bank_account = self.env.ref("account_payment_mode.res_partner_12_iban") + mandate = self.env["account.banking.mandate"].new( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company.id, + } + ) + bank_account_2 = self.env.ref("account_payment_mode.res_partner_2_iban") mandate.partner_bank_id = bank_account_2 mandate.mandate_partner_bank_change() self.assertEquals(mandate.partner_id, bank_account_2.partner_id) def test_constrains_01(self): - bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') - mandate = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - }) + bank_account = self.env.ref("account_payment_mode.res_partner_12_iban") + mandate = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company.id, + } + ) mandate.validate() with self.assertRaises(ValidationError): mandate.signature_date = fields.Date.to_string( - fields.Date.from_string( - fields.Date.context_today(mandate)) + timedelta(days=1)) + fields.Date.from_string(fields.Date.context_today(mandate)) + + timedelta(days=1) + ) def test_constrains_02(self): - bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') - mandate = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - }) + bank_account = self.env.ref("account_payment_mode.res_partner_12_iban") + mandate = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company.id, + } + ) with self.assertRaises(ValidationError): mandate.company_id = self.company_2 def test_constrains_03(self): - bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') - mandate = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - }) - bank_account_2 = self.env['res.partner.bank'].create({ - 'acc_number': '1234', - 'company_id': self.company_2.id, - 'partner_id': self.company_2.partner_id.id, - }) + bank_account = self.env.ref("account_payment_mode.res_partner_12_iban") + mandate = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company.id, + } + ) + bank_account_2 = self.env["res.partner.bank"].create( + { + "acc_number": "1234", + "company_id": self.company_2.id, + "partner_id": self.company_2.partner_id.id, + } + ) with self.assertRaises(ValidationError): mandate.partner_bank_id = bank_account_2 def test_constrains_04(self): - mandate = self.env['account.banking.mandate'].create({ - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - }) - bank_account = self.env['res.partner.bank'].create({ - 'acc_number': '1234', - 'company_id': self.company_2.id, - 'partner_id': self.company_2.partner_id.id, - }) + mandate = self.env["account.banking.mandate"].create( + {"signature_date": "2015-01-01", "company_id": self.company.id} + ) + bank_account = self.env["res.partner.bank"].create( + { + "acc_number": "1234", + "company_id": self.company_2.id, + "partner_id": self.company_2.partner_id.id, + } + ) with self.assertRaises(ValidationError): bank_account.mandate_ids += mandate @@ -130,12 +147,14 @@ class TestMandate(TransactionCase): Test case: create a mandate with no reference Expected result: the reference of the created mandate is not empty """ - bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') - mandate = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - }) + bank_account = self.env.ref("account_payment_mode.res_partner_12_iban") + mandate = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company.id, + } + ) self.assertTrue(mandate.unique_mandate_reference) def test_mandate_reference_02(self): @@ -143,13 +162,15 @@ class TestMandate(TransactionCase): Test case: create a mandate with "ref01" as reference Expected result: the reference of the created mandate is "ref01" """ - bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') - mandate = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - 'unique_mandate_reference': "ref01", - }) + bank_account = self.env.ref("account_payment_mode.res_partner_12_iban") + mandate = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company.id, + "unique_mandate_reference": "ref01", + } + ) self.assertEqual(mandate.unique_mandate_reference, "ref01") def test_mandate_reference_03(self): @@ -158,13 +179,15 @@ class TestMandate(TransactionCase): Expected result: the reference of the created mandate is not empty and is not "New" """ - bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') - mandate = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - 'unique_mandate_reference': "New", - }) + bank_account = self.env.ref("account_payment_mode.res_partner_12_iban") + mandate = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company.id, + "unique_mandate_reference": "New", + } + ) self.assertTrue(mandate.unique_mandate_reference) self.assertNotEqual(mandate.unique_mandate_reference, "New") @@ -173,13 +196,15 @@ class TestMandate(TransactionCase): Test case: create a mandate with False as reference Expected result: the reference of the created mandate is not empty """ - bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') - mandate = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - 'unique_mandate_reference': False, - }) + bank_account = self.env.ref("account_payment_mode.res_partner_12_iban") + mandate = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company.id, + "unique_mandate_reference": False, + } + ) self.assertTrue(mandate.unique_mandate_reference) def test_mandate_reference_06(self): @@ -187,22 +212,22 @@ class TestMandate(TransactionCase): Test case: create a mandate with a empty string as reference Expected result: the reference of the created mandate is not empty """ - bank_account = self.env.ref('account_payment_mode.res_partner_12_iban') - mandate = self.env['account.banking.mandate'].create({ - 'partner_bank_id': bank_account.id, - 'signature_date': '2015-01-01', - 'company_id': self.company.id, - 'unique_mandate_reference': '', - }) + bank_account = self.env.ref("account_payment_mode.res_partner_12_iban") + mandate = self.env["account.banking.mandate"].create( + { + "partner_bank_id": bank_account.id, + "signature_date": "2015-01-01", + "company_id": self.company.id, + "unique_mandate_reference": "", + } + ) self.assertTrue(mandate.unique_mandate_reference) def setUp(self): res = super(TestMandate, self).setUp() # Company - self.company = self.env.ref('base.main_company') + self.company = self.env.ref("base.main_company") # Company 2 - self.company_2 = self.env['res.company'].create({ - 'name': 'Company 2', - }) + self.company_2 = self.env["res.company"].create({"name": "Company 2"}) return res diff --git a/account_banking_mandate/views/account_banking_mandate_view.xml b/account_banking_mandate/views/account_banking_mandate_view.xml index b35b26b2f..ffcce21c0 100644 --- a/account_banking_mandate/views/account_banking_mandate_view.xml +++ b/account_banking_mandate/views/account_banking_mandate_view.xml @@ -1,149 +1,211 @@ - + - - - - view.mandate.form - account.banking.mandate - -
-
-
- -
-
-

- -

-
- - - - - - + view.mandate.form + account.banking.mandate + + +
+
+ +
+
+

+ +

+
+ + + + + + + + + + + +
+ + +
+ + + + + view.mandate.form.buttons + account.banking.mandate + + + +
+ -
-
-
- - - view.mandate.tree - account.banking.mandate - - - - - - - - - - +
+
+ + + view.mandate.tree + account.banking.mandate + + + + + + + + + + - - - - - + context="{'search_default_partner_id': active_id, 'default_partner_id': active_id}" + > + + + + + diff --git a/account_banking_mandate/views/res_partner_bank_view.xml b/account_banking_mandate/views/res_partner_bank_view.xml index 2a7bf9e7a..5fa6f9e7d 100644 --- a/account_banking_mandate/views/res_partner_bank_view.xml +++ b/account_banking_mandate/views/res_partner_bank_view.xml @@ -1,34 +1,33 @@ - + - - - - mandate.res.partner.bank.form - res.partner.bank - - - - - - - - - - - - mandate.res.partner.bank.tree - res.partner.bank - - - - + + mandate.res.partner.bank.form + res.partner.bank + + + + + + + - - - - + + + mandate.res.partner.bank.tree + res.partner.bank + + + + + + +