account_credit_hold: fix a bug where the hold isn't lifted upon payment registration
This commit is contained in:
parent
a3c74ef77a
commit
ead9bc6520
6 changed files with 96 additions and 67 deletions
|
|
@ -1,21 +1,20 @@
|
||||||
{
|
{
|
||||||
'name': 'Account Credit Hold',
|
"name": "Account Credit Hold",
|
||||||
'version': '17.0.1.1.0',
|
"version": "17.0.1.1.1",
|
||||||
'summary': 'Allows setting clients on credit hold, blocking the ability confirm a new sales order.',
|
"summary": "Allows setting clients on credit hold, blocking the ability confirm a new sales order.",
|
||||||
'description': 'Allows setting clients on hold, blocking the ability confirm a new sales order.',
|
"category": "Accounting/Accounting",
|
||||||
'category': 'Accounting/Accounting',
|
"author": "Bemade Inc.",
|
||||||
'author': 'Bemade Inc.',
|
"maintainer": "Marc Durepos <marc@bemade.org>",
|
||||||
'maintainer': 'Marc Durepos <marc@bemade.org>',
|
"website": "http://www.bemade.org",
|
||||||
'website': 'http://www.bemade.org',
|
"license": "LGPL-3",
|
||||||
'license': 'LGPL-3',
|
"depends": ["sale", "account_followup", "stock"],
|
||||||
'depends': ['sale', 'account_followup', 'stock'],
|
"data": [
|
||||||
'data': [
|
"views/account_followup_views.xml",
|
||||||
'views/account_followup_views.xml',
|
"views/sale_order_views.xml",
|
||||||
'views/sale_order_views.xml',
|
"views/res_partner_views.xml",
|
||||||
'views/res_partner_views.xml',
|
"views/stock_picking_views.xml",
|
||||||
'views/stock_picking_views.xml',
|
|
||||||
],
|
],
|
||||||
'demo': [],
|
"demo": [],
|
||||||
'installable': True,
|
"installable": True,
|
||||||
'auto_install': False
|
"auto_install": False,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ from datetime import date
|
||||||
|
|
||||||
|
|
||||||
class Partner(models.Model):
|
class Partner(models.Model):
|
||||||
_inherit = 'res.partner'
|
_inherit = "res.partner"
|
||||||
|
|
||||||
postpone_hold_until = fields.Date(
|
postpone_hold_until = fields.Date(
|
||||||
string="Postpone Hold",
|
string="Postpone Hold",
|
||||||
|
|
@ -19,13 +19,14 @@ class Partner(models.Model):
|
||||||
compute_sudo=True,
|
compute_sudo=True,
|
||||||
tracking=True,
|
tracking=True,
|
||||||
)
|
)
|
||||||
on_hold = fields.Boolean(string="Account on Hold",
|
on_hold = fields.Boolean(
|
||||||
help="Client account is on hold for unpaid overdue invoices.",
|
string="Account on Hold",
|
||||||
compute="_compute_on_hold",
|
help="Client account is on hold for unpaid overdue invoices.",
|
||||||
compute_sudo=True,
|
compute="_compute_on_hold",
|
||||||
)
|
compute_sudo=True,
|
||||||
|
)
|
||||||
|
|
||||||
@api.depends('postpone_hold_until', 'hold_bg')
|
@api.depends("postpone_hold_until", "hold_bg")
|
||||||
def _compute_on_hold(self):
|
def _compute_on_hold(self):
|
||||||
# manually re-compute hold_bg since followup_status doesn't get updated in Python but gets recalculated
|
# manually re-compute hold_bg since followup_status doesn't get updated in Python but gets recalculated
|
||||||
# by an SQL query every time
|
# by an SQL query every time
|
||||||
|
|
@ -37,7 +38,8 @@ class Partner(models.Model):
|
||||||
return
|
return
|
||||||
# If there is no parent company or the parent is not on hold, we compute for ourselves
|
# If there is no parent company or the parent is not on hold, we compute for ourselves
|
||||||
if rec.hold_bg and not (
|
if rec.hold_bg and not (
|
||||||
rec.postpone_hold_until and rec.postpone_hold_until > date.today()):
|
rec.postpone_hold_until and rec.postpone_hold_until > date.today()
|
||||||
|
):
|
||||||
rec.on_hold = True
|
rec.on_hold = True
|
||||||
else:
|
else:
|
||||||
if rec.on_hold:
|
if rec.on_hold:
|
||||||
|
|
@ -46,34 +48,33 @@ class Partner(models.Model):
|
||||||
|
|
||||||
@api.autovacuum
|
@api.autovacuum
|
||||||
def _cleanup_expired_hold_postponements(self):
|
def _cleanup_expired_hold_postponements(self):
|
||||||
expired_holds = self.search(
|
expired_holds = self.search([("postpone_hold_until", "<=", date.today())])
|
||||||
[('postpone_hold_until', '<=', date.today())])
|
expired_holds.write({"postpone_hold_until": False})
|
||||||
expired_holds.write({'postpone_hold_until': False})
|
|
||||||
|
|
||||||
def action_credit_hold(self):
|
def action_credit_hold(self):
|
||||||
for rec in self:
|
for rec in self:
|
||||||
rec.hold_bg = True
|
rec.hold_bg = True
|
||||||
rec.message_post(body=_('Placed on credit hold.'))
|
rec.message_post(body=_("Placed on credit hold."))
|
||||||
|
|
||||||
def action_lift_credit_hold(self):
|
def action_lift_credit_hold(self):
|
||||||
for rec in self:
|
for rec in self:
|
||||||
rec.hold_bg = False
|
rec.hold_bg = False
|
||||||
rec.message_post(body=_('Credit hold lifted.'))
|
rec.message_post(body=_("Credit hold lifted."))
|
||||||
|
|
||||||
def _execute_followup_partner(self, options=None):
|
def _execute_followup_partner(self, options=None):
|
||||||
res = super()._execute_followup_partner(options)
|
res = super()._execute_followup_partner(options)
|
||||||
if self.followup_status == 'in_need_of_action':
|
if self.followup_status == "in_need_of_action":
|
||||||
if self.followup_line_id.account_hold:
|
if self.followup_line_id.account_hold:
|
||||||
self.action_credit_hold()
|
self.action_credit_hold()
|
||||||
return res
|
return res
|
||||||
|
|
||||||
@api.depends('followup_status', 'followup_line_id')
|
@api.depends("followup_status", "followup_line_id")
|
||||||
def _compute_hold_bg(self):
|
def _compute_hold_bg(self):
|
||||||
first_followup_level = self._get_first_followup_level()
|
first_followup_level = self._get_first_followup_level()
|
||||||
for rec in self:
|
for rec in self:
|
||||||
prev_hold_bg = rec.hold_bg
|
prev_hold_bg = rec.hold_bg
|
||||||
level = rec.followup_line_id
|
level = rec.followup_line_id
|
||||||
if rec.followup_status == 'no_action_needed' and level == first_followup_level:
|
if rec.followup_status == "no_action_needed" and not level:
|
||||||
rec.hold_bg = False
|
rec.hold_bg = False
|
||||||
else:
|
else:
|
||||||
rec.hold_bg = prev_hold_bg
|
rec.hold_bg = prev_hold_bg
|
||||||
|
|
|
||||||
|
|
@ -1,33 +1,49 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<odoo>
|
<odoo>
|
||||||
<data>
|
|
||||||
<record id="account_followup_followup_line_form_inherit" model="ir.ui.view">
|
<record id="account_followup_followup_line_form_inherit" model="ir.ui.view">
|
||||||
<field name="name">account_credit_hold.account_followup_line.form</field>
|
<field name="name">account_credit_hold.account_followup_line.form</field>
|
||||||
<field name="model">account_followup.followup.line</field>
|
<field name="model">account_followup.followup.line</field>
|
||||||
<field name="inherit_id" ref="account_followup.view_account_followup_followup_line_form"/>
|
<field
|
||||||
|
name="inherit_id"
|
||||||
|
ref="account_followup.view_account_followup_followup_line_form"
|
||||||
|
/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//field[@name='send_email']" position="before">
|
<xpath expr="//field[@name='send_email']" position="before">
|
||||||
<field name="account_hold"/>
|
<field name="account_hold" />
|
||||||
</xpath></field>
|
</xpath></field>
|
||||||
</record>
|
</record>
|
||||||
<record id="customer_statements_form_view_inherit" model="ir.ui.view">
|
<record id="customer_statements_form_view_inherit" model="ir.ui.view">
|
||||||
<field name="name">customer.statements.form.view.inherit</field>
|
<field name="name">customer.statements.form.view.inherit</field>
|
||||||
<field name="model">res.partner</field>
|
<field name="model">res.partner</field>
|
||||||
<field name="inherit_id" ref="account_followup.customer_statements_form_view"/>
|
<field
|
||||||
|
name="inherit_id"
|
||||||
|
ref="account_followup.customer_statements_form_view"
|
||||||
|
/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//button[last()]" position="after">
|
<xpath expr="//button[last()]" position="after">
|
||||||
<field invisible="1" name="hold_bg"/>
|
<field invisible="1" name="hold_bg" />
|
||||||
<button class="button btn-secondary" invisible="hold_bg == True" name="action_credit_hold" string="Credit Hold" type="object"/>
|
<button
|
||||||
<button class="button btn-secondary" invisible="hold_bg == False" name="action_lift_credit_hold" string="Lift Credit Hold" type="object"/>
|
class="button btn-secondary"
|
||||||
|
invisible="hold_bg == True"
|
||||||
|
name="action_credit_hold"
|
||||||
|
string="Credit Hold"
|
||||||
|
type="object"
|
||||||
|
/>
|
||||||
|
<button
|
||||||
|
class="button btn-secondary"
|
||||||
|
invisible="hold_bg == False"
|
||||||
|
name="action_lift_credit_hold"
|
||||||
|
string="Lift Credit Hold"
|
||||||
|
type="object"
|
||||||
|
/>
|
||||||
</xpath></field>
|
</xpath></field>
|
||||||
</record>
|
</record>
|
||||||
<record id="action_credit_hold" model="ir.actions.server">
|
<record id="action_credit_hold" model="ir.actions.server">
|
||||||
<field name="name">action_credit_hold</field>
|
<field name="name">action_credit_hold</field>
|
||||||
<field name="model_id" ref="base.model_res_partner"/>
|
<field name="model_id" ref="base.model_res_partner" />
|
||||||
<field name="binding_model_id" ref="base.model_res_partner"/>
|
<field name="binding_model_id" ref="base.model_res_partner" />
|
||||||
<field name="binding_view_types">list,form</field>
|
<field name="binding_view_types">list,form</field>
|
||||||
<field name="state">code</field>
|
<field name="state">code</field>
|
||||||
<field name="code">records.action_credit_hold()</field>
|
<field name="code">records.action_credit_hold()</field>
|
||||||
</record>
|
</record>
|
||||||
</data>
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,34 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<odoo>
|
<odoo>
|
||||||
<data>
|
|
||||||
<record id="res_partner_form_inherit" model="ir.ui.view">
|
<record id="res_partner_form_inherit" model="ir.ui.view">
|
||||||
<field name="name">account_credit_hold.res_partner.form</field>
|
<field name="name">account_credit_hold.res_partner.form</field>
|
||||||
<field name="model">res.partner</field>
|
<field name="model">res.partner</field>
|
||||||
<field name="inherit_id" ref="base.view_partner_form"/>
|
<field name="inherit_id" ref="base.view_partner_form" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//div[@name='button_box']" position="before">
|
<xpath expr="//div[@name='button_box']" position="before">
|
||||||
<field invisible="True" name="hold_bg"/>
|
<field invisible="True" name="hold_bg" />
|
||||||
<field invisible="True" name="on_hold"/>
|
<field invisible="True" name="on_hold" />
|
||||||
<widget bg_color="bg-danger" invisible="on_hold == False" name="web_ribbon" title="Credit Hold"/>
|
<widget
|
||||||
|
bg_color="bg-danger"
|
||||||
|
invisible="on_hold == False"
|
||||||
|
name="web_ribbon"
|
||||||
|
title="Credit Hold"
|
||||||
|
/>
|
||||||
</xpath></field>
|
</xpath></field>
|
||||||
</record>
|
</record>
|
||||||
<record id="view_partner_property_form_inherit" model="ir.ui.view">
|
<record id="view_partner_property_form_inherit" model="ir.ui.view">
|
||||||
<field name="name">account_credit_hold.view_partner_property_form</field>
|
<field name="name">account_credit_hold.view_partner_property_form</field>
|
||||||
<field name="model">res.partner</field>
|
<field name="model">res.partner</field>
|
||||||
<field name="inherit_id" ref="account.view_partner_property_form"/>
|
<field name="inherit_id" ref="account.view_partner_property_form" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//group[@name='banks']" position="before">
|
<xpath expr="//group[@name='banks']" position="before">
|
||||||
<group string="Credit Hold">
|
<group string="Credit Hold">
|
||||||
<field groups="account.group_account_manager,account.group_account_user" name="postpone_hold_until" readonly="hold_bg == False and postpone_hold_until == False"/>
|
<field
|
||||||
|
groups="account.group_account_manager,account.group_account_user"
|
||||||
|
name="postpone_hold_until"
|
||||||
|
readonly="hold_bg == False and postpone_hold_until == False"
|
||||||
|
/>
|
||||||
</group>
|
</group>
|
||||||
</xpath></field>
|
</xpath></field>
|
||||||
</record>
|
</record>
|
||||||
</data>
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,18 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<odoo>
|
<odoo>
|
||||||
<data>
|
|
||||||
<record id="sale_order_form_inherit" model="ir.ui.view">
|
<record id="sale_order_form_inherit" model="ir.ui.view">
|
||||||
<field name="name">account_credit_hold.sale_order.form</field>
|
<field name="name">account_credit_hold.sale_order.form</field>
|
||||||
<field name="model">sale.order</field>
|
<field name="model">sale.order</field>
|
||||||
<field name="inherit_id" ref="sale.view_order_form"/>
|
<field name="inherit_id" ref="sale.view_order_form" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//div[@name='button_box']" position="before">
|
<xpath expr="//div[@name='button_box']" position="before">
|
||||||
<field invisible="True" name="client_on_hold"/>
|
<field invisible="True" name="client_on_hold" />
|
||||||
<widget bg_color="bg-danger" invisible="client_on_hold == False" name="web_ribbon" title="Credit Hold"/>
|
<widget
|
||||||
|
bg_color="bg-danger"
|
||||||
|
invisible="client_on_hold == False"
|
||||||
|
name="web_ribbon"
|
||||||
|
title="Credit Hold"
|
||||||
|
/>
|
||||||
</xpath></field>
|
</xpath></field>
|
||||||
</record>
|
</record>
|
||||||
</data>
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,19 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<odoo>
|
<odoo>
|
||||||
<data>
|
|
||||||
<record id="stock_picking_form_inherit" model="ir.ui.view">
|
<record id="stock_picking_form_inherit" model="ir.ui.view">
|
||||||
<field name="name">account_credit_hold.stock_picking.form</field>
|
<field name="name">account_credit_hold.stock_picking.form</field>
|
||||||
<field name="model">stock.picking</field>
|
<field name="model">stock.picking</field>
|
||||||
<field name="inherit_id" ref="stock.view_picking_form"/>
|
<field name="inherit_id" ref="stock.view_picking_form" />
|
||||||
<field eval="8" name="priority"/>
|
<field eval="8" name="priority" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//div[@name='button_box']" position="before">
|
<xpath expr="//div[@name='button_box']" position="before">
|
||||||
<field invisible="True" name="client_on_hold"/>
|
<field invisible="True" name="client_on_hold" />
|
||||||
<widget bg_color="bg-danger" invisible="client_on_hold == False" name="web_ribbon" title="Credit Hold"/>
|
<widget
|
||||||
|
bg_color="bg-danger"
|
||||||
|
invisible="client_on_hold == False"
|
||||||
|
name="web_ribbon"
|
||||||
|
title="Credit Hold"
|
||||||
|
/>
|
||||||
</xpath></field>
|
</xpath></field>
|
||||||
</record>
|
</record>
|
||||||
</data>
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue