[FIX] sale: subtotal computation and display

Steps to reproduce:
- Install Accounting and Sale
- Enable the developer mode.
- Go to Settings > Users & Comp > Your user, edit to check both "Tax
Display B2B" and "Tax Display B2C" boxes.
- Go to Settings > General Settings > Accounting > Reporting, check the
"Add totals below sections" box.
- Create a sale order in the sale module, the sale order must have at
least one section with several products.
- Print the sale order. The subtotal amounts are wrong.

There are two different subtotals amount to compute, one for the
*Amount* column and one for the *Total Price*. The actual computation
did not store the two amount in different variables. Multiple template
are broken in the same way.

Fine tunning of 716ff76

Co-authored-by: Nans Lefevre <len@odoo.com>

opw-1950833

closes odoo/odoo#32148

Signed-off-by: Nans Lefebvre (len) <len@odoo.com>
This commit is contained in:
Julien Castiaux
2019-03-27 13:16:56 +00:00
co-authored by Nans Lefevre
parent 9a8859cc92
commit e2e27b41ad
3 changed files with 67 additions and 52 deletions
+22 -17
View File
@@ -51,29 +51,26 @@
<table class="table table-sm o_main_table" name="invoice_line_table"> <table class="table table-sm o_main_table" name="invoice_line_table">
<thead> <thead>
<tr> <tr>
<t t-set="colspan" t-value="6"/>
<th class="text-left"><span>Description</span></th> <th class="text-left"><span>Description</span></th>
<th class="d-none text-left"><span>Source Document</span></th> <th class="d-none text-left"><span>Source Document</span></th>
<th class="text-right"><span>Quantity</span></th> <th class="text-right"><span>Quantity</span></th>
<th t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}"><span>Unit Price</span></th> <th t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}"><span>Unit Price</span></th>
<th t-if="display_discount" t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}"> <th t-if="display_discount" t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
<span>Disc.(%)</span> <span>Disc.(%)</span>
<t t-set="colspan" t-value="colspan+1"/>
</th> </th>
<th t-attf-class="text-left {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}"><span>Taxes</span></th> <th t-attf-class="text-left {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}"><span>Taxes</span></th>
<th class="text-right"> <th class="text-right" groups="account.group_show_line_subtotals_tax_excluded">Amount</th>
<span groups="account.group_show_line_subtotals_tax_excluded">Amount</span> <th class="text-right" groups="account.group_show_line_subtotals_tax_included">Total Price</th>
<span groups="account.group_show_line_subtotals_tax_included">Total Price</span>
</th>
</tr> </tr>
</thead> </thead>
<tbody class="invoice_tbody"> <tbody class="invoice_tbody">
<t t-set="current_subtotal" t-value="0"/> <t t-set="current_subtotal_tax_excluded" t-value="0"/>
<t t-set="current_subtotal_tax_included" t-value="0"/>
<t t-foreach="o.invoice_line_ids" t-as="line"> <t t-foreach="o.invoice_line_ids" t-as="line">
<t t-set="current_subtotal" t-value="current_subtotal + line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/> <t t-set="current_subtotal_tax_excluded" t-value="current_subtotal_tax_excluded + line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/>
<t t-set="current_subtotal" t-value="current_subtotal + line.price_total" groups="account.group_show_line_subtotals_tax_included"/> <t t-set="current_subtotal_tax_included" t-value="current_subtotal_tax_included + line.price_total" groups="account.group_show_line_subtotals_tax_included"/>
<tr t-att-class="'bg-200 font-weight-bold o_line_section' if line.display_type == 'line_section' else 'font-italic o_line_note' if line.display_type == 'line_note' else ''"> <tr t-att-class="'bg-200 font-weight-bold o_line_section' if line.display_type == 'line_section' else 'font-italic o_line_note' if line.display_type == 'line_note' else ''">
<t t-if="not line.display_type" name="account_invoice_line_accountable"> <t t-if="not line.display_type" name="account_invoice_line_accountable">
@@ -92,20 +89,23 @@
<td t-attf-class="text-left {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}"> <td t-attf-class="text-left {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
<span t-esc="', '.join(map(lambda x: (x.description or x.name), line.invoice_line_tax_ids))"/> <span t-esc="', '.join(map(lambda x: (x.description or x.name), line.invoice_line_tax_ids))"/>
</td> </td>
<td class="text-right o_price_total"> <td class="text-right o_price_total" groups="account.group_show_line_subtotals_tax_excluded">
<span t-field="line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/> <span t-field="line.price_subtotal"/>
<span t-field="line.price_total" groups="account.group_show_line_subtotals_tax_included"/> </td>
<td class="text-right o_price_total" groups="account.group_show_line_subtotals_tax_included">
<span t-field="line.price_total"/>
</td> </td>
</t> </t>
<t t-if="line.display_type == 'line_section'"> <t t-if="line.display_type == 'line_section'">
<td t-att-colspan="colspan"> <td colspan="99">
<span t-field="line.name"/> <span t-field="line.name"/>
</td> </td>
<t t-set="current_section" t-value="line"/> <t t-set="current_section" t-value="line"/>
<t t-set="current_subtotal" t-value="0"/> <t t-set="current_subtotal_tax_excluded" t-value="0"/>
<t t-set="current_subtotal_tax_included" t-value="0"/>
</t> </t>
<t t-if="line.display_type == 'line_note'"> <t t-if="line.display_type == 'line_note'">
<td t-att-colspan="colspan"> <td colspan="99">
<span t-field="line.name"/> <span t-field="line.name"/>
</td> </td>
</t> </t>
@@ -113,12 +113,17 @@
<t t-if="current_section and (line_last or o.invoice_line_ids[line_index+1].display_type == 'line_section')"> <t t-if="current_section and (line_last or o.invoice_line_ids[line_index+1].display_type == 'line_section')">
<tr class="is-subtotal text-right"> <tr class="is-subtotal text-right">
<td t-att-colspan="colspan"> <td colspan="99">
<strong class="mr16">Subtotal</strong> <strong class="mr16">Subtotal</strong>
<span <span
t-esc="current_subtotal" groups="account.group_show_line_subtotals_tax_excluded"
t-esc="current_subtotal_tax_excluded"
t-options='{"widget": "monetary", "display_currency": o.currency_id}' t-options='{"widget": "monetary", "display_currency": o.currency_id}'
/> />
<span groups="account.group_show_line_subtotals_tax_included"> | <span
t-esc="current_subtotal_tax_included"
t-options='{"widget": "monetary", "display_currency": o.currency_id}'
/></span>
</td> </td>
</tr> </tr>
</t> </t>
+22 -17
View File
@@ -70,29 +70,26 @@
<table class="table table-sm o_main_table"> <table class="table table-sm o_main_table">
<thead> <thead>
<tr> <tr>
<t t-set="colspan" t-value="5"/>
<th class="text-left">Description</th> <th class="text-left">Description</th>
<th class="text-right">Quantity</th> <th class="text-right">Quantity</th>
<th class="text-right">Unit Price</th> <th class="text-right">Unit Price</th>
<th t-if="display_discount" class="text-right" groups="sale.group_discount_per_so_line"> <th t-if="display_discount" class="text-right" groups="sale.group_discount_per_so_line">
<span>Disc.(%)</span> <span>Disc.(%)</span>
<t t-set="colspan" t-value="colspan+1"/>
</th> </th>
<th class="text-right">Taxes</th> <th class="text-right">Taxes</th>
<th class="text-right"> <th class="text-right" groups="account.group_show_line_subtotals_tax_excluded">Amount</th>
<t groups="account.group_show_line_subtotals_tax_excluded">Amount</t> <th class="text-right" groups="account.group_show_line_subtotals_tax_included">Total Price</th>
<t groups="account.group_show_line_subtotals_tax_included">Total Price</t>
</th>
</tr> </tr>
</thead> </thead>
<tbody class="sale_tbody"> <tbody class="sale_tbody">
<t t-set="current_subtotal" t-value="0"/> <t t-set="current_subtotal_tax_excluded" t-value="0"/>
<t t-set="current_subtotal_tax_included" t-value="0"/>
<t t-foreach="doc.order_line" t-as="line"> <t t-foreach="doc.order_line" t-as="line">
<t t-set="current_subtotal" t-value="current_subtotal + line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/> <t t-set="current_subtotal_tax_excluded" t-value="current_subtotal_tax_excluded + line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/>
<t t-set="current_subtotal" t-value="current_subtotal + line.price_total" groups="account.group_show_line_subtotals_tax_included"/> <t t-set="current_subtotal_tax_included" t-value="current_subtotal_tax_included + line.price_total" groups="account.group_show_line_subtotals_tax_included"/>
<tr t-att-class="'bg-200 font-weight-bold o_line_section' if line.display_type == 'line_section' else 'font-italic o_line_note' if line.display_type == 'line_note' else ''"> <tr t-att-class="'bg-200 font-weight-bold o_line_section' if line.display_type == 'line_section' else 'font-italic o_line_note' if line.display_type == 'line_note' else ''">
<t t-if="not line.display_type"> <t t-if="not line.display_type">
@@ -110,20 +107,23 @@
<td class="text-right"> <td class="text-right">
<span t-esc="', '.join(map(lambda x: (x.description or x.name), line.tax_id))"/> <span t-esc="', '.join(map(lambda x: (x.description or x.name), line.tax_id))"/>
</td> </td>
<td class="text-right o_price_total"> <td class="text-right o_price_total" groups="account.group_show_line_subtotals_tax_excluded">
<span t-field="line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/> <span t-field="line.price_subtotal"/>
<span t-field="line.price_total" groups="account.group_show_line_subtotals_tax_included"/> </td>
<td class="text-right o_price_total" groups="account.group_show_line_subtotals_tax_included">
<span t-field="line.price_total"/>
</td> </td>
</t> </t>
<t t-if="line.display_type == 'line_section'"> <t t-if="line.display_type == 'line_section'">
<td t-att-colspan="99"> <td colspan="99">
<span t-field="line.name"/> <span t-field="line.name"/>
</td> </td>
<t t-set="current_section" t-value="line"/> <t t-set="current_section" t-value="line"/>
<t t-set="current_subtotal" t-value="0"/> <t t-set="current_subtotal_tax_excluded" t-value="0"/>
<t t-set="current_subtotal_tax_included" t-value="0"/>
</t> </t>
<t t-if="line.display_type == 'line_note'"> <t t-if="line.display_type == 'line_note'">
<td t-att-colspan="99"> <td colspan="99">
<span t-field="line.name"/> <span t-field="line.name"/>
</td> </td>
</t> </t>
@@ -131,12 +131,17 @@
<t t-if="current_section and (line_last or doc.order_line[line_index+1].display_type == 'line_section')"> <t t-if="current_section and (line_last or doc.order_line[line_index+1].display_type == 'line_section')">
<tr class="is-subtotal text-right"> <tr class="is-subtotal text-right">
<td t-att-colspan="99"> <td colspan="99" groups="account.group_show_line_subtotals_tax_excluded,account.group_show_line_subtotals_tax_included">
<strong class="mr16">Subtotal</strong> <strong class="mr16">Subtotal</strong>
<span <span
t-esc="current_subtotal" groups="account.group_show_line_subtotals_tax_excluded"
t-esc="current_subtotal_tax_excluded"
t-options='{"widget": "monetary", "display_currency": doc.pricelist_id.currency_id}' t-options='{"widget": "monetary", "display_currency": doc.pricelist_id.currency_id}'
/> />
<span groups="account.group_show_line_subtotals_tax_included"> | <span
t-esc="current_subtotal_tax_included"
t-options='{"widget": "monetary", "display_currency": doc.pricelist_id.currency_id}'
/></span>
</td> </td>
</tr> </tr>
</t> </t>
+23 -18
View File
@@ -428,29 +428,26 @@
<table class="table table-sm" id="sales_order_table"> <table class="table table-sm" id="sales_order_table">
<thead class="bg-100"> <thead class="bg-100">
<tr> <tr>
<t t-set="colspan" t-value="6"/>
<th class="text-left">Products</th> <th class="text-left">Products</th>
<th class="text-right">Quantity</th> <th class="text-right">Quantity</th>
<th t-attf-class="text-right {{ 'd-none d-sm-table-cell' if report_type == 'html' else '' }}">Unit Price</th> <th t-attf-class="text-right {{ 'd-none d-sm-table-cell' if report_type == 'html' else '' }}">Unit Price</th>
<th t-if="display_discount" t-attf-class="text-right {{ 'd-none d-sm-table-cell' if report_type == 'html' else '' }}"> <th t-if="display_discount" t-attf-class="text-right {{ 'd-none d-sm-table-cell' if report_type == 'html' else '' }}">
<span>Discount</span> <span>Discount</span>
<t t-set="colspan" t-value="colspan+1"/>
</th> </th>
<th t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">Taxes</th> <th t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">Taxes</th>
<th class="text-right" > <th class="text-right" groups="account.group_show_line_subtotals_tax_excluded">Amount</th>
<span groups="account.group_show_line_subtotals_tax_excluded">Amount</span> <th class="text-right" groups="account.group_show_line_subtotals_tax_included">Total Price</th>
<span groups="account.group_show_line_subtotals_tax_included">Total Price</span>
</th>
</tr> </tr>
</thead> </thead>
<tbody class="sale_tbody"> <tbody class="sale_tbody">
<t t-set="current_subtotal" t-value="0"/> <t t-set="current_subtotal_tax_excluded" t-value="0"/>
<t t-set="current_subtotal_tax_included" t-value="0"/>
<t t-foreach="sale_order.order_line" t-as="line"> <t t-foreach="sale_order.order_line" t-as="line">
<t t-set="current_subtotal" t-value="current_subtotal + line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/> <t t-set="current_subtotal_tax_excluded" t-value="current_subtotal_tax_excluded + line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/>
<t t-set="current_subtotal" t-value="current_subtotal + line.price_total" groups="account.group_show_line_subtotals_tax_included"/> <t t-set="current_subtotal_tax_included" t-value="current_subtotal_tax_included + line.price_total" groups="account.group_show_line_subtotals_tax_included"/>
<tr t-att-class="'bg-200 font-weight-bold o_line_section' if line.display_type == 'line_section' else 'font-italic o_line_note' if line.display_type == 'line_note' else ''"> <tr t-att-class="'bg-200 font-weight-bold o_line_section' if line.display_type == 'line_section' else 'font-italic o_line_note' if line.display_type == 'line_note' else ''">
<t t-if="not line.display_type"> <t t-if="not line.display_type">
@@ -481,20 +478,23 @@
<td t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}"> <td t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
<span t-esc="', '.join(map(lambda x: (x.description or x.name), line.tax_id))"/> <span t-esc="', '.join(map(lambda x: (x.description or x.name), line.tax_id))"/>
</td> </td>
<td class="text-right"> <td class="text-right o_price_total" groups="account.group_show_line_subtotals_tax_excluded">
<span t-field="line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/> <span t-field="line.price_subtotal"/>
<span t-field="line.price_total" groups="account.group_show_line_subtotals_tax_included"/> </td>
<td class="text-right o_price_total" groups="account.group_show_line_subtotals_tax_included">
<span t-field="line.price_total"/>
</td> </td>
</t> </t>
<t t-if="line.display_type == 'line_section'"> <t t-if="line.display_type == 'line_section'">
<td t-att-colspan="colspan"> <td colspan="99">
<span t-field="line.name"/> <span t-field="line.name"/>
</td> </td>
<t t-set="current_section" t-value="line"/> <t t-set="current_section" t-value="line"/>
<t t-set="current_subtotal" t-value="0"/> <t t-set="current_subtotal_tax_excluded" t-value="0"/>
<t t-set="current_subtotal_tax_included" t-value="0"/>
</t> </t>
<t t-if="line.display_type == 'line_note'"> <t t-if="line.display_type == 'line_note'">
<td t-att-colspan="colspan"> <td colspan="99">
<span t-field="line.name"/> <span t-field="line.name"/>
</td> </td>
</t> </t>
@@ -502,12 +502,17 @@
<t t-if="current_section and (line_last or sale_order.order_line[line_index+1].display_type == 'line_section')"> <t t-if="current_section and (line_last or sale_order.order_line[line_index+1].display_type == 'line_section')">
<tr class="is-subtotal text-right"> <tr class="is-subtotal text-right">
<td t-att-colspan="colspan"> <td colspan="99">
<strong class="mr16">Subtotal</strong> <strong class="mr16">Subtotal</strong>
<span <span
t-esc="current_subtotal" groups="account.group_show_line_subtotals_tax_excluded"
t-options='{"widget": "monetary", "display_currency": sale_order.pricelist_id.currency_id}' t-esc="current_subtotal_tax_excluded"
t-options='{"widget": "monetary", "display_currency": doc.pricelist_id.currency_id}'
/> />
<span groups="account.group_show_line_subtotals_tax_included"> | <span
t-esc="current_subtotal_tax_included"
t-options='{"widget": "monetary", "display_currency": doc.pricelist_id.currency_id}'
/></span>
</td> </td>
</tr> </tr>
</t> </t>