details:   https://code.tryton.org/tryton/commit/f0e6ce9424a0
branch:    default
user:      Cédric Krier <[email protected]>
date:      Mon Apr 07 19:13:55 2025 +0200
description:
        Allow EU excise declaration in alcohol volume
diffstat:

 modules/stock_ethanol/account_stock_eu.py  |  59 ++++++++++++++++++++++++++++++
 modules/stock_ethanol/tests/test_module.py |  49 +++++++++++++++++++++++-
 modules/stock_ethanol/tryton.cfg           |   6 +++
 3 files changed, 112 insertions(+), 2 deletions(-)

diffs (146 lines):

diff -r 135b2deba12f -r f0e6ce9424a0 modules/stock_ethanol/account_stock_eu.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/stock_ethanol/account_stock_eu.py Mon Apr 07 19:13:55 2025 +0200
@@ -0,0 +1,59 @@
+# This file is part of Tryton.  The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from decimal import Decimal
+
+from trytond.pool import Pool, PoolMeta
+from trytond.pyson import Eval, Id, If
+
+
+class ExciseTax(metaclass=PoolMeta):
+    __name__ = 'account.stock.eu.excise.tax'
+
+    @classmethod
+    def __setup__(cls):
+        super().__setup__()
+        cls.quantity.selection.append(
+            ('ethanol_volume', "Alcohol Volume"))
+        cls.uom.domain = [If(
+                Eval('quantity') == 'ethanol_volume',
+                [('category', '=', Id('product', 'uom_cat_volume'))],
+                cls.uom.domain)]
+
+    def convert_quantity(self, product, quantity):
+        pool = Pool()
+        UoM = pool.get('product.uom')
+
+        converted = super().convert_quantity(product, quantity)
+        if self.quantity == 'ethanol_volume':
+            ethanol_by_volume = product.ethanol_by_volume_used
+            if ethanol_by_volume is not None:
+                if product.default_uom.category == self.uom.category:
+                    quantity = quantity * ethanol_by_volume
+                    converted = UoM.compute_qty(
+                        product.default_uom, quantity, self.uom)
+                elif product.volume is not None:
+                    quantity = quantity * product.volume * ethanol_by_volume
+                    converted = UoM.compute_qty(
+                        product.volume_uom, quantity, self.uom)
+        return converted
+
+
+class ExciseTaxRate(metaclass=PoolMeta):
+    __name__ = 'account.stock.eu.excise.tax.rate'
+
+    @classmethod
+    def __setup__(cls):
+        super().__setup__()
+        cls.formula.help += ("\n"
+            "-ethanol_by_volume: the percentage of alcohol by volume")
+
+    def _compute_context(self, product, quantity):
+        context = super()._compute_context(product, quantity)
+        ethanol_by_volume = 0
+        if product:
+            ethanol_by_volume = product.ethanol_by_volume_used or 0
+        ethanol_by_volume = Decimal(str(ethanol_by_volume))
+        context['names'] = context['names'].copy()
+        context['names']['ethanol_by_volume'] = ethanol_by_volume
+        return context
diff -r 135b2deba12f -r f0e6ce9424a0 modules/stock_ethanol/tests/test_module.py
--- a/modules/stock_ethanol/tests/test_module.py        Sat Mar 28 17:41:16 
2026 +0100
+++ b/modules/stock_ethanol/tests/test_module.py        Mon Apr 07 19:13:55 
2025 +0200
@@ -1,12 +1,57 @@
 # This file is part of Tryton.  The COPYRIGHT file at the top level of
 # this repository contains the full copyright notices and license terms.
-from trytond.tests.test_tryton import ModuleTestCase
+
+from trytond.pool import Pool
+from trytond.tests.test_tryton import ModuleTestCase, with_transaction
 
 
 class StockEthanolTestCase(ModuleTestCase):
     "Test Stock Ethanol module"
     module = 'stock_ethanol'
-    extras = ['product_measurements']
+    extras = ['account_stock_eu_excise', 'product_measurements']
+
+    @with_transaction()
+    def test_convert_quantity(self):
+        "Test convert quantity"
+        pool = Pool()
+        ExciseTax = pool.get('account.stock.eu.excise.tax')
+        Product = pool.get('product.product')
+        UoM = pool.get('product.uom')
+        liter, = UoM.search([('name', '=', "Liter")])
+
+        excise_tax = ExciseTax(
+            quantity='ethanol_volume',
+            uom=liter,
+            )
+        product = Product(
+            ethanol_by_volume_used=.2,
+            default_uom=liter,
+            )
+
+        self.assertEqual(excise_tax.convert_quantity(product, 10), 2)
+
+    @with_transaction()
+    def test_convert_quantity_volume(self):
+        "Test convert quantity volume"
+        pool = Pool()
+        ExciseTax = pool.get('account.stock.eu.excise.tax')
+        Product = pool.get('product.product')
+        UoM = pool.get('product.uom')
+        liter, = UoM.search([('name', '=', "Liter")])
+        unit, = UoM.search([('name', '=', "Unit")])
+
+        excise_tax = ExciseTax(
+            quantity='ethanol_volume',
+            uom=liter,
+            )
+        product = Product(
+            ethanol_by_volume_used=.2,
+            default_uom=unit,
+            volume=.5,
+            volume_uom=liter,
+            )
+
+        self.assertEqual(excise_tax.convert_quantity(product, 10), 1)
 
 
 del ModuleTestCase
diff -r 135b2deba12f -r f0e6ce9424a0 modules/stock_ethanol/tryton.cfg
--- a/modules/stock_ethanol/tryton.cfg  Sat Mar 28 17:41:16 2026 +0100
+++ b/modules/stock_ethanol/tryton.cfg  Mon Apr 07 19:13:55 2025 +0200
@@ -6,6 +6,7 @@
     product
     stock
 extras_depend:
+    account_stock_eu_excise
     product_measurements
 xml:
     product.xml
@@ -20,3 +21,8 @@
     stock.ConfigurationEthanol
     stock.Move
     stock.ProductsByLocations
+
+[register account_stock_eu_excise]
+model:
+    account_stock_eu.ExciseTax
+    account_stock_eu.ExciseTaxRate

Reply via email to