Compare commits

..

1 Commits

Author SHA1 Message Date
John Holton (hojo)
e17162c29a [ADD] MRP: Two-step manufacturing 2023-11-09 13:08:39 -08:00
309 changed files with 1929 additions and 6953 deletions

View File

@@ -86,13 +86,12 @@ static: $(HTML_BUILD_DIR)/_static/style.css
# Called by runbot for the ci/documentation_guideline check.
test:
@python tests/main.py $(SOURCE_DIR)/administration $(SOURCE_DIR)/applications $(SOURCE_DIR)/contributing $(SOURCE_DIR)/developer redirects
@python tests/main.py $(SOURCE_DIR)/administration $(SOURCE_DIR)/applications $(SOURCE_DIR)/contributing $(SOURCE_DIR)/developer $(SOURCE_DIR)/services redirects
# Similar as `test`, but called only manually by content reviewers to trigger extra checks.
review:
@read -p "Enter relative content path: " path; read -p "Enter max line length (default: 100): " line_length; \
@read -p "Enter content path: " path; read -p "Enter max line length (default: 100): " line_length; \
if [ -z "$$path" ]; then echo "Error: Path cannot be empty"; exit 1; fi; \
if echo $$path | grep -q 'content/'; then path=`echo $$path | sed 's|content/||'`; fi; \
if [ -z "$$line_length" ]; then line_length=100; fi; \
export REVIEW=1; \
python tests/main.py --max-line-length=$$line_length $(SOURCE_DIR)/$$path

View File

@@ -225,7 +225,7 @@ PostgreSQL user.
.. code-block:: console
$ sudo -u postgres createuser -d -R -S $USER
$ sudo -u postgres createuser -s $USER
$ createdb $USER
.. note::
@@ -250,7 +250,7 @@ PostgreSQL user.
.. code-block:: console
$ sudo -u postgres createuser -d -R -S $USER
$ sudo -u postgres createuser -s $USER
$ createdb $USER
.. note::

View File

@@ -210,8 +210,6 @@ upgrade goes live.
#. Scheduled actions are disabled.
#. Outgoing mail servers are disabled by archiving the existing ones and adding a fake one.
#. Payment providers and delivery carriers are reset to the test environment.
#. Bank synchronization is disabled. Should you want to test the synchronization, contact your
bank synchronization provider to get sandbox credentials.
Testing as many of your business flows as possible is strongly recommended to ensure they are
working correctly and to get more familiar with the new version.

View File

@@ -187,8 +187,7 @@ Send yourself a sample invoice by email to make sure everything is correctly con
* :doc:`get_started/chart_of_accounts`
* :doc:`bank/bank_synchronization`
* :doc:`../fiscal_localizations`
* `Odoo Tutorials: Accounting and Invoicing - Getting started [video]
<https://www.odoo.com/slides/slide/getting-started-1692>`_
* `Odoo Tutorials: Accounting Basics <https://www.odoo.com/r/lsZ>`_
.. toctree::
:titlesonly:

View File

@@ -1,440 +1,167 @@
===============================
Average price on returned goods
===============================
=================================
Inventory average price valuation
=================================
.. |AVCO| replace:: :abbr:`AVCO (Average Cost Valuation)`
As stated in the :doc:`inventory valuation page
</applications/inventory_and_mrp/inventory/management/reporting/inventory_valuation_config>`,
one of the possible costing method you can use in perpetual stock
valuation, is the average cost.
.. _inventory/avg_cost/definition:
This document answers to one recurrent question for companies using that
method to make their stock valuation: how does a shipping returned to
its supplier impact the average cost and the accounting entries? This
document is **only** for the specific use case of a perpetual valuation (as
opposed to the periodic one) and in average price costing method (as
opposed to standard of FIFO).
*Average cost valuation* (AVCO) is an inventory valuation method that evaluates cost based on the
total cost of goods bought or produced during a period, divided by the total number of items
on-hand. Inventory valuation is used to:
Definition of average cost
==========================
- reflect the value of a company's assets;
- keep track of the amount of unsold goods;
- account for monetary value in goods that have yet to generate profit;
- report on flow of goods throughout the quarter.
The average cost method calculates the cost of ending inventory and cost
of goods sold on the basis of weighted average cost per unit of
inventory.
Because |AVCO| uses the weighted average to evaluate the cost, it is a good fit for companies that
sell only a few different products in large quantities. In Odoo, this costing analysis is
*automatically updated* each time products are received.
The weighted average cost per unit is calculated using the following
formula:
Thus, when shipments are returned to their supplier, Odoo automatically generates accounting entries
to reflect the change in inventory valuation. However, Odoo does **not** automatically update the
|AVCO| calculation, because :ref:`this can potentially create inconsistencies with inventory
valuation <inventory/avg_price/leaving_inventory>`.
- When new products arrive in a warehouse, the new average cost is
recomputed as:
.. note::
This document addresses a specific use case for theoretical purposes. Navigate :ref:`here
<inventory/management/inventory_valuation_config>` for instructions on how to set up and use
|AVCO| in Odoo.
.. seealso::
- :ref:`Using inventory valuation <inventory/reporting/using_inventory_val>`
- :ref:`Other inventory valuation methods <inventory/inventory_valuation_config/costing_methods>`
Configuration
=============
To use average cost inventory valuation on a product, navigate to :menuselection:`Inventory -->
Configuration --> Product Categories` and select the category that will be using |AVCO|. On the
product category page, set :guilabel:`Costing Method` to `Average Cost (AVCO)` and
:guilabel:`Inventory Valuation` to `Automated`.
.. seealso::
:ref:`Inventory valuation configuration <inventory/management/inventory_valuation_config>`
Using average cost valuation
============================
The average cost method adjusts the inventory valuation when products are received in the warehouse.
This section explains how it works, but if the explanation is unnecessary, skip to the :ref:`return
to supplier use case <inventory/avg_cost/return>` section.
.. _inventory/avg_cost/formula:
Formula
-------
When new products arrive, the new average cost for each product is recomputed using the formula:
.. math::
Avg~Cost = \frac{(Old~Qty \times Old~Avg~Cost) + (Incoming~Qty \times Purchase~Price)}{Final~Qty}
- **Old Qty**: product count in stock before receiving the new shipment;
- **Old Avg Cost**: calculated average cost for a single product from the previous inventory
valuation;
- **Incoming Qty**: count of products arriving in the new shipment;
- **Purchase Price**: estimated price of products at the reception of products (since vendor bills
may arrive later). The amount includes not only the price for the products, but also added costs,
such as shipping, taxes, and :ref:`landed costs <inventory/reporting/landed_costs>`. At reception
of the vendor bill, this price is adjusted;
- **Final Qty**: quantity of on-hand stock after the stock move.
.. _inventory/avg_cost/definite_rule:
.. important::
When products leave the warehouse, the average cost **does not** change. Read about why the
average cost valuation is **not** adjusted :ref:`here <inventory/avg_price/leaving_inventory>`.
.. _inventory/avg_cost/math_table:
Compute average cost
--------------------
To understand how the average cost of a product changes with each shipment, consider the following
table of warehouse operations and stock moves. Each is a different example of how the average cost
valuation is affected.
+--------------------------------+---------------+-------------------+---------------+------------+
| Operation | Incoming Value| Inventory Value | Qty On Hand | Avg Cost |
+================================+===============+===================+===============+============+
| | | $0 | 0 | $0 |
+--------------------------------+---------------+-------------------+---------------+------------+
| Receive 8 tables at $10/unit | 8 * $10 | $80 | 8 | $10 |
+--------------------------------+---------------+-------------------+---------------+------------+
| Receive 4 tables at $16/unit | 4 * $16 | $144 | 12 | $12 |
+--------------------------------+---------------+-------------------+---------------+------------+
| Deliver 10 tables | -10 * $12 | $24 | 2 | $12 |
+--------------------------------+---------------+-------------------+---------------+------------+
.. _inventory/avg_cost/ex-1:
.. exercise::
Ensure comprehension of the above computations by reviewing the "Receive 8 tables at $10/unit"
example.
Initially, the product stock is 0, so all values are $0.
In the first warehouse operation, `8` tables are received at `$10` each. The average cost is
calculated using the :ref:`formula <inventory/avg_cost/formula>`:
.. math::
Avg~Cost = \frac{0 + 8 \times $10}{8} = \frac{$80}{8} = $10
- Since the *incoming quantity* of tables is `8` and the *purchase price* for each is `$10`,
- The inventory value in the numerator is evaluated to `$80`;
- `$80` is divided by the total amount of tables to store, `8`;
- `$10` is the average cost of a single table from the first shipment.
To verify this in Odoo, in the *Purchase* app, order `8` quantities of a new product, `Table`,
with no previous stock moves, for `$10` each.
In the table's :guilabel:`Product Category` field in the :guilabel:`General Information` tab of
the product form, click the :guilabel:`➡️ (arrow)` icon, to open an :guilabel:`External Link` to
edit the product category. Set the :guilabel:`Costing Method` to `Average Cost (AVCO)` and
:guilabel:`Inventory Valuation` to `Automated`.
Then, return to the purchase order. Click :guilabel:`Confirm Order`, and click :guilabel:`Receive
Products` to confirm receipt.
Next, check the inventory valuation record generated by the product reception by navigating to
:menuselection:`Inventory --> Reporting --> Inventory Valuation`. Select the drop-down for
`Table`, and view the :guilabel:`Total Value` column for the *valuation layer* (:dfn:`inventory
valuation at a specific point in time = on-hand quantity * unit price`). The 8 tables in-stock
are worth $80.
.. image:: avg_price_valuation/inventory-val-8-tables.png
:align: center
:alt: Show inventory valuation of 8 tables in Odoo.
.. tip::
When the product category's :guilabel:`Costing Method` is set to :guilabel:`AVCO`, then the
average cost of a product is also displayed on the :guilabel:`Cost` field, under the
:guilabel:`General Information` tab, on the product page itself.
Product delivery (use case)
~~~~~~~~~~~~~~~~~~~~~~~~~~~
For outgoing shipments, :ref:`outbound products have no effect on the average cost valuation
<inventory/avg_cost/definite_rule>`. Although the average cost valuation is not recalculated, the
inventory value still decreases because the product is removed from stock and delivered to the
customer location.
.. exercise::
To demonstrate that the average cost valuation is not recalculated, examine the "Deliver 10
tables" example.
.. math::
Avg~Cost = \frac{12 \times $12 + (-10) \times $12}{12-10} = \frac{24}{2} = $12
#. Because 10 tables are being sent out to customers, the *incoming quantity* is `-10`. The
previous average cost (`$12`) is used in lieu of a vendor's *purchase price*;
#. The *incoming inventory value* is `-10 * $12 = -$120`;
#. The old *inventory value* (`$144`) is added to the *incoming inventory value* (`-$120`), so
`$144 + -$120 = $24`;
#. Only `2` tables remain after shipping out `10` tables from `12`. So the current *inventory
value* (`$24`) is divided by the on-hand quantity (`2`);
#. `$24 / 2 = $12`, which is the same average cost as the previous operation.
To verify this in Odoo, sell `10` tables in the *Sales* app, validate the delivery, and then
review the inventory valuation record by going to in :menuselection:`Inventory --> Reporting -->
Inventory Valuation`. In the topmost valuation layer, delivering `10` tables reduces the
product's value by `-$120`.
**Note**: What is not represented in this stock valuation record is the revenue made from this
sale, so this decrease is not a loss to the company.
.. image:: avg_price_valuation/inventory-val-send-10-tables.png
:align: center
:alt: Show how deliveries decrease inventory valuation.
.. _inventory/avg_cost/return:
Return items to supplier (use case)
===================================
Because the price paid to suppliers can differ from the price the product is valued at with the
|AVCO| method, Odoo handles returned items in a specific way.
#. Products are returned to suppliers at the original purchase price, but;
#. The internal cost valuation remains unchanged.
The above :ref:`example table <inventory/avg_cost/math_table>` is updated as follows:
+--------------------------------+---------------+-------------------+---------------+------------+
| Operation | Qty*Avg Cost | Inventory Value | Qty On Hand | Avg Cost |
+================================+===============+===================+===============+============+
| | | $24 | 2 | $12 |
+--------------------------------+---------------+-------------------+---------------+------------+
| Return 1 table bought at $10 | -1 * $12 | $12 | 1 | $12 |
+--------------------------------+---------------+-------------------+---------------+------------+
In other words, returns to vendors are perceived by Odoo as another form of a product exiting the
warehouse. To Odoo, because the table is valued at $12 per unit, the inventory value is reduced by
`$12` when the product is returned; the initial purchase price of `$10` is unrelated to the table's
average cost.
.. example::
To return a single table that was purchased for `$10`, navigate to the receipt in the *Inventory*
app for the :ref:`8 tables purchased in Exercise 1 <inventory/avg_cost/ex-1>` by going to the
:guilabel:`Inventory Overview`, clicking on :guilabel:`Receipts`, and selecting the desired
receipt.
Then, click :guilabel:`Return` on the validated delivery order, and modify the quantity to `1` in
the reverse transfer window. This creates an outgoing shipment for the table. Select
:guilabel:`Validate` to confirm the outgoing shipment.
Return to :menuselection:`Inventory --> Reporting --> Inventory Valuation` to see how the
outgoing shipment decreases the inventory value by $12.
.. image:: avg_price_valuation/inventory-valuation-return.png
:align: center
:alt: Inventory valuation for return.
.. _inventory/avg_price/leaving_inventory:
Eliminate stock valuation errors in outgoing products
-----------------------------------------------------
Inconsistencies can occur in a company's inventory when the average cost valuation is recalculated
on outgoing shipments.
To demonstrate this error, the table below displays a scenario in which 1 table is shipped to a
customer and another is returned to a supplier at the purchased price.
+------------------------------------------+---------------+-------------------+---------------+------------+
| Operation | Qty*Price | Inventory Value | Qty On Hand | Avg Cost |
+==========================================+===============+===================+===============+============+
| | | $24 | 2 | $12 |
+------------------------------------------+---------------+-------------------+---------------+------------+
| Ship 1 product to customer | -1 \* $12 | $12 | 1 | $12 |
+------------------------------------------+---------------+-------------------+---------------+------------+
| Return 1 product initially bought at $10 | -1 \* $10 | **$2** | **0** | $12 |
+------------------------------------------+---------------+-------------------+---------------+------------+
In the final operation above, the final inventory valuation for the table is `$2` even though there
are `0` tables left in stock.
.. admonition:: Correct method
Use the average cost to value the return. This does not mean the company gets $12 back for a $10
purchase; the item returned for $10 is valued internally at $12. The inventory value change
represents a product worth $12 no longer being accounted for in company assets.
Anglo-Saxon accounting
======================
In addition to using |AVCO|, companies that use **Anglo-Saxon accounting** also keep a holding
account that tracks the amount to be paid to vendors. Once a vendor delivers an order, **inventory
value** increases based on the vendor price of the products that have entered the stock. The holding
account (called **stock input**) is credited and only reconciled once the vendor bill is received.
.. seealso::
- :ref:`Anglo-Saxon vs. Continental <inventory/inventory_valuation_config/accounting>`
The table below reflects journal entries and accounts. The *stock input* account stores the money
intended to pay vendors when the vendor bill has not yet been received. To balance accounts when
returning products that have a price difference between the price the product is **valued at** and
the price it was bought for, a *price difference* account is created.
.. _inventory/avg_price/price-table:
+-----------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Operation | Stock Input | Price Diff | Inventory Value | Qty On Hand | Avg Cost |
+=========================================+===============+==============+===================+===============+============+
| | | | $0 | 0 | $0 |
+-----------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Receive 8 tables at $10 | ($80) | | $80 | 8 | $10 |
+-----------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Receive vendor bill $80 | $0 | | $80 | 8 | $10 |
+-----------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Receive 4 tables at $16 | ($64) | | $144 | 12 | $12 |
+-----------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Receive vendor bill $64 | $0 | | $144 | 12 | $12 |
+-----------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Deliver 10 tables to customer | $0 | | $24 | 2 | $12 |
+-----------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Return 1 table initially bought at $10 | **$10** | **$2** | **$12** | 1 | $12 |
+-----------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Receive vendor refund $10 | $0 | $2 | $12 | 1 | $12 |
+-----------------------------------------+---------------+--------------+-------------------+---------------+------------+
Product reception
-----------------
Summary
~~~~~~~
At product reception, Odoo ensures companies can pay for goods that were purchased by preemptively
moving an amount matching the price of received goods into the :doc:`liability account
</applications/finance/accounting/get_started/cheat_sheet>`, **Stock Input**. Then, once the bill
has been received, the amount in the holding account is transferred to *Accounts Payable*. Transfers
into this account means the bill has been paid. **Stock Input** is reconciled once the vendor bill
is received.
Inventory valuation is a method of calculating how much each in-stock product is worth internally.
Since there is a difference between the price the product is **valuated at** and the price the
product was actually **purchased for**, the **Inventory Valuation** account is unrelated to the
crediting and debiting operations of the **Stock Input** account.
To conceptualize all this, follow the breakdown below.
Accounts balanced at received products
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In this example, a company starts with zero units of a product, `table`, in stock. Then, 8 tables
are received from the vendor:
#. The **Stock Input** account stores `$80` of credit owed to the vendor. The amount in this account
is unrelated to the inventory value.
#. `$80` worth of tables came **in** (**debit** the *Inventory Value* account `$80`), and
#. `$80` must be paid **out** for received goods (**credit** the *Stock Input* account `$80`).
In Odoo
*******
Odoo generates an accounting journal entry when shipments that use |AVCO| costing method are
received. Configure a :guilabel:`Price Difference Account` by selecting the :guilabel:`➡️ (arrow)`
icon next to the :guilabel:`Product Category` field on the product page.
Under :guilabel:`Account Properties`, create a new :guilabel:`Price Difference Account` by typing in
the name of the account and clicking :guilabel:`Create and Edit`. Then set the account
:guilabel:`Type` as `Expenses`, and click :guilabel:`Save`.
.. image:: avg_price_valuation/create-price-difference.png
.. image:: avg_price_valuation/avg01.png
:align: center
:alt: Create price difference account.
Then, receive the shipment in the *Purchase* app or *Inventory* app, and navigate to the
:menuselection:`Accounting app --> Accounting --> Journal Entries`. In the list, find the
:guilabel:`Reference` that matches the warehouse reception operation for the relevant product.
- When products leave the warehouse: the average cost **does not** change
.. image:: avg_price_valuation/search-for-entry-of-tables.png
:align: center
:alt: Show accounting entry of 8 tables from the list.
Defining the purchase price
---------------------------
Click on the line for 8 tables. This accounting journal entry shows that when the 8 tables were
received, the `Stock Valuation` account increased by `$80`. Conversely, the **Stock Input** account
(set as `Stock Interim (Received)` account by default) is credited `$80`.
The purchase price is estimated at the reception of the products (you
might not have received the vendor bill yet) and reevaluated at the
reception of the vendor bill. The purchase price includes the cost you
pay for the products, but it may also includes additional costs, like
landed costs.
.. image:: avg_price_valuation/accounting-entry-8-tables.png
:align: center
:alt: Debit stock valuation and credit stock input 80 dollars.
Average cost example
====================
Accounts balanced at received vendor bill
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------+---------------+-------------------+---------------+------------+
| Operation | Delta Value | Inventory Value | Qty On Hand | Avg Cost |
+=============================+===============+===================+===============+============+
| | | $0 | 0 | $0 |
+-----------------------------+---------------+-------------------+---------------+------------+
| Receive 8 Products at $10 | +8\*$10 | $80 | 8 | $10 |
+-----------------------------+---------------+-------------------+---------------+------------+
| Receive 4 Products at $16 | +4\*$16 | $144 | 12 | $12 |
+-----------------------------+---------------+-------------------+---------------+------------+
| Deliver 10 Products | -10\*$12 | $24 | 2 | $12 |
+-----------------------------+---------------+-------------------+---------------+------------+
+-----------------------------+---------------+-------------------+---------------+------------+
In this example, a company starts with zero units of a product, table, in stock. Then, 8 tables are
received from the vendor. When the bill is received from vendor for 8 tables:
At the beginning, the Avg Cost is set to 0 set as there is no product in
the inventory. When the first reception is made, the average cost
becomes logically the purchase price.
#. Use `$80` in the **Stock Input** account to pay the bill. This cancels out and the account now
holds `$0`.
#. Debit **Stock Input** `$80` (to reconcile this account).
#. Credit **Accounts payable** `$80`. This account stores the amount the company owes others, so
accountants use the amount to write checks to vendors.
At the second reception, the average cost is updated because the total
inventory value is now ``$80 + 4*$16 = $144``. As we have 12 units on
hand, the average price per unit is ``$144 / 12 = $12``.
In Odoo
*******
By definition, the delivery of 10 products does not change the average
cost. Indeed, the inventory value is now $24 as we have only 2 units
remaining of each ``$24 / 2 = $12``.
Once the vendor requests payment, navigate to the :menuselection:`Purchase app --> Orders -->
Purchase` and select the :abbr:`PO (Purchase Order)` for 8 tables. Inside the :abbr:`PO (Purchase
Order)`, select :guilabel:`Create Bill`.
Purchase return use case
========================
Switch to the :guilabel:`Journal Items` tab to view how `$80` is transferred from the holding
account, `Stock Interim (Received)` to `Accounts Payable`. :guilabel:`Confirm` the bill to record
the payment to the vendor.
In case of a product returned to its supplier after reception, the
inventory value is reduced using the average cost formulae (not at the
initial price of these products!).
.. image:: avg_price_valuation/receive-8-table-bill.png
:align: center
:alt: Show bill linked to the purchase order for 8 tables.
Which means that the above table will be updated as follow:
On product delivery
-------------------
+-----------------------------------------------+---------------+-------------------+---------------+------------+
| Operation | Delta Value | Inventory Value | Qty On Hand | Avg Cost |
+===============================================+===============+===================+===============+============+
| | | $24 | 2 | $12 |
+-----------------------------------------------+---------------+-------------------+---------------+------------+
| Return of 1 Product initially bought at $10 | -1\*$12 | $12 | 1 | $12 |
+-----------------------------------------------+---------------+-------------------+---------------+------------+
In the :ref:`above example table <inventory/avg_price/price-table>`, when 10 products are delivered
to a customer, the **Stock Input** account is untouched because there are no new products coming in.
To put it simply:
Explanation: counter example
----------------------------
#. **Inventory valuation** is credited `$120`. Subtracting from inventory valuation represents
`$120` worth of products exiting the company.
#. Debit **Accounts Receivable** to record revenue from the sale.
Remember the definition of **Average Cost**, saying that we do not update
the average cost of a product leaving the inventory. If you break this
rule, you may lead to inconsistencies in your inventory.
.. image:: avg_price_valuation/sell-10-tables.png
:align: center
:alt: Show journal items linked to sale order.
As an example, here is the scenario when you deliver one piece to the
customer and return the other one to your supplier (at the cost you
purchased it). Here is the operation:
.. spoiler:: Understand Anglo-Saxon expensing
+-----------------------------------------------+---------------+-------------------+---------------+------------+
| Operation | Delta Value | Inventory Value | Qty On Hand | Avg Cost |
+===============================================+===============+===================+===============+============+
| | | $24 | 2 | $12 |
+-----------------------------------------------+---------------+-------------------+---------------+------------+
| Customer Shipping 1 product | -1\*$12 | $12 | 1 | $12 |
+-----------------------------------------------+---------------+-------------------+---------------+------------+
| Return of 1 Product initially bought at $10 | -1\*$10 | **$2** | **0** | $12 |
+-----------------------------------------------+---------------+-------------------+---------------+------------+
In the accounting journal entry invoicing a customer for 10 tables, the accounts **Product
Sales**, **Tax Received**, and **Accounts Receivable** all pertain to the sale of the product.
**Accounts Receivable** is the account where the customer payment will be received.
As you can see in this example, this is not correct: an inventory
valuation of $2 for 0 pieces in the warehouse.
Anglo-Saxon accounting recognizes the cost of goods sold (COGS) once the sale is made. So, up
until the product is sold, scrapped, or returned, costs of keeping the product in stock are not
accounted for. The **Expense** account is debited `$120` to log the costs of storing 10 tables
during this period of time.
The correct scenario should be to return the goods at the current
average cost:
On product return
-----------------
+-----------------------------------------------+---------------+-------------------+---------------+------------+
| Operation | Delta Value | Inventory Value | Qty On Hand | Avg Cost |
+===============================================+===============+===================+===============+============+
| | | $24 | 2 | $12 |
+-----------------------------------------------+---------------+-------------------+---------------+------------+
| Customer Shipping 1 product | -1\*$12 | $12 | 1 | $12 |
+-----------------------------------------------+---------------+-------------------+---------------+------------+
| Return of 1 Product initially bought at $10 | -1\*$12 | **$0** | **0** | $12 |
+-----------------------------------------------+---------------+-------------------+---------------+------------+
In the :ref:`above example table <inventory/avg_price/price-table>`, when returning 1 product to a
vendor purchased at `$10`, a company expects `$10` in the **Accounts Payable** account from the
vendor. However, **Stock Input** account must be debited `$12` because the average cost is `$12` at
the time of the return. The missing `$2` is accounted for in the :guilabel:`Price Difference
Account`, which is set up in the product's :guilabel:`Product Category`.
On the other hand, using the average cost to value the return ensure a
correct inventory value at all times.
.. note::
Behavior of *price difference accounts* varies from localization. In this case, the account is
intended to store differences between vendor price and *automated* inventory valuation methods.
Further thoughts on anglo saxon mode
------------------------------------
Summary:
For people in using the **anglo saxon accounting** principles, there is
another concept to take into account: the stock input account of the
product, which is intended to hold at any time the value of vendor bills
to receive. So the stock input account will increase on reception of
incoming shipments and will decrease when receiving the related vendor
bills.
#. Debit **Stock Input** account `$10` to move the table from stock to stock input. This move is to
indicate that the table is to be processed for an outgoing shipment.
#. Debit **Stock Input** an additional `$2` to account for the **Price Difference**.
#. Credit **Stock Valuation** `$12` because the item is leaving the stock.
Back to our example, we see that when the return is valued at the
average price, the amount booked in the stock input account is the
original purchase price:
.. image:: avg_price_valuation/expensing-price-difference-account.png
:align: center
:alt: 2 dollar difference expensed in Price Difference account.
+-----------------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Operation | stock input | price diff | Inventory Value | Qty On Hand | Avg Cost |
+===============================================+===============+==============+===================+===============+============+
| | | | $0 | 0 | $0 |
+-----------------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Receive 8 Products at $10 | ($80) | | $80 | 8 | $10 |
+-----------------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Receive vendor bill $80 | $0 | | $80 | 8 | $10 |
+-----------------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Receive 4 Products at $16 | ($64) | | $144 | 12 | $12 |
+-----------------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Receive vendor bill $64 | $0 | | $144 | 12 | $12 |
+-----------------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Deliver 10 Products | $0 | | $24 | 2 | $12 |
+-----------------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Return of 1 Product initially bought at $10 | **$10** | **$2** | **$12** | 1 | $12 |
+-----------------------------------------------+---------------+--------------+-------------------+---------------+------------+
| Receive vendor refund $10 | $0 | $2 | $12 | 1 | $12 |
+-----------------------------------------------+---------------+--------------+-------------------+---------------+------------+
Once the vendor's refund is received,
#. Credit **Stock Input** account `$10` to reconcile the price of the table.
#. Debit **Accounts Payable** `$10` to have the accountants collect and register the payment in
their journal.
.. image:: avg_price_valuation/return-credit-note.png
:align: center
:alt: Return to get 10 dollars back.
This is because the vendor refund will be made using the original
purchase price, so to zero out the effect of the return in the stock
input in last operation, we need to reuse the original price. The price
difference account located on the product category is used to book the
difference between the average cost and the original purchase price.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

