fix: print the posted discount and tax amounts

ERPNext takes an Additional Discount off the items' net amounts and,
for a discount on Grand Total, splits it between net and taxes: each
charge is booked at tax_amount_after_discount_amount and Total Taxes
and Charges sums those. The print showed the discount as entered and
the pre-discount tax_amount, so on a Grand Total discount the VAT line
disagreed with the invoice.

The totals includes now print the discount's net share (sum of
item.distributed_discount_amount), Net Total, and each charge after
discount, so the lines add up to Grand Total whichever total the
discount applies on and with inclusive or exclusive tax. A discount
that is not distributed (cash / non-trade) stays after the charges.
This commit is contained in:
2026-09-17 10:19:30 +00:00
parent 71eda0bec9
commit 4a19c60ba2
3 changed files with 22 additions and 13 deletions
File diff suppressed because one or more lines are too long
@@ -1,6 +1,11 @@
{#- ERPNext's templates/print_formats/includes/taxes.html, but a discount on Net Total is
followed by the Net Total line so the print reads Total, discount, Net Total, charges.
A discount on Grand Total stays after the charges, as upstream. -#}
{#- ERPNext's templates/print_formats/includes/taxes.html, printing the amounts that are posted.
ERPNext takes an Additional Discount off the items' net amounts (item.distributed_discount_amount;
a discount on Grand Total is split between net and taxes) and books each charge at
tax_amount_after_discount_amount, while upstream prints the discount as entered and the
pre-discount tax_amount. Here: the net share of the discount, Net Total, then the charges
as booked. A discount that is not distributed (cash / non-trade) comes off the grand total
only, so it stays after the charges, as upstream. -#}
{%- macro amount_row(label, value) -%}
<div class="row">
<div class="col-xs-5 {%- if doc.align_labels_right %} text-right{%- endif -%}">
@@ -11,20 +16,24 @@
</div>
</div>
{%- endmacro -%}
{%- macro currency(value) -%}
{{ frappe.format_value(value, {"fieldtype": "Currency", "options": "currency"}, doc) }}
{%- endmacro -%}
{%- set net_discount = doc.get("items")|map(attribute="distributed_discount_amount")|select|sum -%}
<div class="row">
<div class="col-xs-6"></div>
<div class="col-xs-6">
{%- if doc.discount_amount and doc.apply_discount_on == "Net Total" -%}
{{ amount_row(_(doc.meta.get_label("discount_amount")), "- " ~ doc.get_formatted("discount_amount", doc)) }}
{%- if net_discount -%}
{{ amount_row(_(doc.meta.get_label("discount_amount")), "- " ~ currency(net_discount)) }}
{{ amount_row(_(doc.meta.get_label("net_total")), doc.get_formatted("net_total", doc)) }}
{%- endif -%}
{%- for charge in data -%}
{%- if (charge.tax_amount or print_settings.print_taxes_with_zero_amount) and (not charge.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}
{{ amount_row(charge.get_formatted("description"), charge.get_formatted("tax_amount", doc)) }}
{{ amount_row(charge.get_formatted("description"), charge.get_formatted("tax_amount_after_discount_amount", doc)) }}
{%- endif -%}
{%- endfor -%}
{%- if doc.discount_amount and doc.apply_discount_on == "Grand Total" -%}
{%- if doc.discount_amount and not net_discount -%}
{{ amount_row(_(doc.meta.get_label("discount_amount")), "- " ~ doc.get_formatted("discount_amount", doc)) }}
{%- endif -%}
</div>
@@ -1,10 +1,10 @@
{#- ERPNext's templates/print_formats/includes/total.html, except that with inclusive tax the
"Total (Without Tax)" line is the total before an Additional Discount on Net Total:
net_total already has that discount taken off, so the print would show the same figure
before and after the discount line. -#}
"Total (Without Tax)" line is the net total before the Additional Discount: net_total already
has the discount's net share (item.distributed_discount_amount) taken off, and the taxes
include prints that share and Net Total right below this line. -#}
<div class="row {% if df.bold %}important{% endif %} data-field">
{% if doc.flags.show_inclusive_tax_in_print %}
{%- set before_discount = doc.net_total + (doc.discount_amount if doc.apply_discount_on == "Net Total" else 0) -%}
{%- set before_discount = doc.net_total + (doc.get("items")|map(attribute="distributed_discount_amount")|select|sum) -%}
<div class="col-xs-5 {%- if doc.align_labels_right %} text-right{%- endif -%}">
<label>{{ _("Total (Without Tax)") }}</label></div>
<div class="col-xs-7 text-right value">