diff --git a/sales.rst b/sales.rst index ec5b3ad6b..2d0201f5c 100644 --- a/sales.rst +++ b/sales.rst @@ -10,3 +10,4 @@ Sales sales/overview sales/quotation sales/invoicing + sales/products_prices diff --git a/sales/products_prices.rst b/sales/products_prices.rst index 200f24f34..773f5d92b 100644 --- a/sales/products_prices.rst +++ b/sales/products_prices.rst @@ -5,3 +5,4 @@ Products & Prices .. toctree:: :titlesonly: + products_prices/prices \ No newline at end of file diff --git a/sales/products_prices/prices.rst b/sales/products_prices/prices.rst index b8acf27fb..c292501a4 100644 --- a/sales/products_prices/prices.rst +++ b/sales/products_prices/prices.rst @@ -5,3 +5,4 @@ Prices Management .. toctree:: :titlesonly: + prices/B2B_B2C \ No newline at end of file diff --git a/sales/products_prices/prices/B2B_B2C.rst b/sales/products_prices/prices/B2B_B2C.rst new file mode 100644 index 000000000..34ef03bfd --- /dev/null +++ b/sales/products_prices/prices/B2B_B2C.rst @@ -0,0 +1,169 @@ +=================================================================== +How to manage prices for B2B (tax excluded) and B2C (tax included)? +=================================================================== + +When working with consumers, prices are usually expressed with taxes +included in the price (e.g., in most eCommerce). But, when you work in a +B2B environment, companies usually negotiate prices with taxes excluded. + +Odoo manages both use cases easily, as long as you register your prices +on the product with taxes excluded or included, but not both together. +If you manage all your prices with tax included (or excluded) only, you +can still easily do sales order with a price having taxes excluded (or +included): that's easy. + +This documentation is only for the specific use case where you need to +have two references for the price (tax included or excluded), for the +same product. The reason of the complexity is that there is not a +symmetrical relationship with prices included and prices excluded, as +shown in this use case, in belgium with a tax of 21%: + +- Your eCommerce has a product at **10€ (taxes included)** + +- This would do **8.26€ (taxes excluded)** and a **tax of 1.74€** + +But for the same use case, if you register the price without taxes on +the product form (8.26€), you get a price with tax included at 9.99€, +because: + +- **8.26€ \* 1.21 = 9.99€** + +So, depending on how you register your prices on the product form, you +will have different results for the price including taxes and the price +excluding taxes: + +- Taxes Excluded: **8.26€ & 10.00€** + +- Taxes Included: **8.26€ & 9.99€** + +.. note:: + If you buy 100 pieces at 10€ taxes included, it gets even more + tricky. You will get: **1000€ (taxes included) = 826.45€ (price) + + 173.55€ (taxes)** Which is very different from a price per piece at + 8.26€ tax excluded. + +This documentation explains how to handle the very specific use case +where you need to handle the two prices (tax excluded and included) on +the product form within the same company. + +.. note:: + In terms of finance, you have no more revenues selling your + product at 10€ instead of 9.99€ (for a 21% tax), because your revenue + will be exactly the same at 9.99€, only the tax is 0.01€ higher. So, if + you run an eCommerce in Belgium, make your customer a favor and set your + price at 9.99€ instead of 10€. Please note that this does not apply to + 20€ or 30€, or other tax rates, or a quantity >1. You will also make you + a favor since you can manage everything tax excluded, which is less + error prone and easier for your salespeople. + +Configuration +============= + +Introduction +------------ + +The best way to avoid this complexity is to choose only one way of +managing your prices and stick to it: price without taxes or price with +taxes included. Define which one is the default stored on the product +form (on the default tax related to the product), and let Odoo compute +the other one automatically, based on the pricelist and fiscal position. +Negotiate your contracts with customers accordingly. This perfectly +works out-of-the-box and you have no specific configuration to do. + +If you can not do that and if you really negotiate some prices with tax +excluded and, for other customers, others prices with tax included, you +must: + +1. always store the default price TAX EXCLUDED on the product form, and + apply a tax (price included on the product form) + +2. create a pricelist with prices in TAX INCLUDED, for specific + customers + +3. create a fiscal position that switches the tax excluded to a tax + included + +4. assign both the pricelist and the fiscal position to customers who + want to benefit to this pricelist and fiscal position + +For the purpose of this documentation, we will use the above use case: + +- your product default sale price is 8.26€ price excluded + +- but we want to sell it at 10€, price included, in our shops or + eCommerce website + +Setting your products +--------------------- + +Your company must be configured with price excluded by default. This is +usually the default configuration, but you can check your **Default Sale +Tax** from the menu :menuselection:`Configuration --> Settings` +of the Accounting application. + +.. image:: media/price_B2C_B2B01.png + :align: center + +Once done, you can create a **B2C** pricelist. You can activate the +pricelist feature per customer from the menu: +:menuselection:`Configuration --> Settings` of the Sale application. +Choose the option **different prices per customer segment**. + +Once done, create a B2C pricelist from the menu +:menuselection:`Configuration --> Pricelists`. +It's also good to rename the default pricelist into B2B to avoid confusion. + +Then, create a product at 8.26€, with a tax of 21% (defined as tax not +included in price) and set a price on this product for B2C customers at +10€, from the :menuselection:`Sales --> Products` +menu of the Sales application: + +.. image:: media/price_B2C_B2B02.png + :align: center + +Setting the B2C fiscal position +------------------------------- + +From the accounting application, create a B2C fiscal position from this +menu: :menuselection:`Configuration --> Fiscal Positions`. +This fiscal position should map the VAT 21% (tax excluded of price) +with a VAT 21% (tax included in price) + +.. image:: media/price_B2C_B2B03.png + :align: center + +Test by creating a quotation +============================ + +Create a quotation from the Sale application, using the +:menuselection:`Sales --> Quotations` menu. You should have the +following result: 8.26€ + 1.73€ = 9.99€. + +.. image:: media/price_B2C_B2B04.png + :align: center + +Then, create a quotation but **change the pricelist to B2C and the +fiscal position to B2C** on the quotation, before adding your product. +You should have the expected result, which is a total price of 10€ for +the customer: 8.26€ + 1.74€ = 10.00€. + +.. image:: media/price_B2C_B2B05.png + :align: center + +This is the expected behavior for a customer of your shop. + +Avoid changing every sale order +=============================== + +If you negotiate a contract with a customer, whether you negotiate price +included or price excluded, you can set the pricelist and the fiscal +position on the customer form so that it will be applied automatically +at every sale of this customer. + +The pricelist is in the **Sales & Purchases** tab of the customer form, +and the fiscal position is in the accounting tab. + +Note that this is error prone: if you set a fiscal position with tax +included in prices but use a pricelist that is not included, you might +have wrong prices calculated for you. That's why we usually recommend +companies to only work with one price reference. diff --git a/sales/products_prices/prices/media/price_B2C_B2B01.png b/sales/products_prices/prices/media/price_B2C_B2B01.png new file mode 100644 index 000000000..df278739e Binary files /dev/null and b/sales/products_prices/prices/media/price_B2C_B2B01.png differ diff --git a/sales/products_prices/prices/media/price_B2C_B2B02.png b/sales/products_prices/prices/media/price_B2C_B2B02.png new file mode 100644 index 000000000..214849fec Binary files /dev/null and b/sales/products_prices/prices/media/price_B2C_B2B02.png differ diff --git a/sales/products_prices/prices/media/price_B2C_B2B03.png b/sales/products_prices/prices/media/price_B2C_B2B03.png new file mode 100644 index 000000000..e2d28824c Binary files /dev/null and b/sales/products_prices/prices/media/price_B2C_B2B03.png differ diff --git a/sales/products_prices/prices/media/price_B2C_B2B04.png b/sales/products_prices/prices/media/price_B2C_B2B04.png new file mode 100644 index 000000000..ffb9c6d6c Binary files /dev/null and b/sales/products_prices/prices/media/price_B2C_B2B04.png differ diff --git a/sales/products_prices/prices/media/price_B2C_B2B05.png b/sales/products_prices/prices/media/price_B2C_B2B05.png new file mode 100644 index 000000000..baa745f23 Binary files /dev/null and b/sales/products_prices/prices/media/price_B2C_B2B05.png differ