View File

@@ -129,8 +129,6 @@ Example
.. placeholder
.. _cheat_sheet/journals:
Journal entries
===============

View File

@@ -220,42 +220,6 @@ To match the letter `C` or `D` in a prefix and not use it as a suffix, use an em
| `21D\\()`
| This formula matches accounts whose code starts with `21D`, regardless of their balance sign.
In addition to using code prefixes to include accounts, you can also match them with **account
tags**. This is especially useful, for example, if your country lacks a standardized chart of
accounts, where the same prefix might be used for different purposes across companies.
.. example::
| `tag(25)`
| This formula matches accounts whose associated tags contain the one with id *25*.
If the tag you reference is defined in a data file, an xmlid can be used instead of the id.
.. example::
| `tag(my_module.my_tag)`
| This formula matches accounts whose associated tags include the tag denoted by
*my_module.my_tag*.
You can also use arithmetic expressions with tags, possibly combining them with prefix selections.
.. example::
| `tag(my_module.my_tag) + tag(42) + 10`
| The balances of accounts tagged as *my_module.my_tag* will be summed with those of accounts
linked to the tag with ID *42* and accounts with the code prefix `10`
`C` and `D` suffixes can be used in the same way with tags.
.. example::
| `tag(my_module.my_tag)C`
| This formula matches accounts with the tag *my_module.my_tag* and a credit balance.
Prefix exclusion also works with tags.
.. example::
| `tag(my_module.my_tag)\\(10)`
| This formula matches accounts with the tag *my_module.my_tag* and a code not starting with
`10`.
'External Value' engine
-----------------------

View File

