Compare commits
1 Commits
16.0-postg
...
16.0-mrp-a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e17162c29a |
5
Makefile
@@ -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
|
||||
|
||||
@@ -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::
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 33 KiB |
@@ -129,8 +129,6 @@ Example
|
||||
|
||||
.. placeholder
|
||||
|
||||
.. _cheat_sheet/journals:
|
||||
|
||||
Journal entries
|
||||
===============
|
||||
|
||||
|
||||
@@ -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
|
||||
-----------------------
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
Before Width: | Height: | Size: 24 KiB |
@@ -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
|
||||
==================
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
@@ -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
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
:show-content:
|
||||
|
||||
=======
|
||||
Payroll
|
||||
=======
|
||||
|
||||
@@ -13,4 +13,3 @@ Daily operations
|
||||
operations/transfers_scratch
|
||||
operations/barcode_nomenclature
|
||||
operations/gs1_nomenclature
|
||||
operations/gs1_usage
|
||||
|
||||
@@ -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
|
||||
|
||||
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.8 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 9.7 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
@@ -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.
|
||||
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 8.9 KiB |
@@ -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.).
|
||||
|
||||
|
Before Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 492 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 43 KiB |
@@ -43,8 +43,6 @@ directly at creation on the product form.
|
||||
the template product. Otherwise, you won’t be able to differentiate
|
||||
them.
|
||||
|
||||
.. _barcode/setup/location:
|
||||
|
||||
Set Locations Barcodes
|
||||
======================
|
||||
|
||||
|
||||
@@ -11,4 +11,3 @@ Miscellaneous Operations
|
||||
misc/owned_stock
|
||||
misc/batch_transfers
|
||||
misc/wave_transfers
|
||||
misc/cluster_picking
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 9.8 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 22 KiB |
@@ -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
|
||||
========
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -12,4 +12,3 @@ Warehouses
|
||||
warehouses/warehouse_replenishment_transfer
|
||||
warehouses/warehouses_locations
|
||||
warehouses/create_a_second_warehouse
|
||||
warehouses/use_locations
|
||||
|
||||
@@ -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.
|
||||
|
Before Width: | Height: | Size: 9.0 KiB |
@@ -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.
|
||||
|
||||
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 79 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 9.8 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 24 KiB |
@@ -2,8 +2,6 @@
|
||||
How to invoice the shipping cost to the customer?
|
||||
=================================================
|
||||
|
||||
.. _inventory/shipping/invoice:
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
|
||||