Skip to content

Commit ff085b8

Browse files
committed
[IMP] excise_management : Deposit & excise totals by line
This commit adds fields to display deposit & excise totals by line on Sale Orders and Invoices. It also improves the deposit definition of a tax (group). Task-5127418 closes #1214 Signed-off-by: Vallaeys Valentin (vava) <[email protected]>
1 parent dc675cf commit ff085b8

File tree

13 files changed

+338
-16
lines changed

13 files changed

+338
-16
lines changed

beverage_distributor/__manifest__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
'name': 'Beverage Distributor',
3-
'version': '2.0',
3+
'version': '2.1',
44
'category': 'Supply Chain',
55
'depends': [
66
'base_automation',

beverage_distributor/data/ir_model_fields.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
<?xml version='1.0' encoding='UTF-8'?>
22
<odoo>
3-
<record id="account_tax_group_is_deposit" model="ir.model.fields">
4-
<field name="ttype">boolean</field>
5-
<field name="field_description">Is a deposit</field>
6-
<field name="model_id" ref="account.model_account_tax_group"/>
7-
<field name="name">x_is_deposit</field>
8-
</record>
93
<record id="field_aut_production" model="ir.model.fields">
104
<field name="name">x_auto_production</field>
115
<field name="field_description">Auto-production</field>

beverage_distributor/i18n/beverage_distributor.pot

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ msgid ""
66
msgstr ""
77
"Project-Id-Version: Odoo Server 19.0+e\n"
88
"Report-Msgid-Bugs-To: \n"
9-
"POT-Creation-Date: 2025-10-10 13:14+0000\n"
10-
"PO-Revision-Date: 2025-10-10 13:14+0000\n"
9+
"POT-Creation-Date: 2025-10-28 12:27+0000\n"
10+
"PO-Revision-Date: 2025-10-28 12:27+0000\n"
1111
"Last-Translator: \n"
1212
"Language-Team: \n"
1313
"MIME-Version: 1.0\n"
@@ -642,7 +642,6 @@ msgid "Inventory Management 📦"
642642
msgstr ""
643643

644644
#. module: beverage_distributor
645-
#: model:ir.model.fields,field_description:beverage_distributor.account_tax_group_is_deposit
646645
#: model:ir.model.fields,field_description:beverage_distributor.x_is_a_deposit
647646
msgid "Is a deposit"
648647
msgstr ""

excise_management/__manifest__.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
{
22
'name': 'Excise Management',
3-
'version': '2.1',
3+
'version': '2.2',
44
'category': 'Inventory/Inventory',
55
'author': 'Odoo S.A.',
66
'depends': [
77
'account_tax_python',
88
'base_automation',
9+
'sale_management',
910
'stock',
1011
'web_studio',
1112
],
1213
'data': [
1314
'data/ir_model.xml',
1415
'data/ir_model_fields.xml',
1516
'data/ir_ui_view.xml',
17+
'data/qweb_view.xml',
1618
'data/ir_actions_act_window.xml',
1719
'data/account_tax_group.xml',
1820
'data/ir_actions_server.xml',
@@ -25,6 +27,9 @@
2527
'data/x_excise_category.xml',
2628
'data/res_config_setting.xml',
2729
],
30+
'cloc_exclude': [
31+
'data/qweb_view.xml',
32+
],
2833
'license': 'OPL-1',
2934
'images': ['images/main.png'],
3035
}

excise_management/data/base_automation.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,11 @@
2020
<field name="name">Add/Remove Excise Taxes on Fiscal Position</field>
2121
<field name="trigger_field_ids" eval="[(6, 0, [ref('fiscal_position_is_fiscal_deposit')])]"/>
2222
</record>
23+
<record id="base_automation_8" model="base.automation">
24+
<field name="name">Sequence the taxes</field>
25+
<field name="model_id" ref="account.model_account_tax"/>
26+
<field name="action_server_ids" eval="[(6, 0, [ref('resequence_the_order_of_taxes')])]"/>
27+
<field name="trigger">on_create_or_write</field>
28+
<field name="trigger_field_ids" eval="[(6, 0, [ref('account.field_account_tax__tax_group_id')])]"/>
29+
</record>
2330
</odoo>

excise_management/data/ir_actions_server.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,12 @@ for fp in records:
4040
<field name="state">code</field>
4141
<field name="name">Add/Remove excise tax on Fiscal Position</field>
4242
</record>
43+
<record id="resequence_the_order_of_taxes" model="ir.actions.server">
44+
<field name="code"><![CDATA[all_taxes = env['account.tax'].sudo().search([], order="x_is_deposit asc, x_is_excise desc, sequence asc")
45+
for idx, tax in enumerate(all_taxes, start=1):
46+
tax['sequence'] = idx]]></field>
47+
<field name="model_id" ref="account.model_account_tax"/>
48+
<field name="state">code</field>
49+
<field name="name">Sequence the taxes</field>
50+
</record>
4351
</odoo>

excise_management/data/ir_model_fields.xml

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,4 +257,134 @@ for template in self:
257257
<field name="relation">uom.uom</field>
258258
<field name="readonly" eval="True"/>
259259
</record>
260+
<record id="account_tax_group_is_deposit" model="ir.model.fields">
261+
<field name="ttype">boolean</field>
262+
<field name="field_description">Is Deposit</field>
263+
<field name="model_id" ref="account.model_account_tax_group"/>
264+
<field name="name">x_is_deposit</field>
265+
</record>
266+
<record id="account_tax_deposit_field" model="ir.model.fields">
267+
<field name="name">x_is_deposit</field>
268+
<field name="field_description">Is Deposit</field>
269+
<field name="model_id" ref="account.model_account_tax"/>
270+
<field name="related">tax_group_id.x_is_deposit</field>
271+
<field name="ttype">boolean</field>
272+
<field name="readonly" eval="True"/>
273+
</record>
274+
<record id="sale_order_line_excise_free_unit_price_field" model="ir.model.fields">
275+
<field name="name">x_excise_free_unit_price</field>
276+
<field name="field_description">Excise Free Unit Price</field>
277+
<field name="model_id" ref="sale.model_sale_order_line"/>
278+
<field name="ttype">monetary</field>
279+
<field name="depends">price_unit, product_id</field>
280+
<field name="compute"><![CDATA[for record in self:
281+
record['x_excise_free_unit_price'] = record.price_unit - record.product_id.x_excise_amount]]></field>
282+
<field name="readonly" eval="True"/>
283+
<field name="store" eval="False"/>
284+
<field name="currency_field">currency_id</field>
285+
</record>
286+
<record id="sale_order_line_total_excises_field" model="ir.model.fields">
287+
<field name="name">x_total_excises</field>
288+
<field name="field_description">Excises</field>
289+
<field name="model_id" ref="sale.model_sale_order_line"/>
290+
<field name="ttype">monetary</field>
291+
<field name="depends">product_id, product_uom_qty, order_id.fiscal_position_id</field>
292+
<field name="compute"><![CDATA[for record in self:
293+
record['x_total_excises'] = record.product_id.x_excise_amount * record.product_uom_qty if not record.order_id.fiscal_position_id.x_is_fiscal_deposit else False]]></field>
294+
<field name="readonly" eval="True"/>
295+
<field name="currency_field">currency_id</field>
296+
</record>
297+
<record id="sale_order_line_total_deposits_field" model="ir.model.fields">
298+
<field name="name">x_total_deposits</field>
299+
<field name="field_description">Deposits</field>
300+
<field name="ttype">monetary</field>
301+
<field name="model_id" ref="sale.model_sale_order_line"/>
302+
<field name="depends">product_uom_qty, tax_ids</field>
303+
<field name="compute"><![CDATA[for record in self:
304+
deposit = sum(tax.amount for tax in record.tax_ids if tax.x_is_deposit)
305+
record['x_total_deposits'] = deposit * record.product_uom_qty]]></field>
306+
<field name="readonly" eval="True"/>
307+
<field name="store" eval="False"/>
308+
<field name="currency_field">currency_id</field>
309+
</record>
310+
<record id="sale_order_has_deposit_line_field" model="ir.model.fields">
311+
<field name="name">x_has_deposit_line</field>
312+
<field name="field_description">Has Deposit Line</field>
313+
<field name="model_id" ref="sale.model_sale_order"/>
314+
<field name="ttype">boolean</field>
315+
<field name="depends">order_line.x_total_deposits</field>
316+
<field name="compute"><![CDATA[
317+
for record in self:
318+
record['x_has_deposit_line'] = any(line.x_total_deposits for line in record.order_line)]]></field>
319+
<field name="store" eval="False"/>
320+
</record>
321+
322+
<record id="sale_order_has_excise_line_field" model="ir.model.fields">
323+
<field name="name">x_has_excise_line</field>
324+
<field name="field_description">Has Excise Line</field>
325+
<field name="model_id" ref="sale.model_sale_order"/>
326+
<field name="ttype">boolean</field>
327+
<field name="depends">order_line.x_total_excises</field>
328+
<field name="compute"><![CDATA[
329+
for record in self:
330+
record['x_has_excise_line'] = any(line.x_total_excises for line in record.order_line)]]></field>
331+
<field name="store" eval="False"/>
332+
</record>
333+
<record id="account_move_line_excise_free_unit_price_field" model="ir.model.fields">
334+
<field name="name">x_excise_free_unit_price_account_move</field>
335+
<field name="field_description">Excise Free Unit Price</field>
336+
<field name="ttype">monetary</field>
337+
<field name="model_id" ref="account.model_account_move_line"/>
338+
<field name="depends">price_unit, product_id</field>
339+
<field name="compute"><![CDATA[for record in self:
340+
record['x_excise_free_unit_price_account_move'] = record.price_unit - record.product_id.x_excise_amount]]></field>
341+
<field name="readonly" eval="True"/>
342+
<field name="currency_field">company_currency_id</field>
343+
</record>
344+
<record id="account_move_line_total_excise_field" model="ir.model.fields">
345+
<field name="name">x_total_excises_account_move</field>
346+
<field name="field_description">Excises</field>
347+
<field name="model_id" ref="account.model_account_move_line"/>
348+
<field name="ttype">monetary</field>
349+
<field name="depends">product_id, quantity</field>
350+
<field name="compute"><![CDATA[for record in self:
351+
record['x_total_excises_account_move'] = record.product_id.x_excise_amount * record.quantity if not record.sale_line_ids.order_id.fiscal_position_id.x_is_fiscal_deposit else False]]></field>
352+
<field name="readonly" eval="True"/>
353+
<field name="currency_field">company_currency_id</field>
354+
</record>
355+
<record id="account_move_line_total_deposits_field" model="ir.model.fields">
356+
<field name="name">x_total_deposits_account_move</field>
357+
<field name="field_description">Deposits</field>
358+
<field name="model_id" ref="account.model_account_move_line"/>
359+
<field name="ttype">monetary</field>
360+
<field name="depends">tax_ids, quantity</field>
361+
<field name="compute"><![CDATA[for record in self:
362+
deposit = sum(tax.amount for tax in record.tax_ids if tax.x_is_deposit)
363+
record['x_total_deposits_account_move'] = deposit * record.quantity]]></field>
364+
<field name="readonly" eval="True"/>
365+
<field name="currency_field">company_currency_id</field>
366+
</record>
367+
<record id="account_move_has_deposit_line_field" model="ir.model.fields">
368+
<field name="name">x_has_deposit_line</field>
369+
<field name="field_description">Has Deposit Line</field>
370+
<field name="model_id" ref="account.model_account_move"/>
371+
<field name="ttype">boolean</field>
372+
<field name="depends">line_ids.x_total_deposits_account_move</field>
373+
<field name="compute"><![CDATA[
374+
for record in self:
375+
record['x_has_deposit_line'] = any(line.x_total_deposits_account_move for line in record.line_ids)]]></field>
376+
<field name="store" eval="False"/>
377+
</record>
378+
379+
<record id="account_move_has_excise_line_field" model="ir.model.fields">
380+
<field name="name">x_has_excise_line</field>
381+
<field name="field_description">Has Excise Line</field>
382+
<field name="model_id" ref="account.model_account_move"/>
383+
<field name="ttype">boolean</field>
384+
<field name="depends">line_ids.x_total_excises_account_move</field>
385+
<field name="compute"><![CDATA[
386+
for record in self:
387+
record['x_has_excise_line'] = any(line.x_total_excises_account_move for line in record.line_ids)]]></field>
388+
<field name="store" eval="False"/>
389+
</record>
260390
</odoo>

excise_management/data/ir_ui_view.xml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,53 @@
124124
</list>
125125
</field>
126126
</record>
127+
<record id="sale_order_form_view" model="ir.ui.view">
128+
<field name="name">sale.order.form.inherit.excise_management</field>
129+
<field name="inherit_id" ref="sale.view_order_form"/>
130+
<field name="mode">extension</field>
131+
<field name="model">sale.order</field>
132+
<field name="priority">160</field>
133+
<field name="type">form</field>
134+
<field name="active" eval="True"/>
135+
<field name="arch" type="xml">
136+
<xpath expr="//page[@name='order_lines']//list//field[@name='tax_ids']" position="after">
137+
<field optional="show" name="x_excise_free_unit_price" invisible="not x_excise_free_unit_price" column_invisible="not parent.x_has_excise_line"/>
138+
<field optional="show" name="x_total_excises" invisible="not x_total_excises" column_invisible="not parent.x_has_excise_line"/>
139+
<field optional="show" name="x_total_deposits" invisible="not x_total_deposits" column_invisible="not parent.x_has_deposit_line"/>
140+
<field name="currency_id" column_invisible="1"/>
141+
</xpath>
142+
</field>
143+
</record>
144+
<record id="account_move_form_view" model="ir.ui.view">
145+
<field name="name">account.move.form.inherit.excise_management</field>
146+
<field name="inherit_id" ref="account.view_move_form"/>
147+
<field name="active" eval="True"/>
148+
<field name="mode">extension</field>
149+
<field name="model">account.move</field>
150+
<field name="priority">300</field>
151+
<field name="type">form</field>
152+
<field name="arch" type="xml">
153+
<xpath expr="//list[@name='journal_items']//field[@name='price_unit']" position="after">
154+
<field optional="show" name="x_excise_free_unit_price_account_move" invisible="not x_excise_free_unit_price_account_move" column_invisible="not parent.x_has_excise_line"/>
155+
<field optional="show" name="x_total_excises_account_move" invisible="not x_total_excises_account_move" column_invisible="not parent.x_has_excise_line"/>
156+
<field optional="show" name="x_total_deposits_account_move" invisible="not x_total_deposits_account_move" column_invisible="not parent.x_has_deposit_line"/>
157+
<field name="company_currency_id" column_invisible="1"/>
158+
</xpath>
159+
</field>
160+
</record>
161+
<record id="account_tax_group_form_view" model="ir.ui.view">
162+
<field name="name">account.tax.group.form.inherit.excise_management</field>
163+
<field name="inherit_id" ref="account.view_tax_group_form"/>
164+
<field name="mode">extension</field>
165+
<field name="model">account.tax.group</field>
166+
<field name="priority">99</field>
167+
<field name="type">form</field>
168+
<field name="active" eval="True"/>
169+
<field name="arch" type="xml">
170+
<xpath expr="/form//field[@name='pos_receipt_label']" position="after">
171+
<field name="x_is_deposit"/>
172+
<field name="x_is_excise"/>
173+
</xpath>
174+
</field>
175+
</record>
127176
</odoo>
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?xml version='1.0' encoding='UTF-8'?>
2+
<odoo>
3+
<template id="report_saleorder_custom_inherit" inherit_id="sale.report_saleorder_document">
4+
<xpath expr="//t[@t-set='display_taxes']" position="after">
5+
<t t-set="display_excise_free_unit_price" t-value="any(l.x_excise_free_unit_price for l in lines_to_report)"/>
6+
<t t-set="display_total_excises" t-value="any(l.x_total_excises for l in lines_to_report)"/>
7+
<t t-set="display_total_deposits" t-value="any(l.x_total_deposits for l in lines_to_report)"/>
8+
</xpath>
9+
10+
<xpath expr="//th[@name='th_taxes']" position="after">
11+
<th name="th_excise_free_unit_price" t-if="display_excise_free_unit_price" class="text-end">
12+
<span>Excise Free Unit Price</span>
13+
</th>
14+
<th name="th_total_excises" t-if="display_total_excises" class="text-end">
15+
<span>Total Excises</span>
16+
</th>
17+
<th name="th_total_deposits" t-if="display_total_deposits" class="text-end">
18+
<span>Total Deposits</span>
19+
</th>
20+
</xpath>
21+
22+
<xpath expr="//tr[@name='tr_product']/td[@name='td_product_taxes']" position="after">
23+
<td name="td_excise_free_unit_price" t-if="display_excise_free_unit_price" class="text-end">
24+
<span t-field="line.x_excise_free_unit_price" t-options="{'widget': 'float', 'precision': 2}" t-if="line.x_excise_free_unit_price"/>
25+
</td>
26+
<td name="td_display_total_excises" t-if="display_total_excises" class="text-end">
27+
<span t-field="line.x_total_excises" t-options="{'widget': 'float', 'precision': 2}" t-if="line.x_total_excises"/>
28+
</td>
29+
<td name="td_display_total_deposits" t-if="display_total_deposits" class="text-end">
30+
<span t-field="line.x_total_deposits" t-options="{'widget': 'float', 'precision': 2}" t-if="line.x_total_deposits"/>
31+
</td>
32+
</xpath>
33+
</template>
34+
35+
<template id="report_invoice_document_inherit_custom" inherit_id="account.report_invoice_document">
36+
<xpath expr="//t[@t-set='display_taxes']" position="after">
37+
<t t-set="display_excise_free_unit_price" t-value="any(l.x_excise_free_unit_price_account_move for l in o.invoice_line_ids)"/>
38+
<t t-set="display_total_excises" t-value="any(l.x_total_excises_account_move for l in o.invoice_line_ids)"/>
39+
<t t-set="display_total_deposits" t-value="any(l.x_total_deposits_account_move for l in o.invoice_line_ids)"/>
40+
</xpath>
41+
42+
<xpath expr="//th[@name='th_taxes']" position="after">
43+
<th name="th_excise_free_unit_price" t-if="display_excise_free_unit_price"
44+
t-attf-class="text-end {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
45+
<span>Excise Free Unit Price</span>
46+
</th>
47+
<th name="th_total_excises" t-if="display_total_excises"
48+
t-attf-class="text-end {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
49+
<span>Total Excises</span>
50+
</th>
51+
<th name="th_total_deposits" t-if="display_total_deposits"
52+
t-attf-class="text-end {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
53+
<span>Total Deposits</span>
54+
</th>
55+
</xpath>
56+
57+
<xpath expr="//td[@name='td_taxes']" position="after">
58+
<td name="td_excise_free_unit_price" t-if="display_excise_free_unit_price"
59+
t-attf-class="text-end {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
60+
<span t-out="line.x_excise_free_unit_price_account_move"
61+
id="line_x_excise_free_unit_price_account_move" t-options="{'widget': 'float', 'precision': 2}" t-if="line.x_excise_free_unit_price_account_move"/>
62+
</td>
63+
<td name="td_display_total_excises" t-if="display_total_excises"
64+
t-attf-class="text-end {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
65+
<span t-out="line.x_total_excises_account_move" id="line_x_total_excises_account_move" t-options="{'widget': 'float', 'precision': 2}" t-if="line.x_total_excises_account_move"/>
66+
</td>
67+
<td name="td_display_total_deposits" t-if="display_total_deposits"
68+
t-attf-class="text-end {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
69+
<span t-out="line.x_total_deposits_account_move" id="line_x_total_deposits_account_move" t-options="{'widget': 'float', 'precision': 2}" t-if="line.x_total_deposits_account_move"/>
70+
</td>
71+
</xpath>
72+
</template>
73+
</odoo>

0 commit comments

Comments
 (0)