@@ -4,16 +4,15 @@ Colombia
.. |DIAN| replace:: :abbr:`DIAN (Dirección de Impuestos y Aduanas Nacionales)`
Odoo's Colombian localization package provides accounting, fiscal, and legal features for databases
in Colombia such as chart of accounts, taxes, and electronic invoicing.
Odoo's Colombian localization package provides accounting, fiscal and legal features in Colombia
such as chart of accounts, taxes and electronic invoicing.
In addition, a series of videos on the subject is also available. These videos cover how to start
from scratch, set up configurations, complete common workflows, and provide in-depth looks at some
specific use cases as well.
In addition, we have a series of videos covering how to start from scratch, configuration, main
workflows, and specific use cases.
.. seealso::
`Smart Tutorial - Colombian Localization
<https://www.odoo.com/slides/smart-tutorial-localizacion-de-colombia-132>`_.
`Odoo Colombian localization videos
<https://www.youtube.com/playlist?list=PL1-aSABtP6ABxZshems3snMjx7bj_7ZsZ>`_.
.. _colombia/configuration:
@@ -37,78 +36,74 @@ localization:
- `l10n_co`
- Default :ref:`fiscal localization package <fiscal_localizations/packages>`. This module adds
the base accounting features for the Colombian localization: chart of accounts, taxes,
withholdings, and identification document type.
withholdings, identification document type.
* - :guilabel:`Colombian - Accounting Reports`
- `l10n_co_reports`
- Includes accounting reports for sending certifications to suppliers for withholdings applied.
* - :guilabel:`Electronic invoicing for Colombia with Carvajal`
- `l10n_co_edi`
- This module includes the features required for integration with Carvajal, and
generates the electronic invoices and support documents related to the vendor bills, based on
- This module includes the features that are required for the integration with Carvajal and
generates the electronic invoices and support document related to the vendor bills based on
|DIAN| regulations.
* - :guilabel:`Colombian - Point of Sale`
- `l10n_co_pos`
- Includes Point of Sale receipts for Colombian localization.
- Includes Point of Sale Receipt for Colombian Localization.
.. note::
When `Colombia` is selected for a company's :guilabel:`Fiscal Localization`, Odoo automatically
installs certain modules.
When a database is created from scratch selecting :guilabel:`Colombia` as the country, Odoo
automatically installs the base modules *Colombia - Accounting* and *Colombia - Accounting
Reports*.
Company configuration
---------------------
To configure your company information, go to the :menuselection:`Contacts` app, and search for your
company.
Alternatively, activate :ref:`developer mode <developer-mode>` and navigate to
To configure your company information, go to the :menuselection:`Contacts` app and search for your
company. Alternatively, activate :ref:`developer mode <developer-mode>` and navigate to
:menuselection:`General Setting --> Company --> Update Info --> Contact`. Then, edit the contact
form and configure the following information:
form to configure the following information:
- :guilabel:`Company Name`.
- :guilabel:`Address`: Including :guilabel:`City`, :guilabel:`Department` and :guilabel:`ZIP` code.
- :guilabel:`Identification Number`: Select the :guilabel:`Identification Type` (`NIT`, `Cédula de
Ciudadanía`, `Registro Civil`, etc.). When the :guilabel:`Identification Type` is `NIT`, the
:guilabel:`Identification Number` **must** have the *verification digit* at the end of the ID
prefixed by a hyphen (`-`).
- :guilabel:`Address`: Including :guilabel:`City`, :guilabel:`Department` and :guilabel:`Zip Code`.
- :guilabel:`Tax ID`: When it is a `NIT`, it must have the *verification digit* at the end of the ID
followed by a hyphen (`-`).
Next, configure the :guilabel:`Fiscal Information` in the :guilabel:`Sales & Purchase` tab:
- :guilabel:`Obligaciones y Responsabilidades`: Select the fiscal responsibility for the company
(`O-13` Gran Contribuyente, `O-15` Autorretenedor, `O-23` Agente de retención IVA, `O-47` Regimen
de tributación simple, `R-99-PN` No Aplica).
(:guilabel:`O-13` Gran Contribuyente, :guilabel:`O-15` Autorretenedor, :guilabel:`O-23` Agente de
retención IVA, :guilabel:`O-47` Regimen de tributación simple, :guilabel:`R-99-PN` No Aplica).
- :guilabel:`Gran Contribuyente`: If the company is *Gran Contribuyente* this option should be
selected.
- :guilabel:`Fiscal Regimen`: Select the Tribute Name for the company (`IVA`, `INC`, `IVA e INC`,
or `No Aplica`)
- :guilabel:`Fiscal Regimen`: Select the Tribute Name for the company (:guilabel:`IVA`,
:guilabel:`INC`, :guilabel:`IVA e INC`, :guilabel:`No Aplica`)
- :guilabel:`Commercial Name`: If the company uses a specific commercial name, and it needs to be
displayed in the invoice.
Carjaval credentials configuration
----------------------------------
Once the modules are installed, the user credentials **must** be configured, in order to connect
with Carvajal Web Service. To do so, navigate to :menuselection:`Accounting --> Configuration -->
Settings` and scroll to the :guilabel:`Colombian Electronic Invoicing` section. Then, fill in the
required configuration information provided by Carvajal:
Once the modules installed, the user credentials must be configured in order to connect with
Carvajal Web Service. Navigate to :menuselection:`Accounting --> Configuration --> Settings` and
scroll to the :guilabel:`Colombian Electronic Invoicing` section. Then, fill in the required
configuration information provided by Carvajal:
- :guilabel:`Username` and :guilabel:`Password`: Username and password (provided by Carvajal) to the
company.
- :guilabel:`Username` and :guilabel:`Password`: Correspond to the username and password provided
by Carvajal to the company.
- :guilabel:`Company Registry`: Company's NIT number *without* the verification code.
- :guilabel:`Account ID`: Company's NIT number followed by `_01`.
- :guilabel:`Colombia Template Code`: Select one of the two available templates (`CGEN03` or
`CGNE04`) to be used in the PDF format of the electronic invoice.
Enable the :guilabel:`Test mode` checkbox to connect with the Carvajal testing environment.
Once Odoo and Carvajal are fully configured and ready for production, deactivate the :guilabel:`Test
mode` checkbox to use the production database.
- :guilabel:`Account ID`: Company ID followed by `_01`.
- :guilabel:`Colombia Template Code`: Select one of the two available templates (:guilabel:`CGEN03`
or :guilabel:`CGNE04`) to be used in the PDF format of the electronic invoice.
.. image:: colombia/carvajal-configuration.png
:align: center
:alt: Configure credentials for Carvajal web service in Odoo.
.. note::
Check the :guilabel:`Test mode` checkbox to connect with the Carvajal testing environment. Once
Odoo and Carvajal are fully configured and ready for production, uncheck the :guilabel:`Test
mode` checkbox to use the production database.
.. important::
:guilabel:`Test mode` must **only** be used on duplicated databases, **not** the production
:guilabel:`Test mode` must be used **only** on replicated databases, **not** the production
environment.
Report data configuration
@@ -117,17 +112,8 @@ Report data configuration
Report data can be defined for the fiscal section and bank information of the PDF as part of the
configurable information sent in the XML.
Navigate to :menuselection:`Accounting --> Configuration --> Settings`, and scroll to the
:guilabel:`Colombian Electronic Invoicing` section, in order to find the :guilabel:`Report
Configuration` fields. Here the header information for each report type can be configured.
- :guilabel:`Gran Contribuyente`
- :guilabel:`Tipo de Régimen`
- :guilabel:`Retenedores de IVA`
- :guilabel:`Autorretenedores`
- :guilabel:`Resolución Aplicable`
- :guilabel:`Actividad Económica`
- :guilabel:`Bank Information`
Navigate to :menuselection:`Accounting --> Configuration --> Settings` and scroll to the
:guilabel:`Colombian Electronic Invoicing` section.
.. _colombia/master-data:
@@ -137,85 +123,67 @@ Master data configuration
Partner
~~~~~~~
Partner contacts can be created in the *Contacts* app. To do so, navigate to
:menuselection:`Contacts`, and click the :guilabel:`Create` button.
Then, name the contact, and using the radio buttons, select the contact type, either
:guilabel:`Individual` or :guilabel:`Company`.
Complete the full :guilabel:`Address`, including the :guilabel:`City`, :guilabel:`State`, and
:guilabel:`ZIP` code. Then, complete the identification and fiscal information.
Identification information
**************************
Identification types, defined by the |DIAN|, are available on the partner form, as part of the
Colombian localization. Colombian partners **must** have their :guilabel:`Identification Number`
(VAT) and :guilabel:`Document Type` set.
Document types defined by the |DIAN| are available on the partner form as part of the Colombian
localization. Colombian partners must have their :guilabel:`Identification Number` (VAT) and
:guilabel:`Document Type` set.
.. tip::
When the :guilabel:`Document Type` is `NIT`, the :guilabel:`Identification Number` needs to be
configured in Odoo, including the *verification digit at the end of the ID, prefixed by a hyphen
(`-`)*.
configured in Odoo, including the *verification digit*; Odoo splits this number when the data to
is sent to the third party.
Fiscal information
******************
The partner's responsibility codes (section 53 in the :abbr:`RUT (Registro único tributario)`
document) are included as part of the electronic invoicing module, as it is required by the |DIAN|.
The partner's responsibility codes (section 53 in the RUT document) are included as part of the
electronic invoicing module, as it is required by the |DIAN|.
The required fields can be found under :menuselection:`Partner --> Sales & Purchase Tab --> Fiscal
Information section`:
Information`:
- :guilabel:`Obligaciones y Responsabilidades`: Select the fiscal responsibility for the company
(`O-13` Gran Contribuyente, `O-15` Autorretenedor, `O-23` Agente de retención IVA, `O-47` Regimen
de tributación simple, or `R-99-PN` No Aplica).
(:guilabel:`O-13` Gran Contribuyente, :guilabel:`O-15` Autorretenedor, :guilabel:`O-23` Agente de
retención IVA, :guilabel:`O-47` Regimen de tributación simple, :guilabel:`R-99-PN` No Aplica).
- :guilabel:`Gran Contribuyente`: If the company is *Gran Contribuyente* this option should be
selected.
- :guilabel:`Fiscal Regimen`: Select the tribute name for the company (`IVA`, `INC`, `IVA e INC`, or
`No Aplica`)
- :guilabel:`Fiscal Regimen`: Select the Tribute Name for the company (:guilabel:`IVA`,
:guilabel:`INC`, :guilabel:`IVA e INC`, :guilabel:`No Aplica`)
- :guilabel:`Commercial Name`: If the company uses a specific commercial name, and it needs to be
displayed in the invoice.
Products
~~~~~~~~
To manage products, navigate to :menuselection:`Accounting --> Customers --> Products`, then click
on a product.
When adding general information on the product form, it is required that either the
:guilabel:`UNSPSC Category` (:guilabel:`Accounting` tab), or :guilabel:`Internal Reference`
(:guilabel:`General Information` tab) field is configured. Be sure to :guilabel:`Save` the product
once configured.
In addition to adding general information (in the :guilabel:`General Information` tab) on the
product form, either the :guilabel:`UNSPSC Category`, :guilabel:`Barcode`, or :guilabel:`Internal
Reference` field must also be configured.
Taxes
~~~~~
To create or modify taxes, go to :menuselection:`Accounting --> Configuration --> Taxes`, and select
the related tax.
If sales transactions include products with taxes, the :guilabel:`Value Type` field in the
:guilabel:`Advanced Options` tab needs to be configured per tax. Retention tax types
(:guilabel:`ICA`, :guilabel:`IVA`, :guilabel:`Fuente`) are also included. This configuration is used
to display taxes correctly in the invoice PDF.
:guilabel:`Advanced Options` tab needs to be configured per tax. To do so, go to
:menuselection:`Accounting --> Configuration --> Taxes`, and select the related tax.
Retention tax types (:guilabel:`ICA`, :guilabel:`IVA`, :guilabel:`Fuente`) are also included. This
configuration is used to display taxes in the invoice PDF correctly.
.. image:: colombia/retention-tax-types.png
:align: center
:alt: The ICA, IVA and Fuente fields in the Advanced Options tab in Odoo.
.. _co-journals:
Sales journals
~~~~~~~~~~~~~~
Once the |DIAN| has assigned the official sequence and prefix for the electronic invoice resolution,
the sales journals related to the invoice documents **must** be updated in Odoo. To do so, navigate
to :menuselection:`Accounting --> Configuration --> Journals`, and select an existing sales journal,
or create a new one with the :guilabel:`Create` button.
.. _co-journals:
On the sales journal form, input the :guilabel:`Journal Name`, :guilabel:`Type`, and set a unique
:guilabel:`Short Code` in the :guilabel:`Journals Entries` tab. Then, configure the following data
in the :guilabel:`Advanced Settings` tab:
Once the |DIAN| has assigned the official sequence and prefix for the electronic invoice resolution,
the sales journals related to the invoice documents must be updated in Odoo. To do so, navigate to
:menuselection:`Accounting --> Configuration --> Journals`.
Configure the following data in the :guilabel:`Advanced Settings` tab:
- :guilabel:`Electronic invoicing`: Enable :guilabel:`UBL 2.1 (Colombia)`.
- :guilabel:`Invoicing Resolution`: Resolution number issued by |DIAN| to the company.
@@ -225,31 +193,32 @@ in the :guilabel:`Advanced Settings` tab:
- :guilabel:`Range of Numbering (maximum)`: Last authorized invoice number.
.. note::
The sequence and resolution of the journal **must** match the one configured in Carvajal and the
The sequence and resolution of the journal must match the one configured in Carvajal and the
|DIAN|.
Invoice sequence
****************
The invoice sequence and prefix **must** be correctly configured when the first document is created.
The invoice sequence and prefix must be correctly configured when the first document is created.
.. note::
Odoo automatically assigns a prefix and sequence to the following invoices.
Odoo automatically assigns a prefix and sequence to the following documents.
Purchase journals
*****************
Once the |DIAN| has assigned the official sequence and prefix for the *support document* related to
Once the |DIAN| has assigned the official sequence and prefix for the support document related to
vendor bills, the purchase journals related to their supporting documents need to be updated in
Odoo. The process is similar to the configuration of the :ref:`sales journals <co-journals>`.
Chart of accounts
*****************
The :doc:`chart of accounts </applications/finance/accounting/get_started/chart_of_accounts>` is
installed by default as part of the localization module, the accounts are mapped automatically in
taxes, default account payable, and default account receivable. The chart of accounts for Colombia
is based on the PUC (Plan Unico de Cuentas).
The :doc:`chart of accounts
</applications/finance/accounting/get_started/chart_of_accounts>` is installed by default as part of
the localization module, the accounts are mapped automatically in taxes, default account payable,
and default account receivable. The chart of accounts for Colombia is based on the PUC (Plan Unico
de Cuentas).
.. _colombia/workflows:
@@ -259,38 +228,18 @@ Main workflows
Electronic invoices
-------------------
The following is a breakdown of the main workflow for electronic invoices with the Colombian
localization:
#. Sender creates an invoice.
#. Electronic invoice provider generates the legal XML file.
#. Electronic invoice provider creates the CUFE (Invoice Electronic Code) with the electronic
signature.
#. Electronic invoice provider sends a notification to |DIAN|.
#. |DIAN| validates the invoice.
#. |DIAN| accepts or rejects the invoice.
#. Electronic invoice provider generates the PDF invoice with a QR code.
#. Electronic invoice provider sends invoice to the acquirer.
#. Acquirer sends a receipt of acknowledgement, and accepts or rejects the invoice.
#. Sender downloads a :file:`.zip` file with the PDF and XML.
.. image:: colombia/workflow-electronic-invoice.png
:align: center
:alt: Electronic invoice workflow for Colombian localization.
.. _colombia/invoice-creation:
Invoice creation
~~~~~~~~~~~~~~~~
.. note::
The functional workflow taking place before an invoice validation does **not** alter the main
changes introduced with the electronic invoice.
The functional workflow taking place before an invoice validation does not alter the main changes
introduced with the electronic invoice.
Electronic invoices are generated and sent to both the |DIAN| and customer through Carvajal's web
service integration. These documents can be created from your sales order or manually generated. To
create a new invoice, go to :menuselection:`Accounting --> Customers --> Invoices`, and select
:guilabel:`Create`. On the invoice form configure the following fields:
service integration. These documents can be created from your sales order or manually. Go to
:menuselection:`Accounting --> Customers --> Invoices` and configure:
- :guilabel:`Customer`: Customer's information.
- :guilabel:`Journal`: Journal used for electronic invoices.
@@ -310,10 +259,9 @@ invoice is then processed asynchronously by the E-invoicing service UBL 2.1 (Col
also displayed in the chatter.
.. image:: colombia/invoice-sent.png
:align: center
:alt: Carvajal XML invoice file in Odoo chatter.
The :guilabel:`Electronic Invoice Name` field is now displayed in the :guilabel:`EDI Documents` tab,
The :guilabel:`Electronic Invoice Name` field is now displayed in the :guilabel:`EDI Documents` tab
with the name of the XML file. Additionally, the :guilabel:`Electronic Invoice Status` field is
displayed with the initial value :guilabel:`To Send`. To process the invoice manually, click on the
:guilabel:`Process Now` button.
@@ -323,7 +271,7 @@ displayed with the initial value :guilabel:`To Send`. To process the invoice man
Reception of legal XML and PDF
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The electronic invoice vendor (Carvajal) receives the XML file, and proceeds to validate its
The electronic invoice vendor (Carvajal) receives the XML file and proceeds to validate its
structure and information.
After validating the electronic invoice, proceed to generate a legal XML which includes a digital
@@ -331,11 +279,10 @@ signature and a unique code (CUFE), a PDF invoice that includes a QR code and th
generated. If everything is correct the :guilabel:`Electronic Invoicing` field value changes to
:guilabel:`Sent`.
A :file:`.zip` containing the legal electronic invoice (in XML format) and the invoice in (PDF
format) is downloaded and displayed in the invoice chatter:
A ZIP containing the legal electronic invoice in XML format and the invoice in PDF format is
downloaded and displayed in the invoice chatter:
.. image:: colombia/invoice-zip.png
:align: center
:alt: ZIP file displayed in the invoice chatter in Odoo.
The electronic invoice status changes to :guilabel:`Accepted`.
@@ -345,7 +292,7 @@ Credit notes
The process for credit notes is the same as for invoices. To create a credit note with reference to
an invoice, go to :menuselection:`Accounting --> Customers --> Invoices`. On the invoice, click
:guilabel:`Add Credit Note`, and complete the following information:
:guilabel:`Add Credit Note` and complete the following information:
- :guilabel:`Credit Method`: Select the type of credit method.
@@ -369,7 +316,7 @@ Debit notes
The process for debit notes is similar to credit notes. To create a debit note with reference to an
invoice, go to :menuselection:`Accounting --> Customers --> Invoices`. On the invoice, click the
:guilabel:`Add Debit Note` button, and enter the following information:
:guilabel:`Add Debit Note` button and complete the following information:
- :guilabel:`Reason`: Type the reason for the debit note.
- :guilabel:`Debit note date`: Select the specific options.
@@ -384,7 +331,7 @@ Support document for vendor bills
---------------------------------
With master data, credentials, and the purchase journal configured for support documents related to
vendor bills, you can start using *support documents*.
vendor bills, you can start using support documents.
Support documents for vendor bills can be created from your purchase order or manually. Go to
:menuselection:`Accounting --> Vendors --> Bills` and fill in the following data:
@@ -425,7 +372,6 @@ Commerce (ICA) tax. The report can be found under :menuselection:`Accounting -->
Colombian Statements --> Certificado de Retención en ICA`.
.. image:: colombia/ica-report.png
:align: center
:alt: Certificado de Retención en ICA report in Odoo Accounting.
Certificado de Retención en IVA
@@ -436,7 +382,6 @@ can be found under :menuselection:`Accounting --> Reporting --> Colombian Statem
de Retención en IVA`.
.. image:: colombia/iva-report.png
:align: center
:alt: Certificado de Retención en IVA report in Odoo Accounting.
Certificado de Retención en la Fuente
@@ -447,5 +392,4 @@ be found under :menuselection:`Accounting --> Reporting --> Colombian Statements
Retención en Fuente`.
.. image:: colombia/fuente-report.png
:align: center
:alt: Certificado de Retención en Fuente report in Odoo Accounting.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -5,11 +5,6 @@ PayPal
`Paypal <https://www.paypal.com/>`_ is an American online payment provider available worldwide, and
one of the few that does not charge a subscription fee.
.. note::
While PayPal is available in `over 200 countries/regions
<https://www.paypal.com/webapps/mpp/country-worldwide>`_, only `a selection of currencies are
supported <https://developer.paypal.com/docs/reports/reference/paypal-supported-currencies>`_.
Settings in PayPal
==================

View File

