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:
Luis 2025-12-04 14:01:50 +01:00
parent 7df39dbda8
commit 5c213a3d6a
9 changed files with 215 additions and 0 deletions

View 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

View file

@ -0,0 +1 @@
from . import models

View 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,
}

View file

@ -0,0 +1 @@
from . import triple_discount_mixin

View file

@ -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)

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>