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