@@ -2,18 +2,18 @@
Sign
====
**Odoo Sign** allows you to send, sign, and approve documents online, using electronic signatures.
**Odoo Sign** allows you to send, sign and approve documents online, using electronic signatures.
An **electronic signature** shows a person's agreement to the content of a document. Just like a
handwritten signature, the electronic one represents a legal bounding by the terms of the signed
document.
With Sign, you can upload any PDF file and add fields to it. These fields can be automatically
filled in with the user's details present in your database.
With Sign, you can upload any PDF file and add fields to it. These fields are automatically filled
in with the user's details present in your database.
.. seealso::
- `Odoo Sign: product page <https://www.odoo.com/app/sign>`_
- `Odoo Tutorials: Sign [video] <https://www.odoo.com/slides/sign-61>`_
- `Odoo Tutorials: Sign <https://www.odoo.com/slides/sign-61>`_
Validity of electronic signatures
=================================
@@ -82,60 +82,16 @@ Overall, to be recognized as valid, electronic signatures have to meet five crit
is up-to-date. We advise contacting a local attorney for legal advice regarding electronic
signature compliance and validity.
Send a document to sign
=======================
One-time signature
------------------
You can click :guilabel:`Upload a PDF to sign` from your dashboard for a one-time signature. Select
your document, open it, and drag and drop the required :ref:`fields <sign/fields>` in your document.
You can modify the :ref:`role <sign/role>` assigned to a field by clicking on it and selecting the
one you want.
When ready, click :guilabel:`Send`, and fill in the required fields. Once sent, your document
remains available. Go to :menuselection:`Documents --> All Documents` to see your document
and the status of the signatures.
.. image:: sign/signature-status.png
:alt: Signature status
Templates
---------
You can create document templates when you have to send the same document several times. From your
dashboard, click :guilabel:`Upload a PDF template`. Select the document and add the required
:ref:`fields <sign/fields>`. You can modify the :ref:`role <sign/role>` of a field by clicking on it
and selecting the one you want.
Click :guilabel:`Template Properties` to add :guilabel:`Tags` to your template, define a
:guilabel:`Signed Document Workspace`, add :guilabel:`Signed Document Tags`, set a
:guilabel:`Redirect Link` that will be available in the signature confirmation message received
after the signature, or define :guilabel:`Authorized Users` if you want to restrict the use of your
template to specific authorized users or groups.
Your templates are visible by default on your dashboard. You can click :guilabel:`Send` to quickly
send a document template to a signer or :guilabel:`Sign Now` if you are ready to sign your document
immediately.
.. tip::
You can **create a template from a document that was previously sent**. To do so, go to
:menuselection:`Documents --> All Documents`. On the document you want to retrieve, click on
⋮, then :guilabel:`Template`. Click on ⋮ again, then :guilabel:`Restore`. Your document now
appears on your dashboard next to your other templates.
.. _sign/role:
Roles
=====
Each field in a Sign document is related to a role corresponding to a specific person. When a
document is being signed, the person assigned to the role must fill in their assigned fields and
Each field in a Sign document is related to a role that corresponds to a specific person. When a
document is being signed, the person assigned to the role needs to fill in their assigned fields and
sign it.
Roles are available by going to :menuselection:`Sign --> Configuration --> Roles`.
It is possible to update existing roles or to create new roles by clicking on :guilabel:`New`.
It is possible to update existing roles or to create new roles by clicking on :guilabel:`Create`.
Choose a :guilabel:`Role Name`, add an :guilabel:`Extra Authentication Step` to confirm the
identity of the signing person, and if the document can be reassigned to another contact, select
:guilabel:`Change Authorized` for the role. A :guilabel:`Color` can also be chosen for the role.
@@ -145,133 +101,79 @@ template.
Secured identification
----------------------
As the owner of a document, you may request an :guilabel:`Extra Authentication Step` through
:ref:`SMS verification <sign/sms>` or via :ref:`Itsme® <sign/itsme>` (available in Belgium and the
Netherlands). Both authentication options require :ref:`credits <iap/buying_credits>`. If you do not
have any credits left, the authentication steps will be skipped.
As the owner of a document, you may request an :guilabel:`Extra Authentication Step` through an SMS
verification or via Itsme® (available in Belgium and the Netherlands). Both authentication options
require :ref:`credits <iap/buying_credits>`. If you do not have any credits left, the authentication
steps will be skipped.
.. seealso::
- :doc:`In-App Purchase (IAP) <../general/in_app_purchase>`
- :doc:`SMS pricing and FAQ <../marketing/sms_marketing/pricing/pricing_and_faq>`
.. _sign/sms:
SMS verification
~~~~~~~~~~~~~~~~
Go to :menuselection:`Sign --> Configuration --> Roles`. Click in the :guilabel:`Extra
Authentication Step` column for the role, and select :guilabel:`Unique Code Via SMS`.
.. note::
Before being able to send SMS Text Messages, you need to register your phone number. To do so, go
to :menuselection:`Sign --> Configuration --> Settings` and click :guilabel:`Buy credits` under
:guilabel:`Authenticate by SMS`.
Go to the document to sign, add the field for which the SMS verification is required, for example,
the :guilabel:`Signature` field, and click :guilabel:`Send`. On the new page, select the
:guilabel:`customer` and click :guilabel:`Send`.
The person signing the document fills in the :guilabel:`Signature` field, then :guilabel:`Sign`, and
clicks :guilabel:`Validate & Send Completed Document`. A :guilabel:`Final Validation` page pops up
where to add their phone number. One-time codes are sent by SMS.
.. image:: sign/sms-verification.png
:align: center
:alt: Add a hash to your document
Go to the document to sign, add the field for which the SMS verification is required, for example
the :guilabel:`Signature` field, and click :guilabel:`Send`. A page pops up, select the customer,
and click :guilabel:`Send`.
The person signing the document fills in the :guilabel:`Signature` field and clicks
:guilabel:`Validate & Send Completed Document`. A :guilabel:`Final Validation` page pops up where to
add their phone number. One-time codes are sent by SMS.
.. image:: sign/final-validation.png
:align: center
:alt: fill in your phone number for final validation
.. note::
- This feature is enabled by default.
- As soon as the :guilabel:`Extra Authentication Step` applies to a role, this validation step is
requested for any field assigned to this role.
.. _sign/itsme:
Itsme®
~~~~~~
Itsme® authentication can be used to allow signatories to provide their identity using itsme®. This
feature is only available in **Belgium** and the **Netherlands**.
Go to :menuselection:`Sign --> Configuration --> Settings` and enable :guilabel:`Identify with
itsme®`.
The feature can be enabled in :guilabel:`Sign Settings` and applies automatically to the
:guilabel:`Customer (identified with itsme®)` role. To enable it for other roles, go to
:menuselection:`Sign --> Configuration --> Roles`. Click in the :guilabel:`Extra Authentication
Step` column for the role, and select :guilabel:`Via itsme®`.
Then, go to :menuselection:`Sign --> Configuration --> Roles`. Click in the :guilabel:`Extra
Authentication Step` column for the role, and select :guilabel:`Via itsme®`.
Go to the document that needs to be signed and add the :guilabel:`Signature` field. Switch to any
role configured to use the feature, and click :guilabel:`Validate` and :guilabel:`Send`.
Go to the document that needs to be signed and add the :guilabel:`Signature` field. Switch the role
to :guilabel:`customer (identified with itsme®)`, and click :guilabel:`Validate`, and
:guilabel:`Send`.
.. image:: sign/itsme-identification.png
:align: center
:alt: select customer identified with itsme®
Upon signing the document, the signer completes the :guilabel:`Signature` field and proceeds by
clicking on :guilabel:`Validate & Send Completed Document`, triggering a
:guilabel:`Final verification` page where authentication via itsme® is required.
The person signing the document fills in the :guilabel:`Signature` field and clicks
:guilabel:`Validate & Send Completed Document`. A :guilabel:`Final Validation` page pops up, and the
person must authenticate with itsme®.
Signatory hash
==============
Each time someone signs a document, a **hash** - a unique digital signature of the operation - is
generated to ensure traceability, integrity, and inalterability. This process guarantees that any
changes made after a signature is affixed can be easily detected, maintaining the document's
authenticity and security throughout its lifecycle.
A visual security frame displaying the beginning of the hash is added to the signatures. Internal
users can hide or show it by turning the :guilabel:`Frame` option on or off when signing the
document.
.. image:: sign/sign-hash.png
:alt: Adding the visual security frame to a signature.
.. note::
This feature is only available in Belgium and the Netherlands.
.. _sign/field-types:
Tags
====
Tags can be used to categorize and organize documents, allowing users to search for and filter
documents based on specific criteria quickly.
You can manage tags by going to :menuselection:`Configuration --> Tags`. To create a tag, click
:guilabel:`New`. On the new line, add the :guilabel:`Tag Name` and select a :guilabel:`Color Index`
for your tag.
To apply a tag to a document, use the dropdown list available in your document.
Sign order
==========
When a document needs to be signed by different parties, the signing order lets you control the
order in which your recipients receive it for signature.
By going to :menuselection:`Configuration --> Settings`, you can :guilabel:`Enable Signing Order`.
Each recipient receives the signature request notification only once the previous recipient has
completed their action.
Add at least two :guilabel:`Signature` fields with different roles to your document. Click
:guilabel:`Send`, go to the :guilabel:`Options` tab, and tick the :guilabel:`Specify signing order`
box.
Add the signer's :guilabel:`Name or email` information. You can decide on the :guilabel:`Sign Order`
by typing :guilabel:`1` or :guilabel:`2` in the :guilabel:`Sign Order` column.
.. seealso::
`Odoo Quick Tips: Sign order [video] <https://www.youtube.com/watch?v=2KUq7RPt1cU/>`_
.. _sign/fields:
Field types
Field Types
===========
Fields are used in a document to indicate what information must be completed by the signers. You can
add fields to your document simply by dragging and dropping them for the left column into your
document.
Various field types can be used to sign documents (placeholder, autocompletion, etc.). By
configuring your own field types, also known as signature item types, the signing process can be
even faster for your customers, partners, and employees.
Various field types can be used to sign documents (placeholder, autocompletion, ...). By configuring
your own field types, also known as signature item types, the signing process can be even faster for
your customers, partners, and employees.
To create and edit field types, go to :menuselection:`Sign --> Configuration --> Settings -->
Edit field types`.
You can select an existing field by clicking on it, or you can :guilabel:`Create` a new one. First,
You can select an existing field by clicking on it or you can :guilabel:`Create` a new one. First,
edit the :guilabel:`Field Name`. Then, select a :guilabel:`Field Type`:
- :guilabel:`Signature`: users are asked to enter their signature either by drawing it, generating
@@ -297,10 +199,10 @@ the person signing the document. To do so, enter the contact model field's techn
document.
The size of the fields can also be changed by editing the :guilabel:`Default Width` and
:guilabel:`Default Height`. Both sizes are defined as a percentage of the full page expressed as a
decimal, with 1 equalling the full page's width or height. By default, the width of new fields you
create is set to 15% (0.150) of a full page's width, while their height is set to 1.5% (0.015) of a
full page's height.
:guilabel:`Default Height`. Both sizes are defined as a percentage of the full-page expressed as a
decimal, with 1 equalling the full-page's width or height. By default, the width of new fields you
create is set to 15% (0.150) of a full-page's width, while their height is set to 1.5% (0.015) of a
full-page's height.
Next, write a :guilabel:`Tip`. Tips are displayed inside arrows on the left-hand side of the user's
screen during the signing process to help them understand what the step entails (e.g., "Sign here"
@@ -308,4 +210,23 @@ or “Fill in your birthdate”). You can also use a :guilabel:`Placeholder` tex
the field before it is completed.
.. image:: sign/tip-placeholder.png
:align: center
:alt: Tip and placeholder example in Odoo Sign
Signatory hash
==============
A :guilabel:`hash` can be added to a document that is shared (attached to an email or printed, for
example) to indicate that the signature is electronic and that there is some traceability behind
it. The :guilabel:`hash` corresponds to a unique ID number related to the signed document.
If you are an :doc:`internal user <../general/users/manage_users>`,
you can choose to tick or untick the frame option when signing the document. Tick the box to have
the frame and hash visible.
.. image:: sign/sign-hash.png
:align: center
:alt: Add a hash to your document
.. note::
The :guilabel:`hash` is only applicable to the signature field.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -2,8 +2,8 @@
Reporting
=========
You can find several reports under the :guilabel:`Reporting` menu of most apps that let you analyze
and visualize the data of your records.
You can find under the :guilabel:`Reporting` menu of most apps several reports that let you analyze
and visualize your records' data.
.. _reporting/views:
@@ -25,6 +25,7 @@ but can be found elsewhere. Click the **graph view button** located at the top r
it.
.. image:: reporting/graph-button.png
:align: center
:alt: Selecting the graph view
.. _reporting/views/pivot:
@@ -37,6 +38,7 @@ down for analysis. The view is often found under the :guilabel:`Reporting` menu
found elsewhere. Click the **pivot view button** located at the top right to access it.
.. image:: reporting/pivot-button.png
:align: center
:alt: Selecting the pivot view
.. _reporting/choosing-measures:
@@ -63,6 +65,7 @@ grouped by *Date > Month*, which is used to analyze the evolution of a measure o
When you filter a single time period, the option to compare it against another one appears.
.. image:: reporting/comparison.png
:align: center
:alt: Using the comparison option
.. example::
@@ -76,6 +79,7 @@ grouped by *Date > Month*, which is used to analyze the evolution of a measure o
selected.
.. image:: reporting/measures.png
:align: center
:alt: Selecting different measures on the Sales Analysis report
.. tab:: Group measures
@@ -84,6 +88,7 @@ grouped by *Date > Month*, which is used to analyze the evolution of a measure o
previous Sales Analysis report example.
.. image:: reporting/single-group.png
:align: center
:alt: Adding a group on the Sales Analysis report
.. _reporting/using-pivot:
@@ -106,6 +111,7 @@ subgroups.
group on the :guilabel:`All / Saleable / Office Furniture` product category.
.. image:: reporting/multiple-groups.png
:align: center
:alt: Adding multiple groups on the Sales Analysis report
.. tip::
@@ -118,7 +124,7 @@ subgroups.
Using the graph view
====================
Three graphs are available: the bar, line, and pie charts.
Three graphs are available, the bar, line, and pie charts.
**Bar charts** are used to show the distribution or a comparison of several categories. They are
especially useful as they can deal with larger data sets.
@@ -133,16 +139,19 @@ when they form a meaningful whole.
.. tab:: Bar chart
.. image:: reporting/bar.png
:align: center
:alt: Viewing the Sales Analysis report as a bar chart
.. tab:: Line chart
.. image:: reporting/line.png
:align: center
:alt: Viewing the Sales Analysis report as a line chart
.. tab:: Pie chart
.. image:: reporting/pie.png
:align: center
:alt: Viewing the Sales Analysis report as a pie chart
.. tip::
@@ -154,21 +163,25 @@ when they form a meaningful whole.
.. tab:: Stacked bar chart
.. image:: reporting/stacked-bar.png
:align: center
:alt: Stacked bar chart example
.. tab:: Regular bar chart
.. image:: reporting/non-stacked-bar.png
:align: center
:alt: Non-stacked bar chart example
.. tab:: Stacked line chart
.. image:: reporting/stacked-line.png
:align: center
:alt: Stacked line chart example
.. tab:: Regular line chart
.. image:: reporting/non-stacked-line.png
:align: center
:alt: Non-stacked line chart example
For **line** charts, you can use the cumulative option to sum values, which is especially useful
@@ -179,9 +192,11 @@ when they form a meaningful whole.
.. tab:: Cumulative line chart
.. image:: reporting/cumulative.png
:align: center
:alt: Cumulative line chart example
.. tab:: Regular line chart
.. image:: reporting/non-cumulative.png
:align: center
:alt: Regular line chart example

View File

@@ -1,5 +1,3 @@
:show-content:
=======
Payroll
=======

View File

@@ -13,4 +13,3 @@ Daily operations
operations/transfers_scratch
operations/barcode_nomenclature
operations/gs1_nomenclature
operations/gs1_usage

View File

@@ -2,24 +2,11 @@
GS1 barcode nomenclature
========================
.. _barcode/operations/gs1:
.. |AI| replace:: :abbr:`A.I. (Application Identifier)`
.. |GTIN| replace:: :abbr:`GTIN (Global Trade Item Number)`
.. |GTINs| replace:: :abbr:`GTINs (Global Trade Item Numbers)`
`GS1 nomenclature <https://www.gs1us.org/>`_ consolidates various product and supply chain data into
a single barcode. Odoo takes in `unique Global Trade Item Numbers
<https://www.gs1.org/standards/get-barcodes>`_ (GTIN), purchased by businesses, to enable global
shipping, sales, and eCommerce product listing.
Configure GS1 nomenclature to scan barcodes of sealed boxes and identify essential product
information, such as |GTIN|, lot number, quantity information, and more.
.. important::
|GTINs| are unique product identification that **must** be `purchased from GS1
<https://www.gs1.org/standards/get-barcodes>`_ to use GS1 barcodes.
`GS1 nomenclature <https://www.gs1us.org/>`_ consolidates multiple pieces of information in a single
barcode. Each piece needs to follow a specific barcode pattern—which is a defined format of numbers,
letters, special characters, and character length—to ensure proper interpretation of the barcode. By
scanning the barcode on an unopened box, GS1 nomenclature can identify the product, lot number,
number of units contained, and more.
.. seealso::
- `All GS1 barcodes <https://www.gs1.org/standards/barcodes/application-identifiers>`_
@@ -38,74 +25,233 @@ barcode nomenclature options.
.. image:: gs1_nomenclature/setup-gs1-nomenclature.png
:align: center
:alt: Choose GS1 from dropdown and click the external link to see the list of GS1 rules.
:alt: Choose GS1 from dropdown and click the internal link to see the list of GS1 rules.
The list of GS1 *rules* and *barcode patterns* Odoo supports by default is accessible by clicking
the :guilabel:`➡️ (arrow)` icon to the right of the :guilabel:`Barcode Nomenclature` selection.
To view and edit a list of GS1 *rules* and *barcode patterns* Odoo supports by default, click the
:guilabel:`➡️ (External link)` icon to the right of the :guilabel:`Barcode Nomenclature` selection.
In the :guilabel:`Open: Nomenclature` pop-up table, view and edit the GS1 :guilabel:`Rule Names`
available in Odoo. The table contains all the information that can be condensed with a GS1 barcode,
along with the corresponding :guilabel:`Barcode Pattern`.
Opening the pop-up table provides an editable view of GS1 :guilabel:`Rule Names` available in Odoo.
The table contains all the information that can be condensed with a GS1 barcode, along with the
corresponding :guilabel:`Barcode Pattern`.
.. tip::
After setting GS1 as the barcode nomenclature, the :menuselection:`Barcode Nomenclatures`
settings can also be accessed by a hidden menu that's discoverable after enabling :ref:`developer
mode <developer-mode>`. Once enabled, navigate to the :menuselection:`Inventory app -->
Configuration --> Barcode Nomenclatures` menu and finally, select :guilabel:`Default GS1
Nomenclature`.
After setting GS1 as the barcode nomenclature, :menuselection:`Barcode Nomenclatures` can also be
accessed by first enabling :ref:`developer mode <developer-mode>`. Navigate to
:menuselection:`Inventory app --> Configuration --> Barcode Nomenclatures` and finally, select
:guilabel:`Default GS1 Nomenclature`.
.. _barcode/operations/create-GS1-barcode:
Use GS1 barcodes in Odoo
========================
Use GS1 barcode
===============
For product identification using GS1 barcodes in Odoo, businesses obtain a `unique GTIN
<https://www.gs1.org/standards/get-barcodes>`_ as an internationally distinct product identifier
purchased from GS1. This |GTIN| is combined with specific product details following GS1's designated
*barcode pattern*. The barcode pattern's arrangement of numbers and letters must adhere to GS1
conventions for accurate interpretation by global systems along the supply chain.
Every barcode starts with a 2-4 digit `application identifier
<https://www.gs1.org/standards/barcodes/application-identifiers>`_ (A.I.). This required prefix
universally indicates what kind of information the barcode contains. Odoo follows GS1 rules for
identifying information, as detailed in the :ref:`default GS1 rules list
<barcode/operations/default-gs1-nomenclature-list>`. Including the relevant |AI| from the list
enables Odoo to correctly interpret GS1 barcodes. While most barcode patterns have a fixed length
requirement, certain ones, such as lots and serial numbers, have flexible length.
To build GS1 barcodes in Odoo, combine multiple pieces of information using the specified barcode
pattern. The `application identifier
<https://www.gs1.org/standards/barcodes/application-identifiers>`_ (A.I.) serves as the universal
prefix for GS1 for barcode identification. Odoo uses regular expressions to describe barcode
patterns concisely. Each barcode pattern begins with a required 2-4 digit :abbr:`A.I. (application
identifier)`, which corresponds to the rule defined in the system's :ref:`barcode nomenclature list
<barcode/operations/set-up-barcode-nomenclature>`. By including the appropriate :abbr:`A.I.
(application identifier)` from the list, Odoo can accurately interpret GS1 barcodes. While most
barcode patterns have a flexible length, some specific patterns, such as barcodes for dates, have
defined length requirements.
.. tip::
For flexible-length barcode patterns not placed at the end of the GS1 barcode, use the FNC1
separator (`\\x1D`) to end the barcode.
Example: The barcode pattern for lot numbers is 20 characters long. Instead of creating a
20-character lot number barcode, like `LOT00000000000000001`, use the FNC1 separator to make it
shorter: `LOT001\x1D`.
Use the FNC1 separator (`\x1D`) to end the barcode without needing to reach the maximum character
length.
Refer to the :ref:`GS1 nomenclature list <barcode/operations/default-gs1-nomenclature-list>` to see
a comprehensive list of all barcode patterns and rules to follow. Otherwise, refer to :ref:`this
GS1 usage doc <barcode/operations/gs1_usage>` for specific examples of combining |GTIN| to product
information and configuring the workflow.
a comprehensive list of all barcode patterns and rules to follow. Otherwise, the following section
contains examples of how to generate a barcode for common items in a warehouse.
Product + quantity + lot
------------------------
To build a GS1 barcode for a box that contains a product, number of units in it, and the lot number,
the following barcode patterns are used:
+------------+--------------------------+------+----------------------------------+------------------------------------------+
| Name | Rule Name | A.I. | Barcode Pattern | Field in Odoo |
+============+==========================+======+==================================+==========================================+
| Product | Global Trade Item Number | 01 | (01)(\\d{14}) | :guilabel:`Barcode` field on product form|
| | (GTIN) | | | |
+------------+--------------------------+------+----------------------------------+------------------------------------------+
| Quantity | Variable count of items | 30 | (30)(\\d{0,8}) | :guilabel:`Units` field on transfer form |
+------------+--------------------------+------+----------------------------------+------------------------------------------+
| Lot Number | Batch or lot number | 10 | (10)([!"%-/0-9:-?A-Z_a-z]{0,20}) | :guilabel:`Lot` on Detailed Operations |
| | | | | pop-up |
+------------+--------------------------+------+----------------------------------+------------------------------------------+
.. _barcode/operations/lot-setup:
Configuration
~~~~~~~~~~~~~
To track products using lots, first enable the :ref:`Lots and Serial Numbers
<inventory/management/track_products_by_lots>` feature. To do so, navigate to
:menuselection:`Inventory app --> Configuration --> Settings`. Next, under the
:guilabel:`Traceability` heading, check the box for :guilabel:`Lots & Serial Numbers`.
Then, set up the product barcode by navigating to the intended product form in
:menuselection:`Inventory app --> Products --> Products` and selecting the product. On the product
form, click :guilabel:`Edit`. Then, in the :guilabel:`General Information` tab, fill in the
:guilabel:`Barcode` field with the 14-digit `Global Trade Item Number (GTIN)
<https://www.gs1.org/standards/get-barcodes>`_, which is a universal and unique identifying number
from GS1.
.. important::
On the product form, omit the :abbr:`A.I. (application identifier)` `01` for GTIN product barcode
pattern, as it is only used to encode multiple barcodes into a single barcode that contains
detailed information about the package contents.
.. example::
To create a barcode for the product, `Fuji Apple`, enter the 14-digit GTIN `12345678901231` in
the :guilabel:`Barcode` field on the product form.
.. image:: gs1_nomenclature/barcode-field.png
:align: center
:alt: Enter 14-digit GTIN into the Barcode field on product form.
.. tip::
It is also possible to view a list of all products and barcodes. To access this list, go to
:menuselection:`Inventory --> Configuration --> Settings`. Under the :guilabel:`Barcode` heading,
click on the :guilabel:`Configure Product Barcodes` button under the :guilabel:`Barcode Scanner`
section. Enter the 14-digit GTIN into the :guilabel:`Barcode` column, then click
:guilabel:`Save`.
.. image:: gs1_nomenclature/product-barcodes-page.png
:align: center
:alt: View the Product Barcodes page from inventory settings.
.. _barcode/operations/lot-setup-on-product:
Next, enable lots and serial number tracking on the product. Select the :guilabel:`Inventory` tab on
the product form. Under :guilabel:`Tracking`, choose the :guilabel:`By Lots` radio button.
.. image:: gs1_nomenclature/track-by-lots.png
:align: center
:alt: Enable product tracking by lots in the "Inventory" tab of the product form.
Scan barcode on receipt
~~~~~~~~~~~~~~~~~~~~~~~
To ensure accurate lot interpretation in Odoo on product barcodes scanned during a receipt
operation, navigate to the :menuselection:`Barcode` app to manage the :ref:`receipt picking process
<barcode/operations/scan-received-products>`.
From the :guilabel:`Barcode Scanning` dashboard, click the :guilabel:`Operations` button, then the
:guilabel:`Receipts` button to view the list of vendor receptions to process. Receipts generated
from :abbr:`POs (Purchase Orders)` are listed, but new receipt operations can also be created
directly through the :menuselection:`Barcode` app using the :guilabel:`Create` button.
On the list of receipts, click on the warehouse operation (`WH/IN`) and scan product barcodes and
lot numbers with a barcode scanner. The scanned product then appears on the list. Use the
:guilabel:`✏️ (pencil)` button to open a window and manually enter quantities for specific lot
numbers.
.. example::
After placing a :abbr:`PO (Purchase Order)` for 50 apples, navigate to the associated receipt.
Scan the product barcode, and Odoo will prompt for the lot number.
.. image:: gs1_nomenclature/receive-50-apples.png
:align: center
:alt: Scan the barcode for a product on the reception picking page in the *Barcode* app.
Scan the lot number to process 1 of 50 apples. To avoid scanning 49 remaining barcodes, click
the :guilabel:`✏️ (pencil)` button next to the desired lot number.
.. image:: gs1_nomenclature/scan-apple-lot-number.png
:align: center
:alt: Scan lot number and click the pencil to edit quantities.
Doing so opens a mobile-friendly keypad page to specify received quantities. Use the keypad to
specify the :guilabel:`Units` for the lot number. When finished, click :guilabel:`Confirm`.
.. image:: gs1_nomenclature/edit-lot-quantities.png
:align: center
:alt: Change scanned quantities using pencil button.
Repeat this process to specify additional lot numbers and quantities in this receipt. Once the
:guilabel:`Units` are all accounted for, finish the reception by clicking the :guilabel:`Validate`
button.
Alternatively, scan the barcode containing the product, lot number, and quantity to complete the
receipt operation in fewer steps.
Product + non-unit quantity
---------------------------
To build a GS1 barcode that contains products measured in a non-unit quantity, like kilograms, for
example, the following barcode patterns are used:
+-------------+--------------------------+----------+--------------------+----------------------------+
| Name | Rule Name | A.I. | Barcode Pattern | Field in Odoo |
+=============+==========================+==========+====================+============================+
| Product | Global Trade Item Number | 01 | (01)(\\d{14}) | :guilabel:`Barcode` field |
| | (GTIN) | | | on product form |
+-------------+--------------------------+----------+--------------------+----------------------------+
| Quantity in | Variable count of items | 310[0-5] | (310[0-5])(\\d{6}) | :guilabel:`Units` field on |
| kilograms | | | | transfer form |
+-------------+--------------------------+----------+--------------------+----------------------------+
Scan barcode on receipt
~~~~~~~~~~~~~~~~~~~~~~~
To confirm that quantities are correctly interpreted in Odoo, place an order in the *Purchase* app
using the appropriate unit of measure (:guilabel:`UoM`) for the quantity of products to be
purchased.
.. seealso::
- :ref:`Lots workflow <barcode/operations/gs1-lots>`
- :ref:`Non-unit quantities workflow <barcode/operations/quantity-ex>`
:ref:`Simplify vendor unit conversions with UoMs <inventory/management/uom-example>`
After the order is placed, navigate to the :menuselection:`Barcode` app to :ref:`receive the vendor
shipment <barcode/operations/scan-received-products>`.
.. example::
On the receipt in the *Barcode* app, receive an order for `52.1 kg` of peaches by scanning the
barcode. If `52.1 / 52.1` :guilabel:`kg` appears on the page, this means the reception was
processed without issue. Finally, press :guilabel:`Validate`.
Note: the :abbr:`A.I. (application identifier)` for kilograms, `310` + `1`, was used to represent
`52.1` kg as a barcode: `000521`. This is because the `1` represents how many digits from the
right to place the decimal point.
.. image:: gs1_nomenclature/scan-barcode-peaches.png
:align: center
:alt: Scan barcode screen for a reception operation in the Barcode app.
For additional verification purposes, the quantities of received products are also recorded on the
:guilabel:`Product Moves` report, accessible by navigating to :menuselection:`Inventory app -->
Reporting --> Product Moves`.
The items on the :guilabel:`Product Moves` report are grouped by product by default. To confirm the
received quantities, click on a product line to open its collapsible drop-down menu, which displays
a list of *stock move lines* for the product. The latest stock move matches the warehouse reception
reference number (e.g. `WH/IN/00013`) and quantity processed in the barcode scan, demonstrating that
the records processed in the *Barcode* app were properly stored in *Inventory*.
.. image:: gs1_nomenclature/stock-moves-peach.png
:align: center
:alt: Reception stock move record for 52.1 kg of peaches.
.. _barcode/operations/create-new-rules:
Create rules
------------
GS1 rules are a specific format of information contained in the barcode, beginning with an |AI| and
containing a defined length of characters. Scanning GS1 barcodes from the :ref:`default GS1 list
<barcode/operations/default-gs1-nomenclature-list>` auto-fills corresponding data in the Odoo
database.
If a supplier uses a GS1 barcode with a field not supported by Odoo's :ref:`default GS1 list
<barcode/operations/default-gs1-nomenclature-list>`, Odoo will fail to interpret the entire barcode.
To ensure the complete reading of the barcode, it is necessary to add the missing barcode to Odoo's
list.
Adding GS1 barcode rules in Odoo ensures accurate interpretation of unique, non-standard GS1
formats.
.. important::
While the new field will be read, the information won't link to an existing field in Odoo without
developer customizations. However, adding new rules is still useful to ensure the rest of the
fields in the barcode are interpreted correctly.
To do so, begin by turning on :ref:`developer mode <developer-mode>` and navigating to the
:guilabel:`Barcode Nomenclatures` list in :menuselection:`Inventory app --> Configuration -->
Barcode Nomenclatures`. Then, select the :guilabel:`Default GS1 Nomenclature` list item.
Begin by turning on :ref:`developer mode <developer-mode>` and navigating to the :guilabel:`Barcode
Nomenclatures` list in :menuselection:`Inventory app --> Configuration --> Barcode Nomenclatures`.
Then, select the :guilabel:`Default GS1 Nomenclature` list item.
On the :guilabel:`Default GS1 Nomenclature` page, select :guilabel:`Add a line` at the bottom of the
table, which opens a window to create a new rule. The :guilabel:`Rule Name` field is used internally
@@ -143,23 +289,6 @@ not working as expected:
the barcode nomenclature for Odoo to read the barcode. :ref:`This section
<barcode/operations/create-new-rules>` details how to add new rules in the barcode nomenclature.
#. Test barcodes containing multiple encoded fields, piece by piece, to figure out which field is
causing the issue.
.. example::
When testing a barcode containing the |GTIN|, lot number, and quantity, start by scanning the
|GTIN| alone. Then, test the |GTIN| with the lot number, and finally, try scanning the whole
barcode.
#. After diagnosing the encoded field is unknown, :ref:`add new rules
<barcode/operations/create-new-rules>` to Odoo's default list to recognize GS1 barcodes with
unique specifications.
.. important::
While the new field will be read, the information won't link to an existing field in Odoo
without developer customizations. However, adding new rules is necessary to ensure the rest of
the fields in the barcode are interpreted correctly.
.. _barcode/operations/default-gs1-nomenclature-list:
GS1 nomenclature list

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

View File

@@ -1,236 +0,0 @@
=================
GS1 barcode usage
=================
.. _barcode/operations/gs1_usage:
.. |AI| replace:: :abbr:`A.I. (Application Identifier)`
.. |GTIN| replace:: :abbr:`GTIN (Global Trade Item Number)`
GS1 barcodes provide a standardized format that barcode scanners can interpret. They encode
information in a :ref:`specific structure recognized globally <barcode/operations/gs1>`, allowing
scanners to understand and process supply chain data consistently.
Odoo *Barcode* interprets and prints GS1 barcodes, automating product identification and tracking
in warehouse operations such as receiving, picking, and shipping.
The following sections contain examples of how Odoo uses GS1 barcodes provided by the business to
identify common warehouse items and automate certain warehouse workflows.
.. important::
Odoo **does not** create GS1 barcodes. Businesses must purchase a unique Global Trade Item Number
(GTIN) from GS1. Then, they can combine their existing GS1 barcodes with product and supply chain
information (also provided by GS1) to create barcodes in Odoo.
.. seealso::
- `Purchase GTINs <https://www.gs1.org/standards/get-barcodes>`_
- :ref:`GS1 nomenclature <barcode/operations/gs1>`
.. _barcode/operations/gs1-lots:
Configure barcodes for product, quantity, and lots
==================================================
To build a GS1 barcode that contains information about a product, its quantities, and the lot
number, the following barcode patterns and Application Identifiers (A.I.) are used:
+------------+--------------------------+------+----------------------------------+------------------------------------------+
| Name | Rule Name | A.I. | Barcode Pattern | Field in Odoo |
+============+==========================+======+==================================+==========================================+
| Product | Global Trade Item Number | 01 | (01)(\\d{14}) | :guilabel:`Barcode` field on product form|
| | (GTIN) | | | |
+------------+--------------------------+------+----------------------------------+------------------------------------------+
| Quantity | Variable count of items | 30 | (30)(\\d{0,8}) | :guilabel:`Units` field on transfer form |
+------------+--------------------------+------+----------------------------------+------------------------------------------+
| Lot Number | Batch or lot number | 10 | (10)([!"%-/0-9:-?A-Z_a-z]{0,20}) | :guilabel:`Lot` on Detailed Operations |
| | | | | pop-up |
+------------+--------------------------+------+----------------------------------+------------------------------------------+
.. _barcode/operations/lot-setup:
Configuration
-------------
First, :ref:`enable product tracking using lots <inventory/management/track_products_by_lots>` by
navigating to :menuselection:`Inventory app --> Configuration --> Settings`, and checking the box
for :guilabel:`Lots & Serial Numbers` under the :guilabel:`Traceability` heading.
Then, set up the product barcode by navigating to the intended product form in
:menuselection:`Inventory app --> Products --> Products` and selecting the product. On the product
form, click :guilabel:`Edit`. Then, in the :guilabel:`General Information` tab, fill in the
:guilabel:`Barcode` field with the unique 14-digit `Global Trade Item Number (GTIN)
<https://www.gs1.org/standards/get-barcodes>`_, which is a universally recognized identifying number
that is provided by GS1.
.. important::
On the product form, omit the |AI| `01` for |GTIN| product barcode pattern, as it is only used to
encode multiple barcodes into a single barcode that contains detailed information about the
package contents.
.. example::
To record the GS1 barcode for the product, `Fuji Apple`, enter the 14-digit |GTIN|
`20611628936004` in the :guilabel:`Barcode` field on the product form.
.. image:: gs1_usage/barcode-field.png
:align: center
:alt: Enter 14-digit GTIN into the Barcode field on product form.
.. tip::
To view a list of *all* products and their corresponding barcodes in the Odoo database, navigate
to :menuselection:`Inventory app --> Configuration --> Settings`. Under the :guilabel:`Barcode`
heading, click on the :guilabel:`Configure Product Barcodes` button under the :guilabel:`Barcode
Scanner` section. Enter the 14-digit |GTIN| into the :guilabel:`Barcode` column, then click
:guilabel:`Save`.
.. image:: gs1_usage/product-barcodes-page.png
:align: center
:alt: View the Product Barcodes page from inventory settings.
.. _barcode/operations/lot-setup-on-product:
After activating tracking by lots and serial numbers from the settings page, specify that this
feature is to be applied on each product by navigating to the :guilabel:`Inventory` tab on the
product form. Under :guilabel:`Tracking`, choose the :guilabel:`By Lots` radio button.
.. image:: gs1_usage/track-by-lots.png
:align: center
:alt: Enable product tracking by lots in the "Inventory" tab of the product form.
Scan barcode on receipt
-----------------------
To ensure accurate lot interpretation in Odoo on product barcodes scanned during a receipt
operation, navigate to the :menuselection:`Barcode` app to manage the :ref:`receipt picking process
<barcode/operations/scan-received-products>`.
From the :guilabel:`Barcode Scanning` dashboard, click the :guilabel:`Operations` button, then the
:guilabel:`Receipts` button to view the list of vendor receipts to process. Receipts generated from
:abbr:`POs (Purchase Orders)` are listed, but new receipt operations can also be created directly
through the :menuselection:`Barcode` app using the :guilabel:`Create` button.
On the list of receipts, click on the warehouse operation (`WH/IN`) and scan product barcodes and
lot numbers with a barcode scanner. The scanned product then appears on the list. Use the
:guilabel:`✏️ (pencil)` button to open a window and manually enter quantities for specific lot
numbers.
.. example::
After placing a :abbr:`PO (Purchase Order)` for fifty apples, navigate to the associated receipt
in the *Barcode* app.
Scan the barcode containing the |GTIN|, quantity, and lot number. For testing with a barcode
scanner, below is an example barcode for the fifty Fuji apples in Lot 2.
.. list-table::
:widths: 50 50
:header-rows: 1
:stub-columns: 1
* - 50 Fuji apples in Lot0002
-
* - 2D Matrix
- .. image:: gs1_usage/fuji-apples-barcode.png
:alt: 2D matrix of GS1 barcode of 50 fuji apples with an assigned lot number.
* - |AI| (product)
- 01
* - GS1 Barcode (product)
- 20611628936004
* - |AI| (quantity)
- 30
* - GS1 Barcode (quantity)
- 00000050
* - |AI| (lot)
- 10
* - GS1 Barcode (lot #)
- LOT0002
* - Full GS1 barcode
- 01206116289360043 000000050 10LOT0002
:ref:`If the configuration is correct <barcode/operations/troubleshooting>`, `50/50`
:guilabel:`Units` processed will be displayed and the :guilabel:`Validate` button turns green.
Click the :guilabel:`Validate` button to complete the reception.
.. image:: gs1_usage/receive-50-apples.png
:align: center
:alt: Scan the barcode for a product on the reception picking page in the *Barcode* app.
.. _barcode/operations/quantity-ex:
Configure barcode for product and non-unit quantity
===================================================
To build a GS1 barcode that contains products measured in a non-unit quantity, like kilograms, for
example, the following barcode patterns are used:
+-------------+--------------------------+----------+--------------------+----------------------------+
| Name | Rule Name | A.I. | Barcode Pattern | Field in Odoo |
+=============+==========================+==========+====================+============================+
| Product | Global Trade Item Number | 01 | (01)(\\d{14}) | :guilabel:`Barcode` field |
| | (GTIN) | | | on product form |
+-------------+--------------------------+----------+--------------------+----------------------------+
| Quantity in | Variable count of items | 310[0-5] | (310[0-5])(\\d{6}) | :guilabel:`Units` field on |
| kilograms | | | | transfer form |
+-------------+--------------------------+----------+--------------------+----------------------------+
Scan barcode on receipt
-----------------------
To confirm that quantities are correctly interpreted in Odoo, place an order in the *Purchase* app
using the appropriate unit of measure (:guilabel:`UoM`) for the quantity of products to be
purchased.
.. seealso::
:ref:`Simplify vendor unit conversions with UoMs <inventory/management/uom-example>`
After the order is placed, navigate to the :menuselection:`Barcode` app to :ref:`receive the vendor
shipment <barcode/operations/scan-received-products>`.
.. example::
On the receipt in the *Barcode* app, receive an order for `52.1 kg` of peaches by scanning the
barcode containing the |GTIN| and quantity of peaches in kilograms.
.. list-table::
:widths: 50 50
:header-rows: 1
:stub-columns: 1
* - 52.1 kg of Peaches
-
* - 2D Matrix
- .. image:: gs1_usage/peaches-barcode.png
:alt: 2D matrix of GS1 barcode of 52.1 kg of peaches.
* - |AI| (product)
- 01
* - GS1 Barcode (product)
- 00614141000012
* - |AI| (kg, 1 decimal point)
- 3101
* - GS1 Barcode (quantity)
- 000521
* - Full GS1 barcode
- 0100614141000012 3101000521
:ref:`If the configuration is correct <barcode/operations/troubleshooting>`, `52.1 / 52.1`
:guilabel:`kg` will be displayed and the :guilabel:`Validate` button turns green. Finally, press
:guilabel:`Validate` to complete the validation.
.. image:: gs1_usage/scan-barcode-peaches.png
:align: center
:alt: Scan barcode screen for a reception operation in the Barcode app.
Verify product moves
====================
For additional verification, the quantities of received products are also recorded on the
:guilabel:`Product Moves` report, accessible by navigating to :menuselection:`Inventory app -->
Reporting --> Product Moves`.
The items on the :guilabel:`Product Moves` report are grouped by product by default. To confirm the
received quantities, click on a product line to open its collapsible drop-down menu, which displays
a list of *stock move lines* for the product. The latest stock move matches the warehouse reception
reference number (e.g. `WH/IN/00013`) and quantity processed in the barcode scan, demonstrating that
the records processed in the *Barcode* app were properly stored in *Inventory*.
.. image:: gs1_usage/stock-moves-peach.png
:align: center
:alt: Reception stock move record for 52.1 kg of peaches.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

View File

@@ -4,84 +4,64 @@ Set up your barcode scanner
.. _barcode/setup/hardware:
Follow this guide to choose and set up a barcode scanner compatible with Odoo's *Inventory* and
*Barcode* apps.
Getting started with barcode scanning in Odoo is fairly easy. Yet, a
good user experience relies on an appropriate hardware setup. This guide
will help you through the task of choosing and configuring the barcode
scanner.
.. figure:: hardware/barcode-scanner.png
:align: center
:alt: An image of an example barcode scanner.
Find the barcode scanner that suits your needs
==============================================
An image of an example barcode scanner.
The 3 recommended type of barcode scanners to work with the Odoo
**Inventory** and **Barcode Scanning** apps are the **USB scanner**, **the bluetooth
scanner** and the **mobile computer scanner**.
Scanner types
=============
.. image:: hardware/hardware02.png
:align: center
Before setting up a barcode scanner, it is important to determine which scanner type best meets the
needs of the business. There are three main types, each with their own benefits and use cases:
- If you scan products at a computer location, the **USB scanner** is the
way to go. Simply plug it in the computer to start scanning. Just
make sure when you buy it that the scanner is compatible with
your keyboard layout or can be configured to be so.
- **USB scanners** are connected to a computer, and are suitable for businesses that scan products
at a fixed location, like at the checkout in a grocery store. Ensure the chosen USB scanner is
compatible with the keyboard layout of the computer.
- The **bluetooth scanner** can be paired with a smartphone or a tablet and
is a good choice if you want to be mobile but don't need a big
investment. An approach is to log in Odoo on you smartphone, pair
the bluetooth scanner with the smartphone and work in the
warehouse with the possibility to check your smartphone
from time to time and use the software 'manually'.
- **Bluetooth scanners** pair with a smartphone or tablet, making them an ideal cost-effective and
portable barcode scanner option. In this scenario, Odoo is installed on the smartphone, allowing
warehouse operators to handle operations, and check stock directly through their mobile devices.
- For heavy use, the **mobile computer scanner** is the handiest solution.
It consists of a small computer with a built-in barcode scanner.
This one can turn out to be a very productive solution, however
you need to make sure that is is capable of running Odoo smoothly.
The most recent models using Android + Google Chrome or Windows +
Internet Explorer Mobile should do the job. However, due to the
variety of models and configurations on the market, it is
essential to test it first.
- **Mobile computer scanners** are mobile devices with a built-in barcode scanner. First, ensure the
device can run the Odoo mobile app properly. Recent models that use Android OS with the Google
Chrome browser, or Windows OS with Microsoft Edge, should work. However, testing is crucial due to
the variety of available models and configurations.
.. seealso::
`Compatible hardware with Odoo Inventory <https://www.odoo.com/app/inventory-hardware>`_
Configuration
=============
When setting up the barcode scanner, make sure the following configurations are correct so the
scanner can properly interpret barcodes with Odoo.
Configure your barcode scanner
==============================
Keyboard layout
---------------
When using a USB barcode scanner, match its keyboard layout with the operating system's layout for
proper interpretation of characters. Generally, the scanning mode should be set to accept a USB
keyboard (HID), with the language set based on the keyboard that is in use.
.. image:: hardware/hardware01.png
:align: center
To configure the keyboard layout for a **Zebra** scanner, scan the keyboard wedge barcode for the
desired language in the scanner's user manual.
.. figure:: hardware/keyboard-barcode.png
:alt: Example of a user manual for keyboard layout.
Examples of keyboard language settings in the Zebra scanner user manual.
An USB barcode scanner needs to be configured to use the same keyboard
layout as your operating system. Otherwise, your scanner won't translate
characters correctly (replacing a 'A' with a 'Q' for example). Most
scanners are configured by scanning the appropriate barcode in the user
manual.
Automatic carriage return
-------------------------
Odoo has a default 50-millisecond delay between scans to prevent accidental double scanning. To
synchronize with the barcode scanner, set it to include a *carriage return* (:dfn:`character like
the "Enter" key on a keyboard`) after each scan. Odoo interprets the carriage return as the end of
the barcode input; so Odoo accepts the scan, and waits for the next one.
Typically, on the scanner, a carriage return is included by default. Ensure it is set by scanning a
specific barcode in the user manual, like `CR suffix ON` or `Apply Enter for suffix`.
Zebra scanner
-------------
When using Zebra scanners, ensure the following keystroke configurations are set to prevent errors.
Begin on the Zebra scanner's home screen, and select the :guilabel:`DataWedge` app (the icon for the
app is a light blue barcode). On the :guilabel:`DataWedge Profiles` page, select the profile option
to access the Zebra scanner's settings.
Scroll down to the :guilabel:`Keyboard Output` option, and ensure the :guilabel:`Enable/disable
keystroke output` option is :guilabel:`Enabled`.
.. image:: hardware/enable-keystroke.png
:align: center
:alt: Show keystroke option in the Zebra scanner's DataWedge app.
Now, go back to the :guilabel:`Profile` options page, and select :guilabel:`Key event options`.
Here, ensure the :guilabel:`Send Characters as Events` option is checked.
By default, Odoo has a 50 milliseconds delay between each successive
scan (it helps avoid accidental double scanning). If you want to
suppress this delay, you can configure your scanner to insert a carriage
return at the end of each barcode. This is usually the default
configuration and can be explicitly configured by scanning a specific
barcode in the user manual ('CR suffix ON', 'Apply Enter for suffix',
etc.).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

View File

@@ -43,8 +43,6 @@ directly at creation on the product form.
the template product. Otherwise, you wont be able to differentiate
them.
.. _barcode/setup/location:
Set Locations Barcodes
======================

View File

@@ -11,4 +11,3 @@ Miscellaneous Operations
misc/owned_stock
misc/batch_transfers
misc/wave_transfers
misc/cluster_picking

View File

@@ -2,8 +2,6 @@
Batch picking
=============
.. _inventory/misc/batch_picking:
*Batch picking* enables a single picker to handle multiple orders at once, reducing the time needed
to navigate to the same location in a warehouse.

View File

@@ -1,243 +0,0 @@
===============
Cluster picking
===============
.. _inventory/misc/cluster_picking:
.. |SO| replace:: :abbr:`SO (Sales Order)`
.. |SOS| replace:: :abbr:`SOs (Sales Orders)`
Cluster picking is an advanced order fulfillment approach derived from :ref:`batch picking
<inventory/misc/batch_picking>`.
In this strategy, pickers load a cart with multiple packages, each designated for a specific *sales
order* (SO). Then, the picker travels to each storage location, and places the products directly in
the package of the associated order.
This method is most efficient for medium-sized companies, with high order volumes, and relatively
few unique products, since the method eliminates the need for sorting products into packages for
customers after picking.
However, cluster picking does have some disadvantages. For instance, urgent orders cannot be
prioritized, and optimized batches must be manually created beforehand. As a result, the picking
process can lead to bottlenecks.
.. _inventory/misc/cluster_picking/example:
.. example::
#. |SO| 1 calls for one apple and orange
#. |SO| 2 calls for one apple and banana
#. |SO| 3 calls for one apple, orange, and banana
Apples are stored in Shelf A, oranges in Shelf B, and bananas in Shelf C.
To pick products for three orders at once, the cart is loaded with three empty packages.
Starting at Shelf A, the picker places apples into each package. Next, the picker navigates to
Shelf B, and places oranges in the packages designated for |SO| 1 and |SO| 3. Finally, the picker
pushes the cart to Shelf C, and loads packages for |SO| 2 and |SO| 3 with a banana, each.
With the packages for all three |SOS| packed, the picker pushes the cart to the output location,
where the packages are sealed and prepared for shipment.
.. image:: cluster_picking/cluster-example.png
:align: center
:alt: Show example of fulfilling sales orders 2 and 3 at once.
Configuration
=============
To enable cluster picking, begin by navigating to :menuselection:`Inventory app --> Configuration
--> Settings`. Under the :guilabel:`Operations` heading, activate the :guilabel:`Packages` and
:guilabel:`Batch Transfers` options.
.. image:: cluster_picking/configs.png
:align: center
:alt: Activate *Packages* and *Batch Transfers* features in the settings.
Since batch picking is used to optimize the *pick* operation in Odoo, the :guilabel:`Storage
Locations` and :guilabel:`Multi-Step Routes` options, under the :guilabel:`Warehouse` heading, must
also be checked on this settings page.
*Storage locations* allow products to be stored in specific locations they can be picked from, while
*multi-step routes* enable the picking operation itself.
When finished, click :guilabel:`Save`.
.. image:: cluster_picking/locations-routes-checkbox.png
:align: center
:alt: Enable *Storage Locations* and *Multi-Step Routes* Inventory > Configuration > Settings.
.. _inventory/misc/create-package:
Packages setup
--------------
After the :guilabel:`Packages` feature is enabled, navigate to :menuselection:`Inventory app -->
Products --> Packages`, and click the :guilabel:`New` button to create a new package.
On the new package form, the :guilabel:`Package Reference` is pre-filled with the next available
`PACK` number in the system. :guilabel:`Pack Date` is automatically set to the creation date of the
form.
For the :guilabel:`Package Use` field, the :guilabel:`Disposable Box` option should be selected if
the package is used for a shipping. Alternatively, the :guilabel:`Reusable Box` option should be
selected if the package is simply used as a method of grouping products from the same |SO| together
before they are moved to the intended shipping box at the output location.
.. seealso::
:ref:`Packages <inventory/management/packages>`
.. example::
A package intended for cluster picking is named `CLUSTER-PACK-3` for easy identification. For
this workflow, the products are directly packed using their intended shipping boxes, so
:guilabel:`Package Use` is set to :guilabel:`Disposable Box`.
.. image:: cluster_picking/cluster-package.png
:align: center
:alt: Create new package form.
Create cluster batch
====================
To see how cluster picking works in Odoo, navigate to the :menuselection:`Sales` app, and create
|SOS| that will be fulfilled together in the same batch. After confirming an |SO|, the
:guilabel:`Delivery` smart button becomes visible. Displayed inside the icon is a number
representing the amount of steps in the outgoing shipment process.
.. example::
Begin by creating three |SOS| for the apples, oranges, and bananas, as shown in the :ref:`example
above <inventory/misc/cluster_picking/example>`.
After confirming the |SO|, the :guilabel:`Delivery` smart button displays the number `2`,
indicating there are two operations to complete: `Pick` and `Delivery`.
.. image:: cluster_picking/create-sales-order.png
:align: center
:alt: Example sales order for an apple, orange, and banana.
With the |SOS| created, orders now must be grouped into batches. To do so, navigate to the
*Inventory* dashboard and select the operation type card, :guilabel:`Delivery Orders` or
:guilabel:`Pick` (whichever is the first operation in the delivery flow).
Doing so displays a filtered list of outgoing operations with the :guilabel:`Ready` status,
indicating that all the products in the |SO| are in stock.
.. note::
Cluster pick batches can be created for outgoing shipments in one, two, or three steps.
.. seealso::
- :ref:`Delivery in one step <inventory/receipts_delivery_one_step>`
- :ref:`Delivery in two steps <inventory/receipts_delivery_two_steps>`
- :ref:`Delivery in three steps <inventory/delivery_three_steps>`
Click the checkbox to the left of the corresponding outgoing operation to add them to the batch.
With the desired pickings selected, click the :guilabel:`⚙️ Actions (gear)` button, and select the
:guilabel:`Add to batch` option from the resulting drop-down menu.
.. example::
To create a cluster batch, as shown in the :ref:`example above
<inventory/misc/cluster_picking/example>`, in a warehouse configured with two-step outgoing
shipments, the following pick operations are selected:
- `WH/PICK/00007`: linked to |SO| 88 for one apple and orange.
- `WH/PICK/00008`: linked to |SO| 89 for one apple and banana.
- `WH/PICK/00009`: linked to |SO| 90 for one apple, orange, and banana.
.. image:: cluster_picking/select-picks.png
:align: center
:alt: Use *Add to batch* button, from the *Action* button's list.
Doing so opens an :guilabel:`Add to batch` pop-up window, wherein the employee
:guilabel:`Responsible` for the picking can be assigned.
Choose from the two options in the :guilabel:`Add to` field to either: add to :guilabel:`an existing
batch transfer`, or create :guilabel:`a new batch transfer`.
To create draft batch pickings to be confirmed at a later date, select the :guilabel:`Draft`
checkbox.
Conclude the process by clicking :guilabel:`Confirm`.
.. image:: cluster_picking/add-to-batch-window.png
:align: center
:alt: Show *Add to batch* window to create a batch transfer.
Process batches
===============
To process batches, navigate to :menuselection:`Inventory app --> Operations --> Batch Transfers`.
Click on a batch to select it.
In the :guilabel:`Detailed Operations` tab, products that are to be picked are grouped by location.
Under the :guilabel:`Source Package` or :guilabel:`Destination Package` field, enter the package
used for the picking.
.. note::
Use the :guilabel:`Source Package` field when the picking package is configured as *reusable* on
the :ref:`package form <inventory/misc/create-package>`. This means the products are temporarily
placed in a container during picking, before getting transferred to their final shipping box.
Alternatively, use the :guilabel:`Destination Package` field when the product is directly placed
in its *disposable* shipping box during picking.
.. example::
Process the cluster batch for the three orders of apples, oranges, and bananas :ref:`example
<inventory/misc/cluster_picking/example>` by assigning each picking to a dedicated package.
At the storage location for apples, `WH/Stock/Shelf A`, assign the apples in all three pickings
to one of the three disposable packages, `CLUSTER-PACK-1`, `CLUSTER-PACK-2`, or `CLUSTER-PACK-3`.
Record this in Odoo using the :guilabel:`Destination Package` field in the :guilabel:`Detailed
Operations` tab.
.. image:: cluster_picking/cluster-batch-example.png
:align: center
:alt: Example of processing cluster pickings in *Inventory*.
In Barcode
----------
To process cluster pickings directly from the *Barcode* app, select the :guilabel:`Batch Transfers`
button from the *Barcode* dashboard. Then, select the desired batch.
On the batch transfer screen, the products in the picking are grouped by location, and each line is
color-coded to associate products in the same picking together.
Then, follow the prompt to :guilabel:`Scan the source location` barcode for the storage location of
the first product. Then, scan the barcode for the product and package to process the transfer.
Repeat this for all products, and click the :guilabel:`Validate` button.
.. note::
To find the package barcode, navigate to :menuselection:`Inventory app --> Products -->
Packages`, select the desired package, click the :guilabel:`⚙️ (gear)` icon at the top of the
package form, and select the :guilabel:`Print` option.
Next, select one of the three print options to generate the package barcode from the
:guilabel:`Package Reference` field.
.. image:: cluster_picking/find-package-barcode.png
:align: center
:alt: Display where the package barcode can be generated.
.. example::
Begin processing the cluster picking by going to the first storage location, `Shelf A`, and
scanning the :ref:`location barcode <barcode/setup/location>`. Doing so highlights all the
pickings that need products from this particular location.
Scan the barcode for the apple, which highlights the picking (labeled in red) for the product
`Apple`, for the picking, `WH/PICK/00007`.
Then, scan the `CLUSTER-PACK-1` package barcode, and place the product in the designated package.
.. image:: cluster_picking/batch-barcode.png
:align: center
:alt: Example of cluster batch from the *Barcode* app.
.. tip::
After creating a batch transfer and assigning a package to a picking, Odoo suggests the specified
package by displaying the name *in italics* under the product name, ensuring pickers place
products into the correct boxes.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

View File

@@ -60,8 +60,6 @@ the :guilabel:`Unit of Measure`. Then, when the product is received by clicking
.. seealso::
:ref:`Use Different Units of Measure <inventory/management/products/units_of_measure>`
.. _inventory/management/packages:
Packages
========

View File

@@ -2,8 +2,6 @@
Integrating additional costs to products (landed costs)
=======================================================
.. _inventory/reporting/landed_costs:
The landed cost feature in Odoo allows the user to include additional costs (shipment, insurance,
customs duties, etc.) into the cost of the product.

View File

@@ -29,8 +29,6 @@ between locations in a company's inventory.
need to be periodically checked to ensure accuracy, and adjustments may be needed on an ongoing
basis depending on the needs and priorities of the business.
.. _inventory/inventory_valuation_config/accounting:
Types of accounting
-------------------
@@ -49,8 +47,6 @@ In *Continental* accounting, the cost of a good is reported as soon as a product
stock. Additionally, a single *Expense* account is used for both input and output accounts in
the balance sheet.
.. _inventory/inventory_valuation_config/costing_methods:
Costing methods
---------------
@@ -90,7 +86,8 @@ menu (e.g. :guilabel:`Standard`, :guilabel:`Average Cost (AVCO)`, or :guilabel:`
(FIFO)`) and switch the :guilabel:`Inventory Valuation` to :guilabel:`Automated`.
.. seealso::
:ref:`Using the inventory valuation<inventory/reporting/using_inventory_val>`
:doc:`Using the inventory valuation
</applications/inventory_and_mrp/inventory/management/reporting/using_inventory_valuation>`
.. note::
When choosing :guilabel:`Average Cost (AVCO)` as the :guilabel:`Costing Method`, changing the

View File

@@ -2,8 +2,6 @@
Using inventory valuation
=========================
.. _inventory/reporting/using_inventory_val:
*Inventory valuation* is a quintessential accounting procedure that calculates the value of on-hand
stock. Once determined, the inventory valuation amount is then incorporated into a company's overall
value.

View File

@@ -12,4 +12,3 @@ Warehouses
warehouses/warehouse_replenishment_transfer
warehouses/warehouses_locations
warehouses/create_a_second_warehouse
warehouses/use_locations

View File

@@ -1,59 +0,0 @@
=========
Locations
=========
A *location* is a specific space within a warehouse. This can be a shelf, room, aisle, etc. There
are three types of locations in Odoo:
- *Physical locations* are spaces within a warehouse owned by the user's company. These can be a an
area where items are stored like an aisle or shelf, or an area where operations take place, like
loading and unloading bays.
- *Partner locations* are the same as physical locations except that they exist within the warehouse
of a customer or vendor.
- *Virtual locations* are locations that do not exist physically, but where items that are not in
inventory can be placed. These can be items that have not yet entered inventory, like products
that are on the way to a warehouse, or items that are no longer in inventory due to loss or other
factors.
.. important::
In order to use locations, the :guilabel:`Storage Locations` setting must be enabled. To do so,
navigate to :menuselection:`Inventory --> Configuration --> Settings`, scroll down to the
:guilabel:`Warehouse` heading, and enable the :guilabel:`Storage Locations` checkbox.
Create a new location inside a warehouse
========================================
Starting from the :menuselection:`Inventory` app, select :menuselection:`Configuration --> Locations
--> Create`. The new location form can then be configured as follows:
- :guilabel:`Location Name`: the name that will be used to reference the location
- :guilabel:`Parent Location`: the location or warehouse that the new location exists within
- :guilabel:`Location Type`: choose the category that the location belongs to
- :guilabel:`Company`: the company that owns the warehouse that the location is inside of
- :guilabel:`Is a Scrap Location?`: check this box to allow for scrapped/damaged goods to be stored
in this location
- :guilabel:`Is a Return Location?`: check this box to allow products to be returned to this
location
- :guilabel:`Barcode`: the barcode number assigned to the location
- :guilabel:`Removal Strategy`: the :ref:`strategy <inventory/routes/strategies/removal>` for how
items should be taken from inventory
.. image:: use_locations/new-location-form.png
:align: center
:alt: The form for creating a new location.
Create location hierarchies
===========================
The *Parent Location* setting on the new location form allows for a location to exist within a
warehouse or another location. Every location can serve as a parent location, and every parent
location can have multiple locations within it, allowing for the creation of a virtually infinite
hierarchical structure.
.. example::
Location hierarchy could be organized so that a shelf is located within an aisle, which is
located within a room, which is located within the overall warehouse.
To create the location hierarchy in the example above, set the warehouse as the parent of the room,
the room as the parent of the aisle, and the aisle as the parent of the shelf. This can be adapted
to a hierarchy of any magnitude.

View File

@@ -1,376 +1,255 @@
=====================================
Removal strategies (FIFO, LIFO, FEFO)
=====================================
================================================================
What is a Removal Strategy (FIFO, LIFO, FEFO, Closest location)?
================================================================
.. _inventory/routes/strategies/removal:
For companies with warehouses, **removal strategies** determine which products are taken from the
warehouse, and when. Removal strategies are typically defined for specific picking operations. This
helps companies to select the best products, optimize the distance workers need to travel when
picking items for orders, and account for quality control, such as moving products with expiration
dates.
Usually, *Removal Strategies* are defined in picking operations to select the best products to
optimize the distance for the worker, for quality control purposes, or to first move the products
Usually, *Removal Strategies* are defined in picking operations to select the best products,
optimize the distance for the worker, for quality control purposes, or to first move products
with the closest expiration date.
When a product needs to be moved, Odoo finds available products that can be assigned to the
transfer. The way Odoo assigns these products depends on the :guilabel:`Removal Strategy` defined in
either the :guilabel:`Product Category` or the :guilabel:`Location` dashboards.
To change the :guilabel:`Removal Strategy`, go to :menuselection:`Inventory app --> Configuration
--> Locations` or :menuselection:`Product Categories`. Click on a :guilabel:`Location` or
:guilabel:`Product Category`, and then click :guilabel:`Edit`. Change the product category
:guilabel:`Force Removal Strategy` or the location :guilabel:`Removal Strategy` by clicking on the
drop-down menu and selecting the desired removal strategy. After selecting the new removal strategy,
click :guilabel:`Save`.
.. image:: removal/product-category-location.png
:align: center
:alt: Change the Force Removal Strategy for either the Product Categories or Locations.
When a product movement needs to be done, Odoo finds available products that can be assigned to
the transfer. The way Odoo assigns these products depends on the *Removal Strategy* defined in
the *Product Category* or on the *Location*.
What happens inside the warehouse?
==================================
Most warehouses share the same important areas: receiving docks and sorting areas, storage
locations, picking and packing areas, and shipping/loading docks. While all products entering or
leaving the warehouse might go through each of these locations at some point, removal strategies can
have an effect on which products are taken, from where, and when.
Imagine a generic warehouse plan, with receiving docks and areas, storage locations, picking and
packing areas, and shipping docks. All products go through all these locations, but some rules,
such as removal strategies, can have an effect on which products are taken for the pickings.
In this example below, vendor trucks unload pallets of goods at the receiving docks. Then, operators
scan the products in the receiving area, with the reception date and expiration date. After that,
products are stored in their respective storage locations.
.. image:: removal/empty-dock.png
:align: center
:alt: Empty stock waiting for deliveries at the docks.
.. note::
Not all products have expiration dates, but in this example, expiration dates apply.
Here, vendor trucks unload pallets of goods at the docks. Then, operators scan the products in the
receiving area with the reception date and, if the product has an expiration date, the expiration
date. After that, products are stored in their respective locations.
.. image:: removal/entering-stocks.png
:align: center
:alt: Products entering stock via the receiving area.
In Odoo, receive products by navigating to the :menuselection:`Inventory` application, and in the
kanban view, click on either the :guilabel:`Receipts` heading or :guilabel:`# TO PROCESS` button.
On the :guilabel:`Receipts` dashboard, find and click on the individual receipt which will open the
warehouse intake form. Click :guilabel:`Edit`, and then enter the received quantity in the
:guilabel:`Done` column. To finish, :guilabel:`Validate` to receive the products and register them
in the Odoo database.
.. tip::
Receiving products can also be done within the Odoo *Barcode* application. If using the
*Barcode* app, scan the product(s), update the quantity, and finally, click :guilabel:`Validate`.
After products are received in Odoo, the products can then be moved to their respective storage
locations.
Continuing with the same example, below, imagine several sales orders are made for the products
received earlier, that use expiration dates. In this example, the products weren't received on the
same day, and they don't have the same expiration date. In this situation, logically, sending
products with the closest expiration date is preferred, instead of products received first or last.
Using the chosen removal strategy configured for those products (in this example, :ref:`FEFO
<routes/FEFO>`), Odoo generates a transfer for the products with the soonest expiration date to the
picking area, then the packing area, and finally, to the shipping docks for delivery to the
customer.
Next, several orders for the same product are made, but in this example, the goods weren't received
on the same day and they don't have the same expiration date. In that situation, logically, sending
those with the closest date first is preferred. Depending on the chosen removal strategy, Odoo
generates a transfer with the products that fit the settings the best.
.. image:: removal/packing-products.png
:align: center
:alt: Products being packed at the packing area for delivery, taking the expiration dates into
:alt: :alt: Products being packed at the packing area for delivery, taking expiration dates into
account.
.. note::
To pick for delivery, the product's lot/serial number can be found on the transfer form. To learn
more about picking and shipping, refer to either the :ref:`Two-step delivery
<inventory/receipts_delivery_two_steps>` or :ref:`Three-step delivery
<inventory/delivery_three_steps>` documentation.
To pick for delivery, the product's lot/serial number can be found on the transfer form.
How each removal strategy works
===============================
Removal strategies determine which products are taken from the warehouse when orders are confirmed.
How does it work?
=================
First In, First Out (FIFO)
--------------------------
When using a :guilabel:`First In, First Out (FIFO)` strategy, demand for a product triggers a
removal rule, which requests a transfer for the lot/serial number that entered the stock first (and
therefore, has been in stock for the longest time).
When using a *First In, First Out* (FIFO) strategy, a demand for some products triggers a removal
rule, which requests a transfer for the lot/serial number that has entered the stock first.
For example, imagine there are three lots of nails in the warehouse, and have the corresponding lot
numbers: `00001`, `00002`, `00003`. Each lot has five boxes of nails in it.
For example, imagine there are three lots of nails in the warehouse. Those three have the following
lot numbers: :guilabel:`00001`, :guilabel:`00002`, :guilabel:`00003`, each with five boxes of nails
in it.
Lot `00001` entered the stock on May 23, lot `00002` on May 25, and lot `00003` on June 1. A
customer orders six boxes on June 11.
:guilabel:`00001` entered the stock on the 23rd of May, :guilabel:`00002` on the 25th of
May, and :guilabel:`00003` on the 1st of June. A customer orders six boxes on the 11th of June.
With the :abbr:`FIFO (First In, First Out)` removal strategy selected, a transfer is requested for
the five boxes of :guilabel:`00001` and one of the boxes in :guilabel:`00002`, because
:guilabel:`00001` entered the stock before the others. The box from :guilabel:`00002` is taken next
because it has the oldest reception date after :guilabel:`00001`.
Using the :abbr:`FIFO (First In, First Out)` removal strategy, a transfer request will pick the five
boxes from lot `00001` first, and then from the boxes in lot `00002`, since lot `00001` entered the
stock first. The box from lot `00002` is taken next because it has the oldest receipt date after lot
`00001`.
.. image:: removal/fifo-nails-picking.png
:align: center
:alt: The detailed operations for the transfer shows the nail lots to be removed.
So, for every order of a product with the :abbr:`FIFO (First In, First Out)` strategy selected,
Odoo requests a transfer for the products that have been in the stock for the longest period.
Last In, First Out (LIFO)
-------------------------
Similar to the :abbr:`FIFO (First In, First Out)` method, the :guilabel:`Last In, First Out (LIFO)`
removal strategy moves products based on the date they entered a warehouse's stock. Instead of
removing the oldest stock on-hand, however, it targets the **newest** stock on-hand for removal.
Similar to :abbr:`FIFO (First In, First Out)`, the *Last In, First Out* (LIFO) strategy moves
products based on the date they entered the stock. Here, a demand for some products triggers a
removal rule that requests a transfer for the lot/serial number that has entered the stock most
recently.
Every time an order for products with the :abbr:`LIFO (Last In, First Out)` method is placed, a
transfer is created for the lot/serial number that has most recently entered the stock (the **last**
lot/serial number that entered the warehouse's inventory).
For example, imagine there are three lots of screws in the warehouse. Those three have the following
numbers: :guilabel:`10001`, :guilabel:`10002`, and :guilabel:`10003`, each with 10 boxes of screws
in it.
.. warning::
In many countries, the :abbr:`LIFO (Last In, First Out)` removal strategy in banned, since it can
potentially result in old, expired, or obsolete products being delivered to customers.
:guilabel:`10001` entered the stock on the 1st of June, :guilabel:`10002` on the 3rd of June, and
:guilabel:`10003` on the 6th of June. A customer orders seven boxes on the 8th of June. With the
:abbr:`LIFO (Last In, First Out)` removal strategy selected, a transfer is requested for seven
boxes of :guilabel:`10003` because that lot is the last one to have entered the stock.
For example, imagine there are three lots of boxes of screws in the warehouse, and have the
corresponding lot numbers: `10001`, `10002`, and `10003`, each with 10 boxes of screws per lot.
Lot `10001` entered the stock on June 1, lot `10002` on June 3, and lot `10003` on June 6. A
customer orders seven boxes on June 8.
Using the :abbr:`LIFO (Last In, First Out)` removal strategy, a transfer is requested for seven
boxes of screws from lot `10003` because that lot is the last one to have entered the stock.
.. image:: removal/lifo-nails.png
:align: center
:alt: The detailed operations shows which lots are being selected for the picking.
First Expired, First Out (FEFO)
-------------------------------
While the :abbr:`FIFO (First In, First Out)` and :abbr:`LIFO (Last In, First Out)` methods target
products for removal based on date of entry into the warehouse, the :guilabel:`First Expired, First
Out (FEFO)` method targets products for removal based on their assigned expiration dates.
Using the :abbr:`FEFO (First Expired, First Out)` removal strategy, every sales order that includes
products with this removal strategy assigned ensures that transfers are requested for products with
the expiration date soonest to the order date.
As an example, imagine there are three lots of six-egg boxes. Those three lots have the following
lot numbers: `20001`, `20002`, and `20003`, each with five boxes in it.
Lot `20001` entered the stock on July 1 and expires on July 15, lot `20002` entered on July 2 and
expires on July 14, and lot `20003` entered on July 3 and expires on July 21. A customer orders six
boxes on July 5.
Using the :abbr:`FEFO (First Expired, First Out)` method, a transfer is requested for the five boxes
from lot `20002` and one from lot `20001`. All the boxes in lot `20002` are transferred because they
have the earliest expiration date. The transfer also requests one box from lot `20001` because it
has the next closest expiration date after lot `20002`.
.. image:: removal/egg-lots-removal.png
:align: center
:alt: The detailed operations for the transfer shows the lots to be removed.
Using removal strategies
========================
To differentiate some units of products from others, the units need to be tracked, either by
:guilabel:`Lot` or by :guilabel:`Serial Number`. To do so, go to :menuselection:`Inventory -->
Configuration --> Settings`. Then, activate the :guilabel:`Storage Locations`, :guilabel:`Multi-Step
Routes`, and :guilabel:`Lots & Serial Numbers` settings. Click :guilabel:`Save` to save changes.
.. image:: removal/traceability.png
:align: center
:alt: :alt: Traceability settings.
.. image:: removal/warehouse-settings.png
:align: center
:alt: :alt: Warehouse settings.
Basically, for every order of a product with the :abbr:`LIFO (Last In, First Out)` strategy used,
a transfer for the last lot to have entered the stock is requested.
.. note::
To use the :abbr:`FEFO (First Expired, First Out)` removal strategy, the :guilabel:`Expiration
Dates` setting needs to be activated as well. To enable this, go to :menuselection:`Inventory app
--> Configuration --> Settings`, scroll down to the :guilabel:`Traceability` section, and click
the checkbox next to :guilabel:`Expiration Dates`. Remember to click :guilabel:`Save` to save all
changes.
The :abbr:`LIFO (Last In, First Out)` strategy is banned in many countries and can lead to only
having old or obsolete products in the stock.
Now, specific removal strategies can be defined on product categories. To do this, go to
:menuselection:`Inventory app --> Configuration --> Product Categories`, and choose a product
category to define the removal strategy on. In the :guilabel:`Force Removal Strategy` field, choose
a removal strategy.
First Expire, First Out (FEFO)
------------------------------
.. image:: removal/product-category-removal.png
The *First Expired, First Out* (FEFO) strategy is a bit different from the other two removal
strategies. For :abbr:`FEFO (First Expired, First Out)`, the expiration date is important, not the
date the product entered the stock.
For example, imagine there are three lots of six-egg boxes (in this specific case, don't forget to
use :doc:`units of measure <../../management/products/uom>`). Those three lots have the following
numbers: :guilabel:`20001`, :guilabel:`20002`, and :guilabel:`20003`, each with five boxes in it.
:guilabel:`20001` entered the stock on the 1st of July and expires on the 15th of July,
:guilabel:`20002` entered on the 2nd and expires on the 14th of July, and :guilabel:`20003` entered
on the 4th and expires on the 21st of July. A customer orders six boxes on the 5th of July. With
the :abbr:`FEFO (First Expired, First Out)` strategy selected, a transfer is requested for the five
boxes of :guilabel:`20002` and one from :guilabel:`20001`. The transfer for all the boxes in lot
:guilabel:`20002` is because they have the closest expiration date. The transfer also requests one
box from :guilabel:`20001` because has the next closest expiration date after lot
:guilabel:`20002`.
Basically, for every sales order of a product with the :abbr:`FEFO (First Expired, First Out)`
strategy, a transfer is requested for the product that has the nearest expiration date from the
order date.
Closest Location
----------------
The *Closest Location* strategy is completely different from the other removal strategies. It is
not related to the date of entry in the warehouse, but rather the location of the product. It is
commonly used for products that do not deteriorate with time.
The aim is to avoid making the warehouse worker take a long journey to the bottom of the stock when
the product is also located at a near location. This method is only available if the
:guilabel:`Storage Locations` setting is on. The closest location is actually the one that comes
first in the alphabetic order.
Use removal strategies
======================
To differentiate some units from others, the units need to be tracked, either by *lot* or by
*serial number*. To do so, go to :menuselection:`Inventory --> Configuration --> Settings`. Then,
activate the :guilabel:`Storage Location`, :guilabel:`Multi-Step Routes`, and :guilabel:`Lots &
Serial Numbers` settings.
.. image:: removal/enabled-features.png
:align: center
:alt: :alt: Removal strategy on a product category.
:alt: Features to enable in order to properly use removal strategies.
To view all products with lots/serial numbers assigned to them, navigate to
:menuselection:`Inventory app --> Products --> Lots/Serial Numbers`. This reveals a page with
drop-down menus of all products assigned lots or serial numbers, filtered by *product* by default.
To change the category these products are filtered by, click :guilabel:`Product` (in the search bar,
in the top right of the page) to remove the default filter, and select a new filter if desired.
.. note::
To work with the :abbr:`FEFO (First Expired, First Out)` strategy, also activate the
:guilabel:`Expiration Dates` feature.
.. image:: removal/lot-serial.png
Next, go to :menuselection:`Inventory --> Configuration --> Product Categories` to define the
removal strategy on a product category.
.. image:: removal/first-in-first-out.png
:align: center
:alt: Click on Products, then Lots/Serial Numbers to display all the products with lots or serial
numbers.
To view the serial numbers being selected for a sales order, go to the :guilabel:`Sales app` and
select the sales order in question. In the sales order, click the :guilabel:`Delivery` smart button
in the top right. In the :guilabel:`Operations` tab, click the :guilabel:`⦙≣ (Detailed Operations)`
icon in the far right for the product in question. The :guilabel:`Detailed Operations` window
appears, and displays the lot or serial numbers selected for that specific product for the delivery
order.
:alt: Force removal strategy set up as first in first out.
FIFO (First In, First Out)
--------------------------
The :abbr:`FIFO (First In, First Out)` removal strategy implies that products which enter a
warehouse's stock first are removed first. Companies should use this method if they are selling
products with short demand cycles, such as clothes, to ensure they are not stuck with outdated
styles in stock.
As explained, a :abbr:`FIFO (First In, First Out)` removal strategy implies that products stocked
first move out first. Companies should use this method if they are selling products with short
demand cycles, such as clothes, and to ensure they are not stuck with outdated styles in stock.
In this example, there are three lots of white shirts. The shirts are from the *All/Clothes*
category, where *FIFO* is set as the removal strategy. In the :guilabel:`Inventory Valuation
Report`, the three different receipts are listed with the amounts.
In this example, there are three lots of white shirts. The shirts are from the
:guilabel:`All/Clothes` category, where *FIFO* is set as the removal strategy. In the stock
location (:guilabel:`WH/Stock`), the user can find the three lots available.
.. image:: removal/inventory-valuation.png
:align: center
:alt: View of the lots of white shirts in the inventory valuation report.
:alt: View of the white shirt lots inventory valuation.
Lot `000001` contains five shirts, lot `000002` contains three shirts, and lot `000003` contains two
shirts.
Lot :guilabel:`000001` contains five shirts, :guilabel:`000002` contains three shirts, and
:guilabel:`000003` contains two shirts.
To see the removal strategy in action, go to the :menuselection:`Sales app` and click
:guilabel:`Create` to create a sales order. Next, select a :guilabel:`Customer` from the drop-down
menu. Then click :guilabel:`Add a product` in the :guilabel:`Order Lines` tab. Select a product (for
this example, the :guilabel:`White Shirt`) from the drop-down menu, or type in the name of the
product in the field. Enter a quantity (for this example, `6.00`) in the :guilabel:`Quantity` field,
then click :guilabel:`Save`, then click :guilabel:`Confirm`.
As seen above, :guilabel:`000001` entered the stock first. Now, create a sales order of six white
shirts to check that those products from lot :guilabel:`000001` are the first ones to move out.
Once the sales order is confirmed, the delivery order will be created and linked to the picking, and
the oldest lot numbers will be reserved thanks to the :abbr:`FIFO (First In, First Out)` strategy.
All five shirts from lot `000001` and one shirt from lot `000002` will be selected to be sent to the
customer.
On the delivery order linked to the picking, the oldest lot numbers should have been reserved
thanks to the :abbr:`FIFO (First In, First Out)` strategy.
.. image:: removal/reserved-lots-fifo-strategy.png
.. image:: removal/reserved-lots-FIFO.png
:align: center
:alt: Two lots being reserved for a sales order with the FIFO strategy.
LIFO (Last In, First Out)
-------------------------
The :abbr:`LIFO (Last In, First Out)` removal strategy works in the **opposite** manner from the
:abbr:`FIFO (First In, First Out)` strategy. With this method, the products that are received
**last** are moved out first. This method is mostly used for products without a shelf life, and no
time-sensitive factors, such as expiration dates.
With a *LIFO* strategy, that's quite the opposite. In fact, the products that are received last
move out first. :abbr:`LIFO (Last In, First Out)` is mostly used for products without a shelf life.
In this example, there are three lots of cinder blocks. The blocks are from the *All/Building
Materials* category, where *FIFO* is set as the removal strategy. In the :guilabel:`Inventory
Valuation Report`, the three different receipts are listed with the amounts.
.. image:: removal/inventory-valuation-bricks.png
:align: center
:alt: View of the lots of cinder blocks in the inventory valuation report.
Lot `000020` contains three cinder blocks, lot `000030` contains five cinder blocks, and lot
`0000400` contains four cinder blocks.
To see how the :abbr:`LIFO (Last In, First Out)` strategy works, first navigate to
:menuselection:`Inventory app --> Configuration --> Product Categories`, and select a product
category (for this example, the :guilabel:`All/Building Materials` category) to edit. This reveals a
product category form.
Once on the product category form, under the :guilabel:`Logistics` section, change the
:guilabel:`Force Removal Strategy` to :guilabel:`Last In First Out (LIFO)`.
In this example, let's use the white shirts again to test the :abbr:`LIFO (Last In, First Out)`
strategy. First, open the product category via :menuselection:`Inventory --> Configuration -->
Product Categories` and change the removal strategy to :abbr:`LIFO (Last In, First Out)`.
.. image:: removal/last-in-first-out.png
:align: center
:alt: Last in first out (LIFO) strategy set up as forced removal strategy.
:alt: Last in first out strategy set up as forced removal strategy.
To see the removal strategy in action, go to the :menuselection:`Sales app` and click
:guilabel:`Create` to create a sales order. Next, select a :guilabel:`Customer` from the drop-down
menu. Then click :guilabel:`Add a product` in the :guilabel:`Order Lines` tab. Select a product (for
this example, the :guilabel:`Cinder Block`) from the drop-down menu, or type in the name of the
product in the field. Enter a quantity (for this example, `5.00`) in the :guilabel:`Quantity` field,
then click :guilabel:`Save`, then click :guilabel:`Confirm`.
Then, create a sales order for four white shirts and check that the reserved products are from lots
:guilabel:`000003` and :guilabel:`000002`.
Once the sales order is confirmed, the delivery order will be created and linked to the picking, and
the newest lot numbers will be reserved thanks to the :abbr:`LIFO (Last In, First Out)` strategy.
All four cinder blocks from lot `0000400` and one cinder block from lot `000030` will be selected to
be sent to the customer.
.. image:: removal/reserved-lots-lifo-strategy.png
.. image:: removal/reserved-lots-LIFO.png
:align: center
:alt: Two lots being reserved for sale with the LIFO strategy.
.. _routes/FEFO:
.. important::
Don't forget that the :abbr:`LIFO (Last In, First Out)` strategy is banned in many countries!
FEFO (First Expired, First Out)
-------------------------------
The :abbr:`FEFO (First Expired, First Out)` removal strategy differs from the :abbr:`FIFO (First In,
First Out)` and :abbr:`LIFO (Last In, First Out)` strategies, because it targets products for
removal based on **expiration dates** instead of their warehouse receipt dates. With this method,
the products that are going to expire first are moved out first. This method is used for perishable
products, such as medicine, food, and beauty products.
Lots are picked based on their **removal date** from earliest to latest. Removal dates indicate how
many days *before* the expiration date the product needs to be removed from stock. The removal date
is set on the product form. Lots without a removal date defined are picked after lots with removal
dates.
.. warning::
If products are not removed from stock when they should be, lots that are past the expiration
date may still be picked for delivery orders!
With the :abbr:`FEFO (First Expired, First Out)` removal strategy, the way products are picked is
not based on the reception date. In this particular case, they are dispatched according to their
expiration date.
.. note::
For more information about expiration dates, reference the :doc:`Expiration dates
</applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates>`
document.
For have more information about expiration dates, please have a look at :doc:`the related doc
<../../management/lots_serial_numbers/expiration_dates>`.
First, go to :menuselection:`Inventory app --> Configuration --> Settings` and ensure
:guilabel:`Expiration Dates` is enabled. Once the :guilabel:`Expiration Dates` setting is enabled,
it's possible to define different expiration dates for individual serialized products, as well as
for lot numbers containing many products.
In this example, there are three lots of hand cream. The creams are from the *All/Health & Beauty*
category, where *FEFO* is set as the removal strategy. In the :guilabel:`Inventory Valuation
Report`, the three different receipts are listed with the amounts.
Lot `0000001` contains twenty tubes of hand cream, expiring on Sept 30, lot `0000002` contains ten
tubes of hand cream, expiring on November 30, and lot `0000003` contains ten tubes of hand cream,
expiring on October 31.
.. image:: removal/hand-cream-lots.png
:align: center
:alt: View the hand cream lot numbers and expiration dates in the inventory report.
Expiration dates can be entered when validating the received products, or set on products by going
to :menuselection:`Inventory app --> Products --> Lots/Serial Numbers`. Click :guilabel:`Create`,
enter the serial number, and select the product from the drop-down menu. Next, select the expiration
date in the :guilabel:`Dates` tab. Finally, click :guilabel:`Save`.
By activating the :guilabel:`Expiration Dates` feature, it becomes possible to define different
expiration dates on the serial/lot numbers that will be used in :abbr:`FEFO (First Expired, First
Out)`. These expiration dates can be set by going to :menuselection:`Inventory --> Products -->
Lots/Serial Numbers`.
.. image:: removal/removal-date.png
:align: center
:alt: View of the removal date for 0000001.
To see how the :abbr:`FEFO (First Expired, First Out)` strategy works, first navigate to
:menuselection:`Inventory app --> Configuration --> Product Categories`, and select a product
category (in this example, the :guilabel:`All/Health & Beauty` category) to edit. This reveals a
product category form.
Lots are picked based on their removal date, from earliest to latest. Lots without a removal date
defined are picked after lots with removal dates.
Once on the product category form, under the :guilabel:`Logistics` section, change the
:guilabel:`Force Removal Strategy` to :abbr:`FEFO (First Expired, First Out)`.
.. note::
Other dates are for informational and reporting purposes only. If not removed from the stock,
lots that are past the expiration dates may still be picked for delivery orders!
.. image:: removal/fefo.png
To use the :abbr:`FEFO (First Expired, First Out)` strategy, go to :menuselection:`Inventory -->
Configuration --> Product Categories` and set :abbr:`FEFO (First Expired, First Out)` in the
:guilabel:`Force Removal Strategy` field.
.. image:: removal/first-expiry-first-out.png
:align: center
:alt: FEFO forced removal strategy set on the product category.
:alt: View of the FEFO strategy being set up as forced removal strategy.
Next, go to the :menuselection:`Sales app` and click :guilabel:`Create` to create a sales order.
Next, select a :guilabel:`Customer` from the drop-down menu. Then click :guilabel:`Add a product` in
the :guilabel:`Order Lines` tab. Select a product (for this example, the :guilabel:`Hand Cream`)
from the drop-down menu, or type in the name of the product in the field. Enter a quantity (in this
example, `25.00`) in the :guilabel:`Quantity` field, then click :guilabel:`Save`, then click
:guilabel:`Confirm`.
For this particular case, the stock has hand cream. There are three lots of them.
Once the sales order is confirmed, the delivery order will be created and linked to the picking, and
the lot numbers expiring first will be reserved thanks to the :abbr:`FEFO (First Expired, First
Out)` strategy. All twenty tubes of hand cream from lot `0000001` and five from lot `0000003` will
be selected to be sent to the customer, detailed in the :guilabel:`Detailed Operations` tab in the
sales order.
+-----------------------+---------------+-----------------------+
| **Lot / Serial No** | **Product** | **Expiration Date** |
+=======================+===============+=======================+
| 0000001 | Hand Cream | 09/30/2019 |
+-----------------------+---------------+-----------------------+
| 0000002 | Hand Cream | 11/30/2019 |
+-----------------------+---------------+-----------------------+
| 0000003 | Hand Cream | 10/31/2019 |
+-----------------------+---------------+-----------------------+
.. image:: removal/pick-hand-cream.png
When a sales order for 25 units of Hand Cream is created, Odoo automatically reserves the lots with
the closest expiration date, :guilabel:`0000001` and :guilabel:`0000003`.
.. image:: removal/reserved-hand-cream.png
:align: center
:alt: Hand cream lot numbers selected for the sales order.
:alt: Two hand cream lots reserved for sell with the FEFO strategy.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -2,8 +2,6 @@
How to invoice the shipping cost to the customer?
=================================================
.. _inventory/shipping/invoice:
Overview
========

Some files were not shown because too many files have changed in this diff Show More