account_usability: improve display of reconcile information, in particular partial reconcile
Warning: on existing big databases, this upgrade will take a long time because there is a new computed stored field on account.move.line. But it is required to keep good perfs on tree view of move lines.
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
from odoo import models, fields, api, _
|
from odoo import models, fields, api, _
|
||||||
from odoo.tools import float_compare, float_is_zero
|
from odoo.tools import float_compare, float_is_zero
|
||||||
|
from odoo.tools.misc import formatLang
|
||||||
from odoo.exceptions import UserError, ValidationError
|
from odoo.exceptions import UserError, ValidationError
|
||||||
from odoo import SUPERUSER_ID
|
from odoo import SUPERUSER_ID
|
||||||
import logging
|
import logging
|
||||||
@@ -318,6 +319,13 @@ class AccountMoveLine(models.Model):
|
|||||||
# Update field only to add a string (there is no string in account module)
|
# Update field only to add a string (there is no string in account module)
|
||||||
invoice_id = fields.Many2one(string='Invoice')
|
invoice_id = fields.Many2one(string='Invoice')
|
||||||
date_maturity = fields.Date(copy=False)
|
date_maturity = fields.Date(copy=False)
|
||||||
|
account_reconcile = fields.Boolean(
|
||||||
|
related='account_id.reconcile', readonly=True)
|
||||||
|
full_reconcile_id = fields.Many2one(string='Full Reconcile')
|
||||||
|
matched_debit_ids = fields.One2many(string='Partial Reconcile Debit')
|
||||||
|
matched_credit_ids = fields.One2many(string='Partial Reconcile Credit')
|
||||||
|
reconcile_string = fields.Char(
|
||||||
|
compute='_compute_reconcile_string', string='Reconcile', store=True)
|
||||||
|
|
||||||
@api.onchange('credit')
|
@api.onchange('credit')
|
||||||
def _credit_onchange(self):
|
def _credit_onchange(self):
|
||||||
@@ -355,7 +363,6 @@ class AccountMoveLine(models.Model):
|
|||||||
else:
|
else:
|
||||||
self.credit = amount_company_currency
|
self.credit = amount_company_currency
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def show_account_move_form(self):
|
def show_account_move_form(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
action = self.env['ir.actions.act_window'].for_xml_id(
|
action = self.env['ir.actions.act_window'].for_xml_id(
|
||||||
@@ -368,6 +375,34 @@ class AccountMoveLine(models.Model):
|
|||||||
})
|
})
|
||||||
return action
|
return action
|
||||||
|
|
||||||
|
@api.depends(
|
||||||
|
'full_reconcile_id', 'matched_debit_ids', 'matched_credit_ids')
|
||||||
|
def _compute_reconcile_string(self):
|
||||||
|
for line in self:
|
||||||
|
rec_str = False
|
||||||
|
if line.full_reconcile_id:
|
||||||
|
rec_str = line.full_reconcile_id.name
|
||||||
|
else:
|
||||||
|
rec_str = ', '.join([
|
||||||
|
'a%d' % pr.id for pr in line.matched_debit_ids + line.matched_credit_ids])
|
||||||
|
line.reconcile_string = rec_str
|
||||||
|
|
||||||
|
|
||||||
|
class AccountPartialReconcile(models.Model):
|
||||||
|
_inherit = "account.partial.reconcile"
|
||||||
|
_rec_name = "id"
|
||||||
|
|
||||||
|
def name_get(self):
|
||||||
|
res = []
|
||||||
|
for rec in self:
|
||||||
|
# There is no seq for partial rec, so I simulate one with the ID
|
||||||
|
# Prefix for full rec: 'A' (upper case)
|
||||||
|
# Prefix for partial rec: 'a' (lower case)
|
||||||
|
amount_fmt = formatLang(self.env, rec.amount, currency_obj=rec.company_currency_id)
|
||||||
|
name = 'a%d (%s)' % (rec.id, amount_fmt)
|
||||||
|
res.append((rec.id, name))
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
class AccountBankStatement(models.Model):
|
class AccountBankStatement(models.Model):
|
||||||
_inherit = 'account.bank.statement'
|
_inherit = 'account.bank.statement'
|
||||||
|
|||||||
@@ -298,8 +298,8 @@ module -->
|
|||||||
<attribute name="context" operation="python_dict" key="default_credit">default_credit</attribute>
|
<attribute name="context" operation="python_dict" key="default_credit">default_credit</attribute>
|
||||||
<attribute name="context" operation="python_dict" key="default_debit">default_debit</attribute>
|
<attribute name="context" operation="python_dict" key="default_debit">default_debit</attribute>
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//field[@name='line_ids']/tree/field[@name='date_maturity']" position="after">
|
<xpath expr="//field[@name='line_ids']/tree/field[@name='credit']" position="after">
|
||||||
<field name="full_reconcile_id"/>
|
<field name="reconcile_string"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -310,7 +310,7 @@ module -->
|
|||||||
<field name="inherit_id" ref="account.view_account_move_line_filter"/>
|
<field name="inherit_id" ref="account.view_account_move_line_filter"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<field name="partner_id" position="after">
|
<field name="partner_id" position="after">
|
||||||
<field name="full_reconcile_id" />
|
<field name="reconcile_string" />
|
||||||
</field>
|
</field>
|
||||||
<filter name="unreconciled" position="before">
|
<filter name="unreconciled" position="before">
|
||||||
<filter name="reconciled" string="Fully Reconciled" domain="[('full_reconcile_id', '!=', False)]"/>
|
<filter name="reconciled" string="Fully Reconciled" domain="[('full_reconcile_id', '!=', False)]"/>
|
||||||
@@ -335,7 +335,21 @@ module -->
|
|||||||
</field>
|
</field>
|
||||||
<field name="move_id" position="after">
|
<field name="move_id" position="after">
|
||||||
<field name="invoice_id"/>
|
<field name="invoice_id"/>
|
||||||
|
<field name="account_reconcile" invisible="1"/>
|
||||||
</field>
|
</field>
|
||||||
|
<xpath expr="//field[@name='full_reconcile_id']/.." position="replace">
|
||||||
|
<field name="full_reconcile_id" nolabel="1"/> <!-- label is already in view -->
|
||||||
|
<field name="matched_debit_ids" readonly="1" widget="many2many_tags" attrs="{'invisible': ['|', ('full_reconcile_id', '!=', False), ('matched_debit_ids', '=', [])]}"/>
|
||||||
|
<field name="matched_credit_ids" readonly="1" widget="many2many_tags" attrs="{'invisible': ['|', ('full_reconcile_id', '!=', False), ('matched_credit_ids', '=', [])]}"/>
|
||||||
|
<field name="reconciled" invisible="1"/>
|
||||||
|
<button name="open_reconcile_view" class="oe_link" type="object"
|
||||||
|
string="-> View partially reconciled entries" colspan="2"
|
||||||
|
attrs="{'invisible': ['|', ('full_reconcile_id', '!=', False), '&', ('matched_debit_ids', '=', []),('matched_credit_ids', '=', [])]}"/>
|
||||||
|
<span colspan="2" attrs="{'invisible': ['|', '|', ('full_reconcile_id', '!=', False), ('matched_debit_ids', '!=', []), ('matched_credit_ids', '!=', [])]}" class="o_form_field">No Partial Reconcile</span>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//label[@for='full_reconcile_id']/.." position="attributes">
|
||||||
|
<attribute name="attrs">{'invisible': [('account_reconcile', '=', False)]}</attribute>
|
||||||
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
@@ -347,7 +361,7 @@ module -->
|
|||||||
<!-- Move reconcile_id to a better position -->
|
<!-- Move reconcile_id to a better position -->
|
||||||
<field name="full_reconcile_id" position="replace"/>
|
<field name="full_reconcile_id" position="replace"/>
|
||||||
<field name="credit" position="after">
|
<field name="credit" position="after">
|
||||||
<field name="full_reconcile_id"/>
|
<field name="reconcile_string"/>
|
||||||
</field>
|
</field>
|
||||||
<field name="date_maturity" position="after">
|
<field name="date_maturity" position="after">
|
||||||
<button name="show_account_move_form" type="object" icon="fa-arrows-h" string="Show Journal Entry"/>
|
<button name="show_account_move_form" type="object" icon="fa-arrows-h" string="Show Journal Entry"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user