[IMP] base, account: bank accounts management

Class ResPartnerBank modified to:
- Add field 'allow_out_payment', true iff account can be recipient
of out payments
(False by default for new accounts except when created from res.partner)
- Enable chatter tracking for base fields
- Remove barely used/useful view view_company_partner_bank_form

closes odoo/odoo#94801

See: odoo/enterprise#29916
Task: 2856231
Related: odoo/upgrade#3637
Signed-off-by: Olivier Colson (oco) <oco@odoo.com>
This commit is contained in:
Stanislas Gueniffey
2022-09-09 18:53:40 +02:00
parent c41d9ab869
commit 281100bdda
6 changed files with 75 additions and 12 deletions
+57 -1
View File
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
import base64
from collections import defaultdict
import werkzeug
import werkzeug.exceptions
@@ -9,12 +10,22 @@ from odoo.tools.image import image_data_uri
class ResPartnerBank(models.Model):
_inherit = 'res.partner.bank'
_name = 'res.partner.bank'
_inherit = ['res.partner.bank', 'mail.thread', 'mail.activity.mixin']
journal_id = fields.One2many(
'account.journal', 'bank_account_id', domain=[('type', '=', 'bank')], string='Account Journal', readonly=True,
help="The accounting journal corresponding to this bank account.")
# Add tracking to the base fields
bank_id = fields.Many2one(tracking=True)
active = fields.Boolean(tracking=True)
acc_number = fields.Char(tracking=True)
acc_holder_name = fields.Char(tracking=True)
partner_id = fields.Many2one(tracking=True)
allow_out_payment = fields.Boolean(tracking=True)
currency_id = fields.Many2one(tracking=True)
@api.constrains('journal_id')
def _check_journal_id(self):
for bank in self:
@@ -158,3 +169,48 @@ class ResPartnerBank(models.Model):
so that it can be reported to the user.
"""
return None
def create(self, vals_list):
# EXTENDS base res.partner.bank
res = super().create(vals_list)
for account in res:
msg = _("Bank Account %s created", account._get_html_link(title=f"#{account.id}"))
account.partner_id._message_log(body=msg)
return res
def write(self, vals):
# EXTENDS base res.partner.bank
# Track and log changes to partner_id, heavily inspired from account_move
account_initial_values = defaultdict(dict)
# Get all tracked fields (without related fields because these fields must be managed on their own model)
tracking_fields = []
for field_name in vals:
field = self._fields[field_name]
if not (hasattr(field, 'related') and field.related) and hasattr(field, 'tracking') and field.tracking:
tracking_fields.append(field_name)
fields_definition = self.env['res.partner.bank'].fields_get(tracking_fields)
# Get initial values for each account
for account in self:
for field in tracking_fields:
# Group initial values by partner_id
account_initial_values[account][field] = account[field]
res = super().write(vals)
# Log changes to move lines on each move
for account, initial_values in account_initial_values.items():
tracking_value_ids = account._mail_track(fields_definition, initial_values)[1]
if tracking_value_ids:
msg = _("Bank Account %s updated", account._get_html_link(title=f"#{account.id}"))
account.partner_id._message_log(body=msg, tracking_value_ids=tracking_value_ids)
if 'partner_id' in initial_values: # notify previous partner as well
initial_values['partner_id']._message_log(body=msg, tracking_value_ids=tracking_value_ids)
return res
def unlink(self):
# EXTENDS base res.partner.bank
for account in self:
msg = _("Bank Account %s with number %s deleted", account._get_html_link(title=f"#{account.id}"), account.acc_number)
account.partner_id._message_log(body=msg)
return super().unlink()
@@ -90,7 +90,7 @@
</group>
<group string="Bank Account Number" attrs="{'invisible': [('type', '!=', 'bank')]}">
<field name="company_partner_id" invisible="1"/>
<field name="bank_account_id" string="Account Number" context="{'default_partner_id': company_partner_id, 'form_view_ref': 'account.view_company_partner_bank_form'}"/>
<field name="bank_account_id" string="Account Number" context="{'default_partner_id': company_partner_id}"/>
<field name="bank_id" attrs="{'invisible': [('bank_account_id', '=', False)]}"/>
<field name="bank_statements_source" widget="radio" attrs="{'required': [('type', '=', 'bank')]}" groups="account.group_account_readonly"/>
</group>
+3 -2
View File
@@ -204,17 +204,18 @@
<field name="show_credit_limit" invisible="1"/>
<group>
<group string="Bank Accounts" name="banks" groups="account.group_account_invoice,account.group_account_readonly">
<field name="bank_ids" nolabel="1" colspan="2">
<field name="bank_ids" nolabel="1" colspan="2" context="{'default_allow_out_payment': True}">
<tree editable="bottom">
<field name="sequence" widget="handle"/>
<field name="bank_id"/>
<field name="acc_number"/>
<field name="allow_out_payment" widget="boolean_toggle"/>
<field name="acc_holder_name" invisible="1"/>
</tree>
</field>
<button type="action" class="btn-link"
name="%(base.action_res_partner_bank_account_form)d"
context="{'search_default_partner_id': active_id, 'default_partner_id': active_id, 'form_view_ref': 'account.view_company_partner_bank_form'}"
context="{'search_default_partner_id': active_id, 'default_partner_id': active_id}"
string="View accounts detail"
colspan="2"
/>
@@ -1,16 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_company_partner_bank_form" model="ir.ui.view">
<field name="name">company.res.partner.bank.form</field>
<record id="view_partner_bank_form_inherit_account" model="ir.ui.view">
<field name="name">res.partner.bank.form.inherit.account</field>
<field name="model">res.partner.bank</field>
<field name="inherit_id" ref="base.view_partner_bank_form"/>
<field name="mode">primary</field>
<field name="priority">20</field>
<field name="priority">14</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='partner_id']" position="attributes">
<attribute name="invisible">1</attribute>
<xpath expr="//form[@name='bank_account_form']/sheet[1]" position="after">
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
<field name="activity_ids" widget="mail_activity"/>
</div>
</xpath>
</field>
</record>
+1
View File
@@ -78,6 +78,7 @@ class ResPartnerBank(models.Model):
sanitized_acc_number = fields.Char(compute='_compute_sanitized_acc_number', string='Sanitized Account Number', readonly=True, store=True)
acc_holder_name = fields.Char(string='Account Holder Name', help="Account holder name, in case it is different than the name of the Account Holder")
partner_id = fields.Many2one('res.partner', 'Account Holder', ondelete='cascade', index=True, domain=['|', ('is_company', '=', True), ('parent_id', '=', False)], required=True)
allow_out_payment = fields.Boolean('Send Money', help='This account can be used for outgoing payments', default=False, copy=False, readonly=False)
bank_id = fields.Many2one('res.bank', string='Bank')
bank_name = fields.Char(related='bank_id.name', readonly=False)
bank_bic = fields.Char(related='bank_id.bic', readonly=False)
+4 -2
View File
@@ -79,7 +79,7 @@
<field name="model">res.partner.bank</field>
<field name="priority">15</field>
<field name="arch" type="xml">
<form string="Bank account">
<form string="Bank account" name="bank_account_form">
<sheet>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<group>
@@ -89,11 +89,12 @@
<field name="acc_number"/>
<field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/>
<field name="partner_id"/>
<field name="acc_holder_name"/>
</group>
<group>
<field name="bank_id"/>
<field name="currency_id" groups="base.group_multi_currency" options="{'no_create': True}"/>
<field name="acc_holder_name"/>
<field name="allow_out_payment" widget="boolean_toggle"/>
<field name="active" invisible="1"/>
</group>
</group>
@@ -113,6 +114,7 @@
<field name="company_id" groups="base.group_multi_company"/>
<field name="partner_id"/>
<field name="acc_holder_name" invisible="1"/>
<field name="allow_out_payment" widget="boolean_toggle"/>
</tree>
</field>
</record>