Criptomart/red-supermercados-coop#17 add account_invoice_triple_discount_readonly: fix write discount2 and dicount3 columns. Make discount (total) readonly
This commit is contained in:
parent
7df39dbda8
commit
5c213a3d6a
9 changed files with 215 additions and 0 deletions
61
account_invoice_triple_discount_readonly/README.md
Normal file
61
account_invoice_triple_discount_readonly/README.md
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
# Account Invoice Triple Discount Readonly
|
||||
|
||||
## Description
|
||||
|
||||
This module fixes a bug in `account_invoice_triple_discount` when combined with `purchase_triple_discount`.
|
||||
|
||||
### Original Problem
|
||||
|
||||
In purchase orders, when configuring a discount in the `discount2` or `discount3` columns, upon saving:
|
||||
- All discounts were accumulated in the `discount1` column
|
||||
- The `discount2` and `discount3` fields were reset to zero
|
||||
|
||||
This occurred because the original mixin's `write` method always reset `discount2` and `discount3` to 0 when the computed `discount` field was included in the write (which happens when any discount is modified).
|
||||
|
||||
### Solution
|
||||
|
||||
The module overrides the `write` method of `triple.discount.mixin` to:
|
||||
1. Detect if `discount1`, `discount2` or `discount3` are being explicitly modified
|
||||
2. If there are explicit discounts, ignore the computed `discount` field
|
||||
3. If only the `discount` field comes, maintain legacy behavior (map to `discount1` and reset the rest)
|
||||
|
||||
Additionally, it makes the `discount` field (total discount) **readonly** in:
|
||||
- Partner form view (`res.partner`)
|
||||
- Supplier info in product form (`product.supplierinfo`)
|
||||
- Base mixin (`triple.discount.mixin`)
|
||||
|
||||
This forces users to work only with the `discount1`, `discount2` and `discount3` columns, avoiding confusion.
|
||||
|
||||
## Installation
|
||||
|
||||
1. Make sure `account_invoice_triple_discount` and `purchase_triple_discount` are installed
|
||||
2. Update the module list
|
||||
3. Install `account_invoice_triple_discount_readonly`
|
||||
|
||||
## Usage
|
||||
|
||||
After installation:
|
||||
- The total discount field will be readonly and automatically calculated
|
||||
- Users must use discount1, discount2, and discount3 fields to set discounts
|
||||
- When saving, the individual discount values will be preserved correctly
|
||||
|
||||
## Bug Tracker
|
||||
|
||||
Bugs are tracked on [GitHub Issues](https://github.com/OCA/account-invoicing/issues).
|
||||
In case of trouble, please check there if your issue has already been reported.
|
||||
|
||||
## Credits
|
||||
|
||||
### Contributors
|
||||
|
||||
* Coop Makers
|
||||
|
||||
### Maintainers
|
||||
|
||||
This module is maintained by the OCA.
|
||||
|
||||
## Compatibility
|
||||
|
||||
- Odoo 16.0
|
||||
- account_invoice_triple_discount
|
||||
- purchase_triple_discount
|
||||
1
account_invoice_triple_discount_readonly/__init__.py
Normal file
1
account_invoice_triple_discount_readonly/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
|||
from . import models
|
||||
18
account_invoice_triple_discount_readonly/__manifest__.py
Normal file
18
account_invoice_triple_discount_readonly/__manifest__.py
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
# Copyright 2025
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
{
|
||||
"name": "Account Invoice Triple Discount Readonly",
|
||||
"version": "16.0.1.0.0",
|
||||
"summary": "Make total discount readonly and fix discount2/discount3 write issue",
|
||||
"license": "AGPL-3",
|
||||
"author": "Criptomart",
|
||||
"website": "https://github.com/OCA/account-invoicing",
|
||||
"depends": ["account_invoice_triple_discount", "purchase_triple_discount"],
|
||||
"data": [
|
||||
"views/product_supplierinfo_view.xml",
|
||||
"views/res_partner_view.xml",
|
||||
"views/purchase_order_view.xml",
|
||||
"views/account_move_view.xml",
|
||||
],
|
||||
"installable": True,
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
from . import triple_discount_mixin
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
from odoo import fields, models
|
||||
|
||||
|
||||
class TripleDiscountMixin(models.AbstractModel):
|
||||
_inherit = "triple.discount.mixin"
|
||||
|
||||
# Make the discount field readonly to prevent manual edits
|
||||
discount = fields.Float(readonly=True)
|
||||
|
||||
def write(self, vals):
|
||||
discount_fields = self._get_multiple_discount_field_names()
|
||||
|
||||
if "discount" in vals:
|
||||
# Check if any of discount1, discount2 or discount3
|
||||
# are being explicitly modified
|
||||
has_explicit_discounts = any(field in vals for field in discount_fields)
|
||||
|
||||
if has_explicit_discounts:
|
||||
# If there are explicit discounts, remove the computed 'discount' field
|
||||
# to avoid overwriting the explicit values
|
||||
vals.pop("discount")
|
||||
else:
|
||||
# If only 'discount' comes, apply legacy behavior:
|
||||
# map to discount1 and reset discount2 and discount3
|
||||
vals["discount1"] = vals.pop("discount")
|
||||
vals.update({field: 0 for field in discount_fields[1:]})
|
||||
|
||||
return super().write(vals)
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
|
||||
<!-- Make discount field readonly in invoice lines -->
|
||||
<record id="invoice_triple_discount_readonly" model="ir.ui.view">
|
||||
<field name="name">account.invoice.triple.discount.readonly</field>
|
||||
<field name="model">account.move</field>
|
||||
<field
|
||||
name="inherit_id"
|
||||
ref="account_invoice_triple_discount.invoice_triple_discount_form_view"
|
||||
/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath
|
||||
expr="//field[@name='invoice_line_ids']//tree//field[@name='discount']"
|
||||
position="attributes"
|
||||
>
|
||||
<attribute name="readonly">1</attribute>
|
||||
</xpath>
|
||||
<xpath
|
||||
expr="//field[@name='invoice_line_ids']//form//field[@name='discount']"
|
||||
position="attributes"
|
||||
>
|
||||
<attribute name="readonly">1</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
|
||||
<!-- Make discount field readonly in supplier info form view -->
|
||||
<record model="ir.ui.view" id="product_supplierinfo_form_view_readonly_discount">
|
||||
<field name="model">product.supplierinfo</field>
|
||||
<field
|
||||
name="inherit_id"
|
||||
ref="purchase_triple_discount.product_supplierinfo_form_view"
|
||||
/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='discount']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Make discount field readonly in supplier info tree view -->
|
||||
<record model="ir.ui.view" id="product_supplierinfo_tree_view_readonly_discount">
|
||||
<field name="model">product.supplierinfo</field>
|
||||
<field
|
||||
name="inherit_id"
|
||||
ref="purchase_triple_discount.product_supplierinfo_tree_view"
|
||||
/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='discount']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
|
||||
<!-- Make discount field readonly in purchase order lines -->
|
||||
<record id="purchase_order_triple_discount_readonly" model="ir.ui.view">
|
||||
<field name="name">purchase.order.triple.discount.readonly</field>
|
||||
<field name="model">purchase.order</field>
|
||||
<field
|
||||
name="inherit_id"
|
||||
ref="purchase_triple_discount.purchase_order_triple_discount_form_view"
|
||||
/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath
|
||||
expr="//field[@name='order_line']//tree//field[@name='discount']"
|
||||
position="attributes"
|
||||
>
|
||||
<attribute name="readonly">1</attribute>
|
||||
</xpath>
|
||||
<xpath
|
||||
expr="//field[@name='order_line']//form//field[@name='discount']"
|
||||
position="attributes"
|
||||
>
|
||||
<attribute name="readonly">1</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
|
||||
<!-- Make default_supplierinfo_discount readonly in partner form view -->
|
||||
<record model="ir.ui.view" id="res_partner_form_view_readonly_discount">
|
||||
<field name="model">res.partner</field>
|
||||
<field
|
||||
name="inherit_id"
|
||||
ref="purchase_triple_discount.res_partner_form_view"
|
||||
/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="default_supplierinfo_discount" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
Loading…
Add table
Add a link
Reference in a new issue