[IMP] Taxes: improve tax configuration doc

task-5094417

We improve the following sections of the Taxes page:

- Tax computations:
  At the moment, the section for the `Percentage of Price tax included`
  tax computation doesn't distinguish itself enough from the 'Included
  in Price' option which people usually want.
  We also improve the examples.

- Included in Price
- Affects base of subsequent taxes
- Base affected by preceding taxes: this option was not documented, so
  we add a section for it.

closes odoo/documentation#14908

Signed-off-by: Xavier Platteau (xpl) <xpl@odoo.com>
This commit is contained in:
Antoine Dupuis
2025-10-17 11:54:01 +02:00
parent 319d9569cd
commit c5a0bb40e8

View File

@@ -72,23 +72,42 @@ The **tax name** is displayed for backend users in the :guilabel:`Taxes` field i
Tax computation Tax computation
~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
- **Group of Taxes** The :guilabel:`Tax Computation` field determines how the tax amount is computed from the sales
price. The following options are available:
- :ref:`Group of Taxes <taxes/computation/group-of-taxes>`: a combination of several other taxes
- :ref:`Fixed <taxes/computation/fixed>`: a fixed amount
- :ref:`Percentage of Price <taxes/computation/percentage-of-price>`: a percentage of the
tax-excluded sales price
- :ref:`Percentage of Price Tax Included <taxes/computation/percentage-of-price-tax-included>`: a
percentage of the tax-included total
- :ref:`Python Code <taxes/computation/python-code>`: a custom user-defined formula
.. _taxes/computation/group-of-taxes:
Group of taxes
**************
The tax is a combination of multiple sub-taxes. You can add as many taxes as you want, in the The tax is a combination of multiple sub-taxes. You can add as many taxes as you want, in the
order you want them to be applied. order you want them to be applied.
.. important:: .. important::
Make sure that the tax sequence is correct, as the order in which they are may impact the Make sure the tax sequence is correct, as the display order determines the application order and
taxes' amounts computation, especially if one of the taxes :ref:`affects the base of the may affect tax computation, particularly if a tax :ref:`affects the base of subsequent taxes
subsequent ones <taxes/base-subsequent>`. <taxes/base-subsequent>`.
- **Fixed** .. _taxes/computation/fixed:
The tax has a fixed amount in the default currency. The amount remains the same, regardless of the Fixed
sales price. *****
The tax has a fixed amount in the default currency. The amount remains the same per unit,
regardless of the sales price.
The computation is :math:`\text{tax amount} = \text{fixed tax amount} \times \text{quantity}`.
.. example:: .. example::
A product has a sales price of $1000, and we apply a $10 *fixed* tax. We then have: A product has a sales price of $1000, and we apply a $10 :guilabel:`Fixed` tax. We then have:
+-------------+-------------+----------+----------+ +-------------+-------------+----------+----------+
| Product | Price | Tax | Total | | Product | Price | Tax | Total |
@@ -97,13 +116,25 @@ Tax computation
| 1,000 | 1,000 | 10 | 1,010.00 | | 1,000 | 1,000 | 10 | 1,010.00 |
+-------------+-------------+----------+----------+ +-------------+-------------+----------+----------+
- **Percentage of price** .. _taxes/computation/percentage-of-price:
The *sales price* is the taxable basis: the tax amount is computed by multiplying the sales price Percentage of price
by the tax percentage. *******************
.. example:: The tax rate is a percentage of the **tax-excluded** subtotal.
A product has a sales price of $1000, and we apply a *10% of Price* tax. We then have:
The exact tax computation depends on the :ref:`Included in Price <taxes/included-in-price>` field,
which determines whether the sales price should be treated as tax-excluded or tax-included:
.. tabs::
.. tab:: Tax-excluded
If :guilabel:`Included in Price` is disabled, the computation is :math:`\text{tax amount}
= \text{sales price} \times \text{tax rate}`.
.. example::
A product has a sales price of $1000, and we apply a 10% :guilabel:`Percentage of Price`
tax that is not :guilabel:`Included in Price`. We then have:
+-------------+-------------+----------+----------+ +-------------+-------------+----------+----------+
| Product | Price | Tax | Total | | Product | Price | Tax | Total |
@@ -112,13 +143,47 @@ Tax computation
| 1,000 | 1,000 | 100 | 1,100.00 | | 1,000 | 1,000 | 100 | 1,100.00 |
+-------------+-------------+----------+----------+ +-------------+-------------+----------+----------+
- **Percentage of Price Tax Included** .. tab:: Tax-included
The **total** is the taxable basis: the tax amount is a percentage of the total. If :guilabel:`Included in Price` is enabled, the computation is :math:`\text{tax amount} =
\text{sales price} \times \frac{\text{tax rate}}{1 + \text{tax rate}}`.
.. example:: .. example::
A product has a Sales Price of $1000, and we apply a *10% of Price Tax Included* tax. We then A product has a sales price of $1000, and we apply a 10% :guilabel:`Percentage of Price`
have: tax that is :guilabel:`Included in Price`. We then have:
+-------------+-------------+----------+----------+
| Product | Price | Tax | Total |
| sales price | without tax | | |
+=============+=============+==========+==========+
| 1,000 | 909.09 | 90.91 | 1,000.00 |
+-------------+-------------+----------+----------+
.. _taxes/computation/percentage-of-price-tax-included:
Percentage of price tax included
********************************
.. important::
This tax computation is rarely used and only useful in countries (e.g., Brazil, Bolivia) that
quote tax rates as a percentage of the tax-included total.
For the more common need to compute tax amounts from a tax-included price, use the
:ref:`Percentage of Price <taxes/computation/percentage-of-price>` tax computation with the
:ref:`Included in Price <taxes/included-in-price>` option.
The tax rate is a percentage of the **tax-included** total.
The exact tax computation depends on the :ref:`Included in Price <taxes/included-in-price>` field,
which determines whether the sales price should be treated as tax-excluded or tax-included:
.. tabs::
.. tab:: Tax-excluded
If :guilabel:`Included in Price` is disabled, the computation is :math:`\text{tax amount}
= \text{sales price} \times \frac{\text{tax rate}}{1 - \text{tax rate}}`.
.. example::
A product has a sales price of $1000, and we apply a 10% :guilabel:`Percentage of Price
Tax Included` tax that is not :guilabel:`Included in Price`. We then have:
+-------------+-------------+----------+----------+ +-------------+-------------+----------+----------+
| Product | Price | Tax | Total | | Product | Price | Tax | Total |
@@ -127,16 +192,60 @@ Tax computation
| 1,000 | 1,000 | 111.11 | 1,111.11 | | 1,000 | 1,000 | 111.11 | 1,111.11 |
+-------------+-------------+----------+----------+ +-------------+-------------+----------+----------+
- **Python code** Note that the real tax rate in terms of the tax-excluded price is
:math:`\frac{111.11}{1000} = 11.111\%`.
A tax defined as **Python code** consists of two snippets of Python code that are executed in a .. tab:: Tax-included
local environment containing data such as the unit price, product or partner.
:guilabel:`Python Code` defines the amount of the tax, and :guilabel:`Applicable Code` defines if If :guilabel:`Included in Price` is enabled, the computation is :math:`\text{tax amount} =
the tax is to be applied. The formula is found at the bottom of the :guilabel:`Definition` tab. \text{sales price} \times \text{tax rate}`.
.. example::
A product has a sales price of $1000, and we apply a 10%
:guilabel:`Percentage of Price Tax Included` tax that is :guilabel:`Included in Price`.
We then have:
+-------------+-------------+----------+----------+
| Product | Price | Tax | Total |
| sales price | without tax | | |
+=============+=============+==========+==========+
| 1,000 | 900 | 100 | 1,000.00 |
+-------------+-------------+----------+----------+
Note that the real tax rate in terms of the tax-excluded price is
:math:`\frac{100}{900} = 11.111\%`.
.. _taxes/computation/python-code:
Python code
***********
.. important::
If a tax can be expressed as a multiple of the quantity of the product to which it applies, it
can be defined as a :ref:`Fixed <taxes/computation/fixed>` tax. Doing so is strongly recommended
over defining a :guilabel:`Python Code` tax.
A tax defined as :guilabel:`Python Code` consists of two snippets of Python code that are executed
in a local environment that can access the unit price, quantity, product, and partner.
:guilabel:`Python Code` defines the amount of the tax, and :guilabel:`Applicable Code` defines
whether the tax is applied. Enter a formula for each field at the bottom of the
:guilabel:`Definition` tab.
.. example:: .. example::
:guilabel:`Python Code`: `result = price_unit * 0.10` A product has a sales price of $1000, and we apply a :guilabel:`Python Code` tax with the
:guilabel:`Applicable Code`: `result = true` following configuration:
- :guilabel:`Python Code`: `result = price_unit * 0.10` and
- :guilabel:`Applicable Code`: `result = True`.
We then have:
+-------------+-------------+----------+----------+
| Product | Price | Tax | Total |
| sales price | without tax | | |
+=============+=============+==========+==========+
| 1,000 | 1,000 | 100 | 1,100.00 |
+-------------+-------------+----------+----------+
.. _taxes/active: .. _taxes/active:
@@ -256,29 +365,27 @@ invoice line.
Included in price Included in price
~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
With this option activated, the total (including the tax) equals the **sales price**. With this option activated, the tax will treat the sales price on which it is applied as a total
including the tax amount. The tax computation will split the sales price into a base amount and a
tax amount. This makes it suitable for B2C sales in most countries where prices are quoted
tax-inclusive.
`Total = Sales Price = Computed Tax-Excluded price + Tax` `Total = Sales Price = Computed Tax-Excluded price + Tax`
.. example:: .. example::
A product has a sales price of $1000, and we apply a *10% of Price* tax, which is *included in A product has a sales price of $1000, and we apply a 10% :guilabel:`Percentage of Price` tax
the price*. We then have: with :guilabel:`Included in Price`. We then have:
+-------------+-------------+----------+----------+ +-------------+-------------+----------+----------+
| Product | Price | Tax | Total | | Product | Price | Tax | Total |
| sales price | without tax | | | | sales price | without tax | | |
+=============+=============+==========+==========+ +=============+=============+==========+==========+
| 1,000 | 900.10 | 90.9 | 1,000.00 | | 1,000 | 909.09 | 90.91 | 1,000.00 |
+-------------+-------------+----------+----------+ +-------------+-------------+----------+----------+
.. note:: .. note::
If you need to define prices accurately, both tax-included and tax-excluded, please refer to the For a guide on configuring tax-excluded and tax-included prices for B2B and B2C customers,
following documentation: :doc:`taxes/B2B_B2C`. see :doc:`taxes/B2B_B2C`.
.. note::
By default, only the :guilabel:`Tax excluded` column is displayed on invoices. To display the
:guilabel:`Tax included` column, click the **dropdown toggle** button and check
:guilabel:`Tax incl.`.
.. image:: taxes/toggle-button.png .. image:: taxes/toggle-button.png
@@ -287,11 +394,36 @@ With this option activated, the total (including the tax) equals the **sales pri
Affect base of subsequent taxes Affect base of subsequent taxes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
With this option, the total tax-included becomes the taxable basis for the other taxes applied to If this setting is enabled, any subsequent tax applied on the same product line that has
the same product. :ref:`taxes/base-affected` will be based on a modified sales price. The exact behavior depends on
whether the tax with :guilabel:`Affect base of subsequent taxes` is :ref:`taxes/included-in-price`
or not.
You can configure a new :ref:`group of taxes <taxes/computation>` to include this tax or add it .. tabs::
directly to a product line. .. tab:: Tax-excluded
If :guilabel:`Included in Price` is disabled, subsequent taxes with :guilabel:`Base affected
by preceding taxes` will be based on a modified sales price equal to the original sales price
plus the tax amount.
.. example::
A product has a sales price of $1000, and we apply a 10% :guilabel:`Percentage of Price`
tax with :guilabel:`Affect base of subsequent taxes`. Any subsequent tax with
:guilabel:`Base affected by preceding taxes` will be based on a modified sales price of
$1100.
.. tab:: Tax-included
If :guilabel:`Included in Price` is enabled, subsequent taxes with :guilabel:`Base affected
by preceding taxes` will be based on a modified sales price equal to the original sales price
minus the tax amount.
.. example::
A product has a sales price of $1100, and we apply a 10% :guilabel:`Percentage of Price`
tax with :guilabel:`Included in Price` and :guilabel:`Affect base of subsequent taxes`.
Any subsequent tax with :guilabel:`Base affected by preceding taxes` will be based on a
modified sales price of $1000.
This setting is considered any time multiple taxes are applied to the same product line, whether
via a :ref:`group of taxes <taxes/computation>` or multiple taxes added directly to a product line.
.. image:: taxes/subsequent-line.png .. image:: taxes/subsequent-line.png
:alt: The eco-tax is taken into the basis of the 21% VAT tax :alt: The eco-tax is taken into the basis of the 21% VAT tax
@@ -307,6 +439,19 @@ directly to a product line.
.. image:: taxes/list-sequence.png .. image:: taxes/list-sequence.png
:alt: The taxes' sequence in Odoo determines which tax is applied first :alt: The taxes' sequence in Odoo determines which tax is applied first
.. _taxes/base-affected:
Base affected by preceding taxes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This setting, which is only visible in :doc:`developer mode <../../general/developer_mode>`,
determines whether any previous tax that :ref:`affects the base of subsequent taxes
<taxes/base-subsequent>` will modify the sales price that this tax is based on.
.. note::
Taxes with :ref:`Included in Price <taxes/included-in-price>` always behave as if this setting is
enabled.
Extra taxes Extra taxes
=========== ===========
@@ -320,7 +465,7 @@ imposed by governments. These extra taxes can be **luxury** taxes, **environment
To compute an extra tax in Odoo, :ref:`create a tax <taxes/configuration>`, enter a tax name, select To compute an extra tax in Odoo, :ref:`create a tax <taxes/configuration>`, enter a tax name, select
a :ref:`Tax Computation <taxes/configuration>`, set an :guilabel:`Amount`, and in the a :ref:`Tax Computation <taxes/configuration>`, set an :guilabel:`Amount`, and in the
:guilabel:`Advanced Options` tab, check :guilabel:`Affect Base of Subsequent Taxes`. Then, drag and :guilabel:`Advanced Options` tab, enable :guilabel:`Affect Base of Subsequent Taxes`. Then, drag and
drop the taxes in the :ref:`order they should be computed <taxes/base-subsequent>`. drop the taxes in the :ref:`order they should be computed <taxes/base-subsequent>`.
.. example:: .. example::