Compare commits
25 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a32ce943b3 | |||
| 85a3700376 | |||
| 9f9356fd2e | |||
| 3ce39de4d9 | |||
| 0cd4d0dd6d | |||
| 1d2df00977 | |||
| ae54501ec1 | |||
| 692b6e59db | |||
| c192520bc8 | |||
| 733b1b14b4 | |||
| 9486481337 | |||
| 67e0c5aac6 | |||
| 0bfa9dfba6 | |||
| d1ab1de49b | |||
| 6013cef5e2 | |||
| 8945dd6f73 | |||
| c5dce7421d | |||
| 1cbc4d906b | |||
| 3943ff6f4b | |||
| 78004f6ae3 | |||
| 133abb2ab1 | |||
| 637671bad0 | |||
| bc0ceff831 | |||
| 05e34a4859 | |||
| 256061731f |
@@ -26,7 +26,7 @@ SOURCE_DIR = content
|
||||
|
||||
HTML_BUILD_DIR = $(BUILD_DIR)/html
|
||||
ifdef VERSIONS
|
||||
HTML_BUILD_DIR := $(HTML_BUILD_DIR)/master
|
||||
HTML_BUILD_DIR := $(HTML_BUILD_DIR)/saas-17.2
|
||||
endif
|
||||
ifneq ($(CURRENT_LANG),en)
|
||||
HTML_BUILD_DIR := $(HTML_BUILD_DIR)/$(CURRENT_LANG)
|
||||
|
||||
@@ -22,7 +22,7 @@ copyright = 'Odoo S.A.'
|
||||
# `version` is the version info for the project being documented, acts as replacement for |version|,
|
||||
# also used in various other places throughout the built documents.
|
||||
# `release` is the full version, including alpha/beta/rc tags. Acts as replacement for |release|.
|
||||
version = release = 'master'
|
||||
version = release = 'saas-17.2'
|
||||
|
||||
# `current_branch` is the technical name of the current branch.
|
||||
# E.g., saas-15.4 -> saas-15.4; 12.0 -> 12.0, master -> master (*).
|
||||
@@ -213,6 +213,7 @@ sphinx.transforms.i18n.docname_to_domain = (
|
||||
# is populated. If a version is passed to `versions` but is not listed here, it will not be shown.
|
||||
versions_names = {
|
||||
'master': "Master",
|
||||
'saas-17.2': "Odoo Online",
|
||||
'saas-17.1': "Odoo Online",
|
||||
'17.0': "Odoo 17",
|
||||
'saas-16.4': "Odoo Online",
|
||||
@@ -233,6 +234,7 @@ languages_names = {
|
||||
'es': 'ES',
|
||||
'fr': 'FR',
|
||||
'it': 'IT',
|
||||
'ko': 'KO',
|
||||
'nl': 'NL',
|
||||
'pt_BR': 'PT',
|
||||
'ro': 'RO',
|
||||
|
||||
@@ -20,7 +20,7 @@ To Odoo Online
|
||||
- Odoo Online is *not* compatible with **non-standard apps**.
|
||||
- The database's current version must be :doc:`supported <supported_versions>`.
|
||||
|
||||
#. Create a :ref:`duplicate <duplicate_premise>` of the database.
|
||||
#. Create a :ref:`duplicate of the database <on-premise/duplicate>`.
|
||||
#. In this duplicate, uninstall all **non-standard apps**.
|
||||
#. Use the database manager to grab a *dump with filestore*.
|
||||
#. `Submit a support ticket <https://www.odoo.com/help>`_ including the following:
|
||||
@@ -59,6 +59,11 @@ Transferring an Odoo Online database
|
||||
Click the gear icon (:guilabel:`⚙`) next to the database name on the `Odoo Online database
|
||||
manager <https://www.odoo.com/my/databases/>`_ to display its version number.
|
||||
|
||||
.. warning::
|
||||
If there is an active Odoo subscription linked to the database being migrated, reach out to
|
||||
the Customer Service Manager or `submit a support ticket <https://www.odoo.com/help>`_ to
|
||||
complete the subscription transfer.
|
||||
|
||||
To on-premise
|
||||
-------------
|
||||
|
||||
|
||||
@@ -7,159 +7,110 @@ On-premise
|
||||
Register a database
|
||||
===================
|
||||
|
||||
To register your database, you just need to enter your Subscription Code in the
|
||||
banner in the App Switcher. Make sure you do not add extra spaces before or after
|
||||
your subscription code. If the registration is successful, it will turn green and
|
||||
will provide you with the Expiration Date of your freshly-registered database. You
|
||||
can check this Expiration Date in the About menu (Odoo 9) or in the Settings Dashboard
|
||||
(Odoo 10).
|
||||
To register your database, enter your subscription code in the banner in the app dashboard. If the
|
||||
registration is successful, the banner will turn green and display the database expiration date.
|
||||
|
||||
Registration Error Message
|
||||
--------------------------
|
||||
.. tip::
|
||||
The expiration date is also displayed at the bottom of the Settings page.
|
||||
|
||||
If you are unable to register your database, you will likely encounter this
|
||||
message:
|
||||
|
||||
.. image:: on_premise/error_message_sub_code.png
|
||||
:alt: Something went wrong while registering your database, you can try again or contact Odoo
|
||||
Help
|
||||
|
||||
Solutions
|
||||
~~~~~~~~~
|
||||
|
||||
* Do you have a valid Enterprise subscription?
|
||||
|
||||
* Check if your subscription details get the tag "In Progress" on
|
||||
your `Odoo Account
|
||||
<https://accounts.odoo.com/my/subscription>`__ or with your Account Manager
|
||||
|
||||
* Have you already linked a database with your subscription reference?
|
||||
|
||||
* You can link only one database per subscription.
|
||||
(Need a test or a development database? `Find a partner
|
||||
<https://www.odoo.com/partners>`__)
|
||||
|
||||
* You can unlink the old database yourself on your `Odoo Contract
|
||||
<https://accounts.odoo.com/my/subscription>`__ with the button "Unlink database"
|
||||
|
||||
.. image:: on_premise/unlink_single_db.png
|
||||
|
||||
A confirmation message will appear; make sure this is the correct database as
|
||||
it will be deactivated shortly:
|
||||
|
||||
.. image:: on_premise/unlink_confirm_enterprise_edition.png
|
||||
|
||||
* Do you have the updated version of Odoo 9?
|
||||
|
||||
* From July 2016 onward, Odoo 9 now automatically change the uuid of a
|
||||
duplicated database; a manual operation is no longer required.
|
||||
|
||||
* If it's not the case, you may have multiple databases sharing the same
|
||||
UUID. Please check on your `Odoo Contract
|
||||
<https://accounts.odoo.com/my/subscription>`__, a short message will appear
|
||||
specifying which database is problematic:
|
||||
|
||||
.. image:: on_premise/unlink_db_name_collision.png
|
||||
|
||||
In this case, you need to change the UUID on your test databases to solve this
|
||||
issue. You will find more information about this in :ref:`this section <duplicate_premise>`.
|
||||
|
||||
For your information, we identify database with UUID. Therefore, each database
|
||||
should have a distinct UUID to ensure that registration and invoicing proceed
|
||||
effortlessly for your and for us.
|
||||
|
||||
* Check your network and firewall settings
|
||||
|
||||
* The Update notification must be able to reach Odoo's subscription
|
||||
validation servers. In other words, make sure that the Odoo server is able
|
||||
to open outgoing connections towards:
|
||||
|
||||
* services.odoo.com on port 443 (or 80)
|
||||
* services.openerp.com on port 443 (or 80) for older deployments
|
||||
|
||||
* Once you activated your database, you must keep these ports open, as the
|
||||
Update notification runs once a week.
|
||||
|
||||
Error message due to too many users
|
||||
-----------------------------------
|
||||
|
||||
If you have more users in your local database than provisionned in your
|
||||
Odoo Enterprise subscription, you may encounter this message:
|
||||
|
||||
.. image:: on_premise/add_more_users.png
|
||||
:alt: This database will expire in X days, you have more users than your subscription allows
|
||||
|
||||
|
||||
When the message appears you have 30 days before the expiration.
|
||||
The countdown is updated everyday.
|
||||
|
||||
Solutions
|
||||
~~~~~~~~~
|
||||
|
||||
- **Add more users** on your subscription: follow the link and Validate
|
||||
the upsell quotation and pay for the extra users.
|
||||
- **Deactivate users** as explained in this `documentation <documentation.html#deactivating-users>`_
|
||||
and **Reject** the upsell quotation.
|
||||
|
||||
Once your database has the correct number of users, the expiration message
|
||||
will disappear automatically after a few days, when the next verification occurs.
|
||||
We understand that it can be a bit frightening to see the countdown,
|
||||
so you can :ref:`force an Update Notification <force_ping>` to make the message disappear
|
||||
right away.
|
||||
|
||||
Database expired error message
|
||||
------------------------------
|
||||
|
||||
If your database reaches its expiration date before your renew your subscription,
|
||||
you will encounter this message:
|
||||
|
||||
.. image:: on_premise/database_expired.png
|
||||
:alt: This database has expired.
|
||||
|
||||
This **blocking** message appears after a non-blocking message that lasts 30 days.
|
||||
If you fail to take action before the end of the countdown, the database is expired.
|
||||
|
||||
Solutions
|
||||
~~~~~~~~~
|
||||
|
||||
* Renew your subscription: follow the link and renew your subscription - note that
|
||||
if you wish to pay by Wire Transfer, your subscription will effectively be renewed
|
||||
only when the payment arrives, which can take a few days. Credit card payments are
|
||||
processed immediately.
|
||||
* Contact our `Support <https://www.odoo.com/help>`__
|
||||
|
||||
None of those solutions worked for you? Please contact our
|
||||
`Support <https://www.odoo.com/help>`__
|
||||
|
||||
.. _force_ping:
|
||||
|
||||
.. _duplicate_premise:
|
||||
.. _on-premise/duplicate:
|
||||
|
||||
Duplicate a database
|
||||
====================
|
||||
|
||||
You can duplicate your database by accessing the database manager on your
|
||||
server (<odoo-server>/web/database/manager). In this page, you can easily
|
||||
duplicate your database (among other things).
|
||||
Duplicate a database by accessing the database manager on your server
|
||||
(`<odoo-server>/web/database/manager`). Typically, you want to duplicate your production database
|
||||
into a neutralized testing database. It can be done by checking the neutralize box when prompted,
|
||||
which executes all :file:`neutralize.sql` scripts for every installed module.
|
||||
|
||||
.. image:: on_premise/db_manager.gif
|
||||
Common error messages and solutions
|
||||
===================================
|
||||
|
||||
When you duplicate a local database, it is **strongly** advised to change
|
||||
the duplicated database's uuid (Unniversally Unique Identifier), since this
|
||||
uuid is how your database identifies itself with our servers. Having two
|
||||
databases with the same uuid could result in invoicing problems or registration
|
||||
problems down the line.
|
||||
Registration error
|
||||
------------------
|
||||
|
||||
.. note::
|
||||
From July 2016 onward, Odoo 9 now automatically change the uuid of a duplicated database; a
|
||||
manual operation is no longer required.
|
||||
In case of a registration error, the following message should be displayed.
|
||||
|
||||
The database uuid is currently accessible from the menu :menuselection:`Settings --> Technical -->
|
||||
System Parameters`, we advise you to use a `uuid generator <https://www.uuidtools.com>`_ or to
|
||||
use the unix command ``uuidgen`` to generate a new uuid. You can then simply replace it like any
|
||||
other record by clicking on it and using the edit button.
|
||||
.. image:: on_premise/error-message-sub-code.png
|
||||
:alt: Database registration error message
|
||||
|
||||
.. image:: on_premise/db_uuid.png
|
||||
To resolve the issue:
|
||||
|
||||
- Check the **validity of your Odoo Enterprise subscription** by verifying if your subscription
|
||||
details have the tag :guilabel:`In Progress` on your `Odoo Account
|
||||
<https://accounts.odoo.com/my/subscription>`_ or contact your Account Manager.
|
||||
|
||||
- Ensure that **no other database is linked** to the subscription code, as only one database can be
|
||||
linked per subscription.
|
||||
|
||||
.. tip::
|
||||
If a test or a development database is needed, you can :ref:`duplicate a database
|
||||
<on-premise/duplicate>`.
|
||||
|
||||
- Verify that **no databases share the same UUID** (Universally Unique Identifier) by opening your
|
||||
`Odoo Contract <https://accounts.odoo.com/my/subscription>`_. If two or more databases share the
|
||||
same UUID, their name will be displayed.
|
||||
|
||||
.. image:: on_premise/unlink-db-name-collision.png
|
||||
:alt: Database UUID error message
|
||||
|
||||
If that is the case, manually change the database(s) UUID or `send a support ticket
|
||||
<https://www.odoo.com/help>`_.
|
||||
|
||||
- As the update notification must be able to reach Odoo's subscription validation servers, ensure
|
||||
your **network and firewall settings** allow the Odoo server to open outgoing connections
|
||||
towards:
|
||||
|
||||
- `services.odoo.com` on port `443` (or `80`)
|
||||
- for older deployments, `services.openerp.com` on port `443` (or `80`)
|
||||
|
||||
These ports must be kept open even after registering a database, as the update notification runs
|
||||
once a week.
|
||||
|
||||
Too many users error
|
||||
--------------------
|
||||
|
||||
If you have more users in a local database than provisioned in your Odoo Enterprise subscription,
|
||||
the following message should be displayed.
|
||||
|
||||
.. image:: on_premise/add-more-users.png
|
||||
:alt: Too many users on a database error message
|
||||
|
||||
When the message appears, you have 30 days to act before the database expires. The countdown is
|
||||
updated every day.
|
||||
|
||||
To resolve the issue, either:
|
||||
|
||||
- **Add more users** to your subscription by clicking the :guilabel:`Upgrade your subscription` link
|
||||
displayed in the message to validate the upsell quotation and pay for the extra users.
|
||||
- :ref:`Deactivate users <users/deactivate>` and **reject** the upsell quotation.
|
||||
|
||||
.. important::
|
||||
If you are on a monthly subscription plan, the database will automatically update to reflect the
|
||||
added user(s). If you are on a yearly or multi-year plan, an expiration banner will appear in the
|
||||
database. You can create the upsell quotation by clicking the banner to update the subscription
|
||||
or `send a support ticket <https://www.odoo.com/help>`_ to resolve the issue.
|
||||
|
||||
Once your database has the correct number of users, the expiration message disappears automatically
|
||||
after a few days, when the next verification occurs.
|
||||
|
||||
Database expired error
|
||||
----------------------
|
||||
|
||||
If your database expires before you renew your subscription, the following message should be
|
||||
displayed.
|
||||
|
||||
.. image:: on_premise/database-expired.png
|
||||
:alt: Database expired error message
|
||||
|
||||
This message appears if you fail to act before the end of the 30-day countdown.
|
||||
|
||||
To resolve the issue, either:
|
||||
|
||||
- Click the :guilabel:`Renew your subscription` link displayed in the message and complete the
|
||||
process. If you pay by wire transfer, your subscription will be renewed when the payment arrives
|
||||
which can take a few days. Credit card payments are processed immediately.
|
||||
- `Send a support ticket <https://www.odoo.com/help>`_.
|
||||
|
||||
.. toctree::
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 22 KiB |
@@ -2,166 +2,245 @@
|
||||
Export and import data
|
||||
======================
|
||||
|
||||
In Odoo, it is sometimes necessary to export or import data for running reports, or for data
|
||||
modification. This document covers the export and import of data into and out of Odoo.
|
||||
|
||||
.. important::
|
||||
Sometimes, users run into a 'time out' error, or a record does not process, due to its size. This
|
||||
can occur with large exports, or in cases where the import file is too large. To circumvent this
|
||||
limitation surrounding the size of the records, process exports or imports in smaller batches.
|
||||
|
||||
.. _export-data:
|
||||
|
||||
Export data from Odoo
|
||||
=====================
|
||||
|
||||
When working with a database, it sometimes is necessary to export your data in a distinct file.
|
||||
Doing so can help to do reporting over your activities (even if Odoo offers a precise and easy
|
||||
reporting tool with each available application).
|
||||
When working with a database, it is sometimes necessary to export data in a distinct file. Doing so
|
||||
can aid in reporting on activities, although, Odoo provides a precise and easy reporting tool with
|
||||
each available application.
|
||||
|
||||
With Odoo, you can export the values from any field in any record. To do so,
|
||||
activate the list view on the items that need to be exported, click on *Action*, and, then,
|
||||
on *Export*.
|
||||
With Odoo, the values can be exported from any field in any record. To do so, activate the list view
|
||||
(:guilabel:`☰ (three horizontal lines)` icon), on the items that need to be exported, and then
|
||||
select the records that should be exported. To select a record, tick the checkbox next to the
|
||||
corresponding record. Finally, click on :guilabel:`⚙️ Action`, and then :guilabel:`Export`.
|
||||
|
||||
.. image:: export_import_data/list-view-export.png
|
||||
:align: center
|
||||
:alt: view of the different things to enable/click to export data
|
||||
:alt: View of the different things to enable/click to export data.
|
||||
|
||||
Pretty simple, this action still comes with some specificities. In fact,
|
||||
when clicking on *Export*, a pop-up window appears with several
|
||||
options for the data to export:
|
||||
When clicking on :guilabel:`Export`, an :guilabel:`Export Data` pop-over window appears, with
|
||||
several options for the data to export:
|
||||
|
||||
.. image:: export_import_data/export-data-overview.png
|
||||
:align: center
|
||||
:alt: overview of all the options to take into account when exporting data in Odoo
|
||||
:alt: Overview of options to consider when exporting data in Odoo..
|
||||
|
||||
#. With the *I want to update data* option ticked, the system only
|
||||
shows the fields which can be imported. This is very helpful in
|
||||
case you want to update existing records. Basically, this works
|
||||
like a filter. Leaving the box unticked gives way more field
|
||||
options because it shows all the fields, not just the ones which
|
||||
can be imported.
|
||||
#. When exporting, you can choose between two formats: .csv and .xls.
|
||||
With .csv, items are separated with a comma, while .xls holds information about all the
|
||||
worksheets in a file, including both content and formatting.
|
||||
#. Those are the items you may want to export. Use the arrows to display
|
||||
more sub-field options. Of course, you can use the search bar to
|
||||
find specific fields more easily. To use the search option more
|
||||
efficiently, display all the fields by clicking on all the
|
||||
arrows!
|
||||
#. The + button is there to add fields to the "to export" list.
|
||||
#. The "handles" next to the selected fields allow you to move the fields up and down to
|
||||
change the order in which they must be displayed in the exported
|
||||
file.
|
||||
#. The trashcan is there if you need to remove fields.
|
||||
#. For recurring reports, it might be interesting to save export presets.
|
||||
Select all the needed ones and click on the template bar.
|
||||
There, click on *New template* and give a name to yours. The
|
||||
next time you need to export the same list, simply select the
|
||||
related template.
|
||||
#. With the :guilabel:`I want to update data (import-compatable export)` option ticked, the system
|
||||
only shows the fields that can be imported. This is helpful in the case where the existing
|
||||
records need to be updated. This works like a filter. Leaving the box unticked, gives many more
|
||||
field options because it shows all the fields, not just the ones that can be imported.
|
||||
#. When exporting, there is the option to export in two formats: `.csv` and `.xls`. With `.csv`,
|
||||
items are separated by a comma, while `.xls` holds information about all the worksheets in a
|
||||
file, including both content and formatting.
|
||||
#. These are the items that can be exported. Use the :guilabel:`> (right arrow)` icon to display
|
||||
more sub-field options. Use the :guilabel:`Search` bar to find specific fields. To use the
|
||||
:guilabel:`Search` option more efficiently, click on all the :guilabel:`> (right arrows)` to
|
||||
display all fields.
|
||||
#. The :guilabel:`+ (plus sign)` icon button is present to add fields to the :guilabel:`Fields to
|
||||
export` list.
|
||||
#. The :guilabel:`↕️ (up-down arrow)` to the left of the selected fields can be used to move the
|
||||
fields up and down, to change the order in which they are displayed in the exported file.
|
||||
Drag-and-drop using the :guilabel:`↕️ (up-down arrow)` icon.
|
||||
#. The :guilabel:`🗑️ (trash can)` icon is used to remove fields. Click on the :guilabel:`🗑️ (trash
|
||||
can)` icon to remove the field.
|
||||
#. For recurring reports, it is helpful to save export presets. Select all the needed fields, and
|
||||
click on the template drop-down menu. Once there, click on :guilabel:`New template`, and give a
|
||||
unique name to the export just created. The next time the same list needs to be exported, select
|
||||
the related template that was previously saved from the drop-down menu.
|
||||
|
||||
.. tip::
|
||||
It’s good to keep the field’s external identifier in mind. For example,
|
||||
*Related Company* is equal to *parent_id*. Doing so helps export
|
||||
only what you would like to import next.
|
||||
It is helpful to know the field's external identifier. For example, :guilabel:`Related Company`
|
||||
in the export user interface is equal to *parent_id* (external identifier). This is helpful
|
||||
because then, the only data exported is what should be modified and re-imported.
|
||||
|
||||
.. _import-data:
|
||||
|
||||
Import data into Odoo
|
||||
=====================
|
||||
|
||||
How to start
|
||||
------------
|
||||
Importing data into Odoo is extremely helpful during implementation, or in times where data needs to
|
||||
be updated in bulk. The following documentation covers how to import data into an Odoo database.
|
||||
|
||||
You can import data on any Odoo's business object using either Excel
|
||||
(.xlsx) or CSV (.csv) formats:
|
||||
contacts, products, bank statements, journal entries and even orders!
|
||||
.. warning::
|
||||
Imports are permanent and **cannot** be undone. However, it is possible to use filters (`created
|
||||
on` or `last modified`) to identify records changed or created by the import.
|
||||
|
||||
Open the view of the object you want to populate and click on :menuselection:`Favorites --> Import
|
||||
records`.
|
||||
.. tip::
|
||||
Activating :ref:`developer mode <developer-mode>` changes the visible import settings in the left
|
||||
menu. Doing so reveals an :menuselection:`Advanced` menu. Included in this advanced menu are two
|
||||
options: :guilabel:`Track history during import` and :guilabel:`Allow matching with subfields`.
|
||||
|
||||
.. image:: export_import_data/import_button.png
|
||||
.. image:: export_import_data/advanced-import.png
|
||||
:align: center
|
||||
:alt: Advanced import options when developer mode is activated.
|
||||
|
||||
If the model uses openchatter, the :guilabel:`Track history during import` option sets up
|
||||
subscriptions and sends notifications during the import, but leads to a slower import.
|
||||
|
||||
Should the :guilabel:`Allow matching with subfields` option be selected, then all subfields
|
||||
within a field are used to match under the :guilabel:`Odoo Field` while importing.
|
||||
|
||||
Get started
|
||||
-----------
|
||||
|
||||
Data can be imported on any Odoo business object using either Excel (`.xlsx`) or :abbr:`CSV
|
||||
(Comma-separated Values)` (`.csv`) formats. This includes: contacts, products, bank statements,
|
||||
journal entries, and orders.
|
||||
|
||||
Open the view of the object to which the data should be imported/populated, and click on
|
||||
:menuselection:`⭐ Favorites --> Import records`.
|
||||
|
||||
.. image:: export_import_data/import-button.png
|
||||
:align: center
|
||||
:alt: Favorites menu revealed with the import records option highlighted.
|
||||
|
||||
There you are provided with templates you can easily populate
|
||||
with your own data. Such templates can be imported in one click;
|
||||
The data mapping is already done.
|
||||
After clicking :guilabel:`Import records`, Odoo reveals a separate page with templates that can be
|
||||
downloaded and populated with the company's own data. Such templates can be imported in one click,
|
||||
since the data mapping is already done. To download a template click :guilabel:`Import Template for
|
||||
Customers` at the center of the page.
|
||||
|
||||
How to adapt the template
|
||||
-------------------------
|
||||
.. important::
|
||||
When importing a :abbr:`CSV (Comma-separated Values)` file, Odoo provides :guilabel:`Formatting`
|
||||
options. These options do **not** appear when importing the proprietary Excel file type (`.xls`,
|
||||
`.xlsx`).
|
||||
|
||||
* Add, remove and sort columns to fit at best your data structure.
|
||||
* We advise to not remove the **ID** one (see why in the next section).
|
||||
* Set a unique ID to every single record by dragging down the ID sequencing.
|
||||
.. image:: export_import_data/formatting.png
|
||||
:align: center
|
||||
:alt: Formatting options presented when a CVS file is imported in Odoo.
|
||||
|
||||
Make necessary adjustments to the *Formatting* options, and ensure all columns in the
|
||||
:guilabel:`Odoo field` and :guilabel:`File Column` are free of errors. Finally, click
|
||||
:guilabel:`Import` to import the data.
|
||||
|
||||
Adapt a template
|
||||
----------------
|
||||
|
||||
Import templates are provided in the import tool of the most common data to import (contacts,
|
||||
products, bank statements, etc.). Open them with any spreadsheet software (*Microsoft Office*,
|
||||
*OpenOffice*, *Google Drive*, etc.).
|
||||
|
||||
Once the template is downloaded, proceed to follow these steps:
|
||||
|
||||
- Add, remove, and sort columns to best fit the data structure.
|
||||
- It is strongly advised to **not** remove the :guilabel:`External ID` (ID) column (see why in the
|
||||
next section).
|
||||
- Set a unique ID to every record by dragging down the ID sequencing in the :guilabel:`External ID`
|
||||
(ID) column.
|
||||
|
||||
.. image:: export_import_data/dragdown.gif
|
||||
:align: center
|
||||
:alt: An animation of the mouse dragging down the ID column, so each record has a unique ID.
|
||||
|
||||
* When you add a new column, Odoo might not be able to map it automatically if its
|
||||
label doesn't fit any field in Odoo. Don't worry! You can map
|
||||
new columns manually when you test the import. Search the list for the
|
||||
corresponding field.
|
||||
.. note::
|
||||
When a new column is added, Odoo may not be able to map it automatically, if its label does not
|
||||
fit any field within Odoo. However, new columns can be mapped manually when the import is tested.
|
||||
Search the drop-down menu for the corresponding field.
|
||||
|
||||
.. image:: export_import_data/field_list.png
|
||||
:align: center
|
||||
.. image:: export_import_data/field_list.png
|
||||
:align: center
|
||||
:alt: Drop-down menu expanded in the initial import screen on Odoo.
|
||||
|
||||
Then, use this field's label in your file in order to make it work
|
||||
straight on the very next time.
|
||||
Then, use this field's label in the import file to ensure future imports are successful.
|
||||
|
||||
How to import from another application
|
||||
--------------------------------------
|
||||
.. tip::
|
||||
Another useful way to find out the proper column names to import is to export a sample file
|
||||
using the fields that should be imported. This way, if there is not a sample import template,
|
||||
the names are accurate.
|
||||
|
||||
In order to re-create relationships between different records,
|
||||
you should use the unique identifier from the original application
|
||||
and map it to the **ID** (External ID) column in Odoo.
|
||||
When you import another record that links to the first one,
|
||||
use **XXX/ID** (XXX/External ID) to the original unique identifier.
|
||||
You can also find this record using its name but you will be stuck
|
||||
if at least 2 records have the same name.
|
||||
Import from another application
|
||||
-------------------------------
|
||||
|
||||
The **ID** will also be used to update the original import
|
||||
if you need to re-import modified data later,
|
||||
it's thus good practice to specify it whenever possible.
|
||||
The :guilabel:`External ID` (ID) is a unique identifier for the line item. Feel free to use one
|
||||
from previous software to facilitate the transition to Odoo.
|
||||
|
||||
Setting an ID is not mandatory when importing, but it helps in many cases:
|
||||
|
||||
I cannot find the field I want to map my column to
|
||||
--------------------------------------------------
|
||||
- Update imports: import the same file several times without creating duplicates.
|
||||
- :ref:`Import relation fields <export_import_data/relation-fields>`.
|
||||
|
||||
Odoo tries to find with some heuristic, based on the first ten lines of
|
||||
the files, the type of field for each column inside your file.
|
||||
For example if you have a column only containing numbers,
|
||||
only the fields that are of type *Integer* will be displayed for you
|
||||
to choose from.
|
||||
While this behavior might be good and easy for most cases,
|
||||
it is also possible that it goes wrong or that you want to
|
||||
map your column to a field that is not proposed by default.
|
||||
To recreate relationships between different records, the unique identifier from the original
|
||||
application should be used to map it to the :guilabel:`External ID` (ID) column in Odoo.
|
||||
|
||||
If that happens, you just have to check the
|
||||
** Show fields of relation fields (advanced)** option,
|
||||
you will then be able to choose from the complete list of fields for each column.
|
||||
When another record is imported that links to the first one, use **XXX/ID** (XXX/External ID) for
|
||||
the original unique identifier. This record can also be found using its name.
|
||||
|
||||
.. warning::
|
||||
It should be noted that there will be a conflict if two or more records have the same name.
|
||||
|
||||
The :guilabel:`External ID` (ID) can also be used to update the original import, if modified data
|
||||
needs to be re-imported later, therefore, it is a good practice to specify it whenever possible.
|
||||
|
||||
Field missing to map column
|
||||
---------------------------
|
||||
|
||||
Odoo heuristically tries to find the type of field for each column inside the imported file, based
|
||||
on the first ten lines of the files.
|
||||
|
||||
For example, if there is a column only containing numbers, only the fields with the *integer* type
|
||||
are presented as options.
|
||||
|
||||
While this behavior might be beneficial in most cases, it is also possible that it could fail, or
|
||||
the column may be mapped to a field that is not proposed by default.
|
||||
|
||||
If this happens, check the :guilabel:`Show fields of relation fields (advanced) option`, then a
|
||||
complete list of fields becomes available for each column.
|
||||
|
||||
.. image:: export_import_data/field_list.png
|
||||
:align: center
|
||||
:alt: Searching for the field to match the tax column.
|
||||
|
||||
Where can I change the date import format?
|
||||
------------------------------------------
|
||||
|
||||
Odoo can automatically detect if a column is a date, and it will try to guess the date format from a
|
||||
set of most commonly used date formats. While this process can work for many date formats, some date
|
||||
formats will not be recognized. This can cause confusion due to day-month inversions; it is
|
||||
difficult to guess which part of a date format is the day and which part is the month in a date such
|
||||
as '01-03-2016'.
|
||||
|
||||
To view which date format Odoo has found from your file you can check the **Date Format** that is
|
||||
shown when clicking on **Options** under the file selector. If this format is incorrect you can
|
||||
change it to your liking using the *ISO 8601* to define the format.
|
||||
Change data import format
|
||||
-------------------------
|
||||
|
||||
.. note::
|
||||
If you are importing an excel (.xls, .xlsx) file, you can use date cells to store dates as the
|
||||
display of dates in excel is different from the way it is stored. That way you will be sure that
|
||||
the date format is correct in Odoo whatever your locale date format is.
|
||||
Odoo can automatically detect if a column is a date, and tries to guess the date format from a
|
||||
set of most commonly used date formats. While this process can work for many date formats, some
|
||||
date formats are not recognizable. This can cause confusion, due to day-month inversions; it is
|
||||
difficult to guess which part of a date format is the day, and which part is the month, in a
|
||||
date, such as `01-03-2016`.
|
||||
|
||||
Can I import numbers with currency sign (e.g.: $32.00)?
|
||||
-------------------------------------------------------
|
||||
When importing a :abbr:`CSV (Comma-separated Values)` file, Odoo provides :guilabel:`Formatting`
|
||||
options.
|
||||
|
||||
Yes, we fully support numbers with parenthesis to represent negative sign as well as numbers with
|
||||
currency sign attached to them. Odoo also automatically detect which thousand/decimal separator you
|
||||
use (you can change those under **options**). If you use a currency symbol that is not known to
|
||||
Odoo, it might not be recognized as a number though and it will crash.
|
||||
To view which date format Odoo has found from the file, check the :guilabel:`Date Format` that is
|
||||
shown when clicking on options under the file selector. If this format is incorrect, change it to
|
||||
the preferred format using *ISO 8601* to define the format.
|
||||
|
||||
Examples of supported numbers (using thirty-two thousands as an example):
|
||||
.. important::
|
||||
*ISO 8601* is an international standard, covering the worldwide exchange, along with the
|
||||
communication of date and time-related data. For example, the date format should be `YYYY-MM-DD`.
|
||||
So, in the case of July 24th 1981, it should be written as `1981-07-24`.
|
||||
|
||||
.. tip::
|
||||
When importing Excel files (`.xls`, `.xlsx`), consider using *date cells* to store dates. This
|
||||
maintains locale date formats for display, regardless of how the date is formatted in Odoo. When
|
||||
importing a :abbr:`CSV (Comma-separated Values)` file, use Odoo's :guilabel:`Formatting` section
|
||||
to select the date format columns to import.
|
||||
|
||||
Import numbers with currency signs
|
||||
----------------------------------
|
||||
|
||||
Odoo fully supports numbers with parenthesis to represent negative signs, as well as numbers with
|
||||
currency signs attached to them. Odoo also automatically detects which thousand/decimal separator is
|
||||
used. If a currency symbol unknown to Odoo is used, it might not be recognized as a number, and the
|
||||
import crashes.
|
||||
|
||||
.. note::
|
||||
When importing a :abbr:`CSV (Comma-separated Values)` file, the :guilabel:`Formatting` menu
|
||||
appears on the left-hand column. Under these options, the :guilabel:`Thousands Separator` can be
|
||||
changed.
|
||||
|
||||
Examples of supported numbers (using 'thirty-two thousand' as the figure):
|
||||
|
||||
- 32.000,00
|
||||
- 32000,00
|
||||
@@ -176,156 +255,191 @@ Example that will not work:
|
||||
- ABC 32.000,00
|
||||
- $ (32.000,00)
|
||||
|
||||
What can I do when the Import preview table isn't displayed correctly?
|
||||
----------------------------------------------------------------------
|
||||
.. important::
|
||||
A :guilabel:`() (parenthesis)` around the number indicates that the number is a negative value.
|
||||
The currency symbol **must** be placed within the parenthesis for Odoo to recognize it as a
|
||||
negative currency value.
|
||||
|
||||
By default the Import preview is set on commas as field separators and quotation marks as text
|
||||
delimiters. If your csv file does not have these settings, you can modify the File Format Options
|
||||
(displayed under the Browse CSV file bar after you select your file).
|
||||
Import preview table not displayed correctly
|
||||
--------------------------------------------
|
||||
|
||||
Note that if your CSV file has a tabulation as separator, Odoo will not detect the separations. You
|
||||
will need to change the file format options in your spreadsheet application. See the following
|
||||
question.
|
||||
By default, the import preview is set on commas as field separators, and quotation marks as text
|
||||
delimiters. If the :abbr:`CSV (Comma-separated Values)` file does not have these settings, modify
|
||||
the :guilabel:`Formatting` options (displayed under the :guilabel:`Import` :abbr:`CSV
|
||||
(Comma-separated Values)` file bar after selecting the :abbr:`CSV (Comma-separated Values)` file).
|
||||
|
||||
How can I change the CSV file format options when saving in my spreadsheet application?
|
||||
---------------------------------------------------------------------------------------
|
||||
.. important::
|
||||
If the :abbr:`CSV (Comma-separated Values)` file has a tabulation as a separator, Odoo does
|
||||
**not** detect the separations. The file format options need to be modified in the spreadsheet
|
||||
application. See the following :ref:`Change CSV file format <export_import_data/change-csv>`
|
||||
section.
|
||||
|
||||
If you edit and save CSV files in spreadsheet applications, your computer's regional settings will
|
||||
be applied for the separator and delimiter. We suggest you use OpenOffice or LibreOffice Calc as
|
||||
they will allow you to modify all three options (in :menuselection:`'Save As' dialog box --> Check the
|
||||
box 'Edit filter settings' --> Save`).
|
||||
.. _export_import_data/change-csv:
|
||||
|
||||
Microsoft Excel will allow you to modify only the encoding when saving (in :menuselection:`'Save As'
|
||||
dialog box --> click 'Tools' dropdown list --> Encoding tab`).
|
||||
Change CSV file format in spreadsheet application
|
||||
-------------------------------------------------
|
||||
|
||||
What's the difference between Database ID and External ID?
|
||||
----------------------------------------------------------
|
||||
When editing and saving :abbr:`CSV (Comma-separated Values)` files in spreadsheet applications, the
|
||||
computer's regional settings are applied for the separator and delimiter. Odoo suggests using
|
||||
*OpenOffice* or *LibreOffice*, as both applications allow modifications of all three options (from
|
||||
*LibreOffice* application, go to :menuselection:`'Save As' dialog box --> Check the box 'Edit filter
|
||||
settings' --> Save`).
|
||||
|
||||
Microsoft Excel can modify the encoding when saving (:menuselection:`'Save As' dialog box -->
|
||||
'Tools' drop-down menu --> Encoding tab`).
|
||||
|
||||
Difference between Database ID and External ID
|
||||
----------------------------------------------
|
||||
|
||||
Some fields define a relationship with another object. For example, the country of a contact is a
|
||||
link to a record of the 'Country' object. When you want to import such fields, Odoo will have to
|
||||
recreate links between the different records. To help you import such fields, Odoo provides three
|
||||
mechanisms. You must use one and only one mechanism per field you want to import.
|
||||
link to a record of the 'Country' object. When such fields are imported, Odoo has to recreate links
|
||||
between the different records. To help import such fields, Odoo provides three mechanisms.
|
||||
|
||||
For example, to reference the country of a contact, Odoo proposes you 3 different fields to import:
|
||||
.. important::
|
||||
**Only one** mechanism should be used per field that is imported.
|
||||
|
||||
- Country: the name or code of the country
|
||||
- Country/Database ID: the unique Odoo ID for a record, defined by the ID postgresql column
|
||||
- Country/External ID: the ID of this record referenced in another application (or the .XML file
|
||||
that imported it)
|
||||
For example, to reference the country of a contact, Odoo proposes three different fields to import:
|
||||
|
||||
For the country Belgium, you can use one of these 3 ways to import:
|
||||
- :guilabel:`Country`: the name or code of the country
|
||||
- :guilabel:`Country/Database ID`: the unique Odoo ID for a record, defined by the ID PostgreSQL
|
||||
column
|
||||
- :guilabel:`Country/External ID`: the ID of this record referenced in another application (or the
|
||||
`.XML` file that imported it)
|
||||
|
||||
- Country: Belgium
|
||||
- Country/Database ID: 21
|
||||
- Country/External ID: base.be
|
||||
For the country of Belgium, for example, use one of these three ways to import:
|
||||
|
||||
According to your need, you should use one of these 3 ways to reference records in relations. Here
|
||||
is when you should use one or the other, according to your need:
|
||||
- :guilabel:`Country`: `Belgium`
|
||||
- :guilabel:`Country/Database ID`: `21`
|
||||
- :guilabel:`Country/External ID`: `base.be`
|
||||
|
||||
- Use Country: This is the easiest way when your data come from CSV files that have been created
|
||||
manually.
|
||||
- Use Country/Database ID: You should rarely use this notation. It's mostly used by developers as
|
||||
it's main advantage is to never have conflicts (you may have several records with the same name,
|
||||
According to the company's need, use one of these three ways to reference records in relations. Here
|
||||
is an example when one or the other should be used, according to the need:
|
||||
|
||||
- Use :guilabel:`Country`: this is the easiest way when data comes from :abbr:`CSV (Comma-separated
|
||||
Values)` files that have been created manually.
|
||||
- Use :guilabel:`Country/Database ID`: this should rarely be used. It is mostly used by developers
|
||||
as the main advantage is to never have conflicts (there may be several records with the same name,
|
||||
but they always have a unique Database ID)
|
||||
- Use Country/External ID: Use External ID when you import data from a third party application.
|
||||
- Use :guilabel:`Country/External ID`: use *External ID* when importing data from a third-party
|
||||
application.
|
||||
|
||||
When you use External IDs, you can import CSV files with the "External ID" column to define the
|
||||
External ID of each record you import. Then, you will be able to make a reference to that record
|
||||
with columns like "Field/External ID". The following two CSV files give you an example for Products
|
||||
and their Categories.
|
||||
When *External IDs* are used, import :abbr:`CSV (Comma-separated Values)` files with the
|
||||
:guilabel:`External ID` (ID) column defining the *External ID* of each record that is imported.
|
||||
Then, a reference can be made to that record with columns, like `Field/External ID`. The following
|
||||
two :abbr:`CSV (Comma-separated Values)` files provide an example for products and their categories.
|
||||
|
||||
:download:`CSV file for categories
|
||||
<export_import_data/External_id_3rd_party_application_product_categories.csv>`.
|
||||
- :download:`CSV file for categories
|
||||
<export_import_data/External_id_3rd_party_application_product_categories.csv>`
|
||||
- :download:`CSV file for Products
|
||||
<export_import_data/External_id_3rd_party_application_products.csv>`
|
||||
|
||||
:download:`CSV file for Products
|
||||
<export_import_data/External_id_3rd_party_application_products.csv>`.
|
||||
.. _export_import_data/relation-fields:
|
||||
|
||||
What can I do if I have multiple matches for a field?
|
||||
-----------------------------------------------------
|
||||
Import relation fields
|
||||
----------------------
|
||||
|
||||
If for example you have two product categories with the child name "Sellable" (ie. "Misc.
|
||||
Products/Sellable" & "Other Products/Sellable"), your validation is halted but you may still import
|
||||
your data. However, we recommend you do not import the data because they will all be linked to the
|
||||
first 'Sellable' category found in the Product Category list ("Misc. Products/Sellable"). We
|
||||
recommend you modify one of the duplicates' values or your product category hierarchy.
|
||||
An Odoo object is always related to many other objects (e.g. a product is linked to product
|
||||
categories, attributes, vendors, etc.). To import those relations, the records of the related object
|
||||
need to be imported first, from their own list menu.
|
||||
|
||||
However if you do not wish to change your configuration of product categories, we recommend you use
|
||||
make use of the external ID for this field 'Category'.
|
||||
This can be achieved by using either the name of the related record, or its ID, depending on the
|
||||
circumstances. The ID is expected when two records have the same name. In such a case add `/ ID`
|
||||
at the end of the column title (e.g. for product attributes: `Product Attributes / Attribute / ID`).
|
||||
|
||||
How can I import a many2many relationship field (e.g. a customer that has multiple tags)?
|
||||
-----------------------------------------------------------------------------------------
|
||||
Options for multiple matches on fields
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The tags should be separated by a comma without any spacing. For example, if you want your customer
|
||||
to be linked to both tags 'Manufacturer' and 'Retailer' then you will encode "Manufacturer,Retailer"
|
||||
in the same column of your CSV file.
|
||||
If, for example, there are two product categories with the child name `Sellable` (e.g. `Misc.
|
||||
Products/Sellable` & `Other Products/Sellable`), the validation is halted, but the data may still be
|
||||
imported. However, Odoo recommends that the data is not imported because it will all be linked to
|
||||
the first `Sellable` category found in the *Product Category* list (`Misc. Products/Sellable`).
|
||||
Odoo, instead, recommends modifying one of the duplicate's values, or the product category
|
||||
hierarchy.
|
||||
|
||||
:download:`CSV file for Manufacturer, Retailer <export_import_data/m2m_customers_tags.csv>`
|
||||
However, if the company does not wish to change the configuration of product categories, Odoo
|
||||
recommends making use of the *External ID* for this field, 'Category'.
|
||||
|
||||
Import many2many relationship fields
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
How can I import a one2many relationship (e.g. several Order Lines of a Sales Order)?
|
||||
-------------------------------------------------------------------------------------
|
||||
The tags should be separated by a comma, without any spacing. For example, if a customer needs to be
|
||||
linked to both tags: `Manufacturer` and `Retailer` then 'Manufacturer,Retailer' needs to be encoded
|
||||
in the same column of the :abbr:`CSV (Comma-separated Values)` file.
|
||||
|
||||
If you want to import sales order having several order lines; for each order line, you need to
|
||||
reserve a specific row in the CSV file. The first order line will be imported on the same row as the
|
||||
information relative to order. Any additional lines will need an additional row that does not have
|
||||
any information in the fields relative to the order. As an example, here is
|
||||
``purchase.order_functional_error_line_cant_adpat.CSV`` file of some quotations you can import,
|
||||
based on demo data.
|
||||
- :download:`CSV file for Manufacturer, Retailer <export_import_data/m2m_customers_tags.csv>`
|
||||
|
||||
:download:`File for some Quotations <export_import_data/purchase.order_functional_error_line_cant_adpat.csv>`.
|
||||
Import one2many relationships
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The following CSV file shows how to import purchase orders with their respective purchase order
|
||||
lines:
|
||||
If a company wants to import a sales order with several order lines, a specific row **must** be
|
||||
reserved in the :abbr:`CSV (Comma-separated Values)` file for each order line. The first order line
|
||||
is imported on the same row as the information relative to order. Any additional lines need an
|
||||
additional row that does not have any information in the fields relative to the order.
|
||||
|
||||
:download:`Purchase orders with their respective purchase order lines <export_import_data/o2m_purchase_order_lines.csv>`.
|
||||
As an example, here is a :abbr:`CSV (Comma-separated Values)` file of some quotations that can be
|
||||
imported, based on demo data:
|
||||
|
||||
The following CSV file shows how to import customers and their respective contacts:
|
||||
- :download:`File for some Quotations
|
||||
<export_import_data/purchase.order_functional_error_line_cant_adpat.csv>`
|
||||
|
||||
:download:`Customers and their respective contacts <export_import_data/o2m_customers_contacts.csv>`.
|
||||
The following :abbr:`CSV (Comma-separated Values)` file shows how to import purchase orders with
|
||||
their respective purchase order lines:
|
||||
|
||||
Can I import several times the same record?
|
||||
-------------------------------------------
|
||||
- :download:`Purchase orders with their respective purchase order lines
|
||||
<export_import_data/o2m_purchase_order_lines.csv>`
|
||||
|
||||
If you import a file that contains one of the column "External ID" or "Database ID", records that
|
||||
have already been imported will be modified instead of being created. This is very useful as it
|
||||
allows you to import several times the same CSV file while having made some changes in between two
|
||||
imports. Odoo will take care of creating or modifying each record depending if it's new or not.
|
||||
The following :abbr:`CSV (Comma-separated Values)` file shows how to import customers and their
|
||||
respective contacts:
|
||||
|
||||
This feature allows you to use the Import/Export tool of Odoo to modify a batch of records in your
|
||||
favorite spreadsheet application.
|
||||
- :download:`Customers and their respective contacts
|
||||
<export_import_data/o2m_customers_contacts.csv>`
|
||||
|
||||
What happens if I do not provide a value for a specific field?
|
||||
Import records several times
|
||||
----------------------------
|
||||
|
||||
If an imported file contains one of the columns: :guilabel:`External ID` or :guilabel:`Database ID`,
|
||||
records that have already been imported are modified, instead of being created. This is extremely
|
||||
useful as it allows users to import the same :abbr:`CSV (Comma-separated Values)` file several
|
||||
times, while having made some changes in between two imports.
|
||||
|
||||
Odoo takes care of creating or modifying each record, depending if it is new or not.
|
||||
|
||||
This feature allows a company to use the *Import/Export tool* in Odoo to modify a batch of records
|
||||
in a spreadsheet application.
|
||||
|
||||
Value not provided for a specific field
|
||||
---------------------------------------
|
||||
|
||||
If all fields are not set in the CSV file, Odoo assigns the default value for every non-defined
|
||||
field. But, if fields are set with empty values in the :abbr:`CSV (Comma-separated Values)` file,
|
||||
Odoo sets the empty value in the field, instead of assigning the default value.
|
||||
|
||||
Export/import different tables from an SQL application to Odoo
|
||||
--------------------------------------------------------------
|
||||
|
||||
If you do not set all fields in your CSV file, Odoo will assign the default value for every non
|
||||
defined fields. But if you set fields with empty values in your CSV file, Odoo will set the EMPTY
|
||||
value in the field, instead of assigning the default value.
|
||||
If data needs to be imported from different tables, relations need to be recreated between records
|
||||
belonging to different tables. For instance, if companies and people are imported, the link between
|
||||
each person and the company they work for needs to be recreated.
|
||||
|
||||
How to export/import different tables from an SQL application to Odoo?
|
||||
----------------------------------------------------------------------
|
||||
To manage relations between tables, use the `External ID` facilities of Odoo. The `External ID` of a
|
||||
record is the unique identifier of this record in another application. The `External ID` must be
|
||||
unique across all records of all objects. It is a good practice to prefix this `External ID` with
|
||||
the name of the application or table. (like, 'company_1', 'person_1' - instead of '1')
|
||||
|
||||
If you need to import data from different tables, you will have to recreate relations between
|
||||
records belonging to different tables. (e.g. if you import companies and persons, you will have to
|
||||
recreate the link between each person and the company they work for).
|
||||
As an example, suppose there is an SQL database with two tables that are to be imported: companies
|
||||
and people. Each person belongs to one company, so the link between a person and the company they
|
||||
work for must be recreated.
|
||||
|
||||
To manage relations between tables, you can use the "External ID" facilities of Odoo. The "External
|
||||
ID" of a record is the unique identifier of this record in another application. This "External ID"
|
||||
must be unique across all the records of all objects, so it's a good practice to prefix this
|
||||
"External ID" with the name of the application or table. (like 'company_1', 'person_1' instead of
|
||||
'1')
|
||||
Test this example, with a :download:`sample of a PostgreSQL database
|
||||
<export_import_data/database_import_test.sql>`.
|
||||
|
||||
As an example, suppose you have a SQL database with two tables you want to import: companies and
|
||||
persons. Each person belong to one company, so you will have to recreate the link between a person
|
||||
and the company he work for. (If you want to test this example, here is a :download:`dump of such a
|
||||
PostgreSQL database <export_import_data/database_import_test.sql>`)
|
||||
|
||||
We will first export all companies and their "External ID". In PSQL, write the following command:
|
||||
First, export all companies and their *External ID*. In PSQL, write the following command:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
> copy (select 'company_'||id as "External ID",company_name as "Name",'True' as "Is a Company" from companies) TO '/tmp/company.csv' with CSV HEADER;
|
||||
|
||||
This SQL command will create the following CSV file:
|
||||
This SQL command creates the following :abbr:`CSV (Comma-separated Values)` file:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
@@ -334,13 +448,14 @@ This SQL command will create the following CSV file:
|
||||
company_2,Organi,True
|
||||
company_3,Boum,True
|
||||
|
||||
To create the CSV file for persons, linked to companies, we will use the following SQL command in PSQL:
|
||||
To create the :abbr:`CSV (Comma-separated Values)` file for people linked to companies, use the
|
||||
following SQL command in PSQL:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
> copy (select 'person_'||id as "External ID",person_name as "Name",'False' as "Is a Company",'company_'||company_id as "Related Company/External ID" from persons) TO '/tmp/person.csv' with CSV
|
||||
|
||||
It will produce the following CSV file:
|
||||
It produces the following :abbr:`CSV (Comma-separated Values)` file:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
@@ -350,62 +465,13 @@ It will produce the following CSV file:
|
||||
person_3,Eric,False,company_2
|
||||
person_4,Ramsy,False,company_3
|
||||
|
||||
As you can see in this file, Fabien and Laurence are working for the Bigees company (company_1) and
|
||||
Eric is working for the Organi company. The relation between persons and companies is done using the
|
||||
External ID of the companies. We had to prefix the "External ID" by the name of the table to avoid a
|
||||
conflict of ID between persons and companies (person_1 and company_1 who shared the same ID 1 in the
|
||||
original database).
|
||||
In this file, Fabien and Laurence are working for the Bigees company (`company_1`), and Eric is
|
||||
working for the Organi company. The relation between people and companies is done using the
|
||||
*External ID* of the companies. The *External ID* is prefixed by the name of the table to avoid a
|
||||
conflict of ID between people and companies (`person_1` and `company_1`, who shared the same ID 1 in
|
||||
the original database).
|
||||
|
||||
The two files produced are ready to be imported in Odoo without any modifications. After having
|
||||
imported these two CSV files, you will have 4 contacts and 3 companies. (the firsts two contacts are
|
||||
linked to the first company). You must first import the companies and then the persons.
|
||||
|
||||
How to adapt an import template
|
||||
===============================
|
||||
|
||||
Import templates are provided in the import tool of the most common data to
|
||||
import (contacts, products, bank statements, etc.).
|
||||
You can open them with any spreadsheets software (Microsoft Office,
|
||||
OpenOffice, Google Drive, etc.).
|
||||
|
||||
How to customize the file
|
||||
=========================
|
||||
|
||||
* Remove columns you don't need. We advise to not remove the *ID* one (see
|
||||
why here below).
|
||||
* Set a unique ID to every single record by dragging down the ID sequencing.
|
||||
|
||||
.. image:: export_import_data/dragdown.gif
|
||||
:align: center
|
||||
|
||||
* When you add a new column, Odoo might not be able to map it automatically if its
|
||||
label doesn't fit any field of the system.
|
||||
If so, find the corresponding field using the search.
|
||||
|
||||
.. image:: export_import_data/field_list.png
|
||||
:align: center
|
||||
|
||||
Then, use the label you found in your import template in order to make it work
|
||||
straight away the very next time you try to import.
|
||||
|
||||
Why an “ID” column
|
||||
==================
|
||||
|
||||
The **ID** (External ID) is an unique identifier for the line item.
|
||||
Feel free to use the one of your previous software to ease the transition to Odoo.
|
||||
|
||||
Setting an ID is not mandatory when importing but it helps in many cases:
|
||||
|
||||
* Update imports: you can import the same file several times without creating duplicates;
|
||||
* Import relation fields (see here below).
|
||||
|
||||
How to import relation fields
|
||||
=============================
|
||||
|
||||
An Odoo object is always related to many other objects (e.g. a product is linked
|
||||
to product categories, attributes, vendors, etc.). To import those relations you need to
|
||||
import the records of the related object first from their own list menu.
|
||||
|
||||
You can do it using either the name of the related record or its ID. The ID is expected when
|
||||
two records have the same name. In such a case add " / ID" at the end of the column title
|
||||
(e.g. for product attributes: Product Attributes / Attribute / ID).
|
||||
imported these two :abbr:`CSV (Comma-separated Values)` files, there are four contacts and three
|
||||
companies (the first two contacts are linked to the first company). Keep in mind to first import
|
||||
the companies, and then the people.
|
||||
|
||||
|
After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 36 KiB |
@@ -307,6 +307,32 @@ directly to a product line.
|
||||
.. image:: taxes/list-sequence.png
|
||||
:alt: The taxes' sequence in Odoo determines which tax is applied first
|
||||
|
||||
Extra taxes
|
||||
===========
|
||||
|
||||
"Extra taxes" is a broad term referring to additional taxes beyond the standard or basic taxes
|
||||
imposed by governments. These extra taxes can be **luxury** taxes, **environmental** taxes,
|
||||
**import** or **export duties** taxes, etc.
|
||||
|
||||
.. note::
|
||||
The method to compute these taxes varies across different countries. We recommend consulting your
|
||||
country's regulations to understand how to calculate them for your business.
|
||||
|
||||
To compute an extra tax in Odoo, :ref:`create a tax <taxes/configuration>`, enter a tax name, select
|
||||
a :ref:`Tax Computation <taxes/configuration>`, set an :guilabel:`Amount`, and in the
|
||||
:guilabel:`Advanced Options` tab, check :guilabel:`Affect Base of Subsequent Taxes`. Then, drag and
|
||||
drop the taxes in the :ref:`order they should be computed <taxes/base-subsequent>`.
|
||||
|
||||
.. example::
|
||||
- In Belgium, the formula to compute an environmental tax is: `(product price + environmental
|
||||
tax) x sales tax`. Therefore, our environmental tax has to come *before* the sales tax in the
|
||||
computation sequence.
|
||||
- In our case, we created a 5% environmental tax (Ecotax) and put it *before* the Belgian base
|
||||
tax of 21%.
|
||||
|
||||
.. image:: taxes/ecotax.png
|
||||
:alt: Environmental tax sequence in Belgium.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`taxes/fiscal_positions`
|
||||
- :doc:`taxes/B2B_B2C`
|
||||
|
||||
|
After Width: | Height: | Size: 6.7 KiB |
@@ -22,10 +22,10 @@ localization:
|
||||
- Default :ref:`fiscal localization package <fiscal_localizations/packages>`
|
||||
* - Italy - E-invoicing
|
||||
- `l10n_it_edi`
|
||||
- e-invoice implementation
|
||||
* - Italy - E-invoicing
|
||||
- E-invoice implementation
|
||||
* - Italy - E-invoicing (Withholding)
|
||||
- `l10n_it_edi_withholding`
|
||||
- e-invoice withholding
|
||||
- E-invoice withholding
|
||||
* - Italy - Accounting Reports
|
||||
- `l10n_it_reports`
|
||||
- Country-specific reports
|
||||
@@ -33,10 +33,6 @@ localization:
|
||||
- `l10n_it_stock_ddt`
|
||||
- Transport documents - Documento di Trasporto (DDT)
|
||||
|
||||
.. image:: italy/italy-modules.png
|
||||
:align: center
|
||||
:alt: Italian localization modules
|
||||
|
||||
Company information
|
||||
-------------------
|
||||
|
||||
@@ -49,70 +45,149 @@ section, click :guilabel:`Update info`. From here, fill out the fields:
|
||||
- :guilabel:`Codice Fiscale`: the fiscal code of the company;
|
||||
- :guilabel:`Tax System`: the tax system under which the company falls;
|
||||
|
||||
.. image:: italy/italy-company.png
|
||||
:align: center
|
||||
:alt: Company information to provide
|
||||
.. image:: italy/company.png
|
||||
:alt: Company information to be provided
|
||||
|
||||
Taxes configuration
|
||||
-------------------
|
||||
|
||||
Many of the e-invoicing features are implemented using Odoo's tax system. As such, taxes must be
|
||||
properly configured to generate invoices correctly and handle other billing use cases.
|
||||
|
||||
The **Italian** localization contains predefined **examples** of taxes for various purposes.
|
||||
|
||||
.. _italy/tax-exemption:
|
||||
|
||||
Tax exemption
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
The use of sale taxes that amount to **zero percent** (0%) is required by Italian authorities to
|
||||
keep track of the exact :guilabel:`Tax Exemption Kind (Natura)` and :guilabel:`Law Reference` that
|
||||
justify the exemption operated on an invoice line.
|
||||
|
||||
.. example::
|
||||
The export tax in the EU can be used as reference (`0% EU`, invoice label `00eu`). It can be
|
||||
found under :menuselection:`Accounting --> Configuration --> Taxes`. Exports are exempt from VAT,
|
||||
and therefore, they require :guilabel:`Exoneration` kind and :guilabel:`Law Reference` filled in.
|
||||
|
||||
.. image:: italy/tax-exemption.png
|
||||
:alt: Tax Exemption Settings
|
||||
|
||||
.. seealso::
|
||||
There are many :guilabel:`Tax Exemption Kind (Natura)` and :guilabel:`Law Reference` codes. Make
|
||||
sure you check the latest version available to get the latest information on:
|
||||
|
||||
- `Italian authorities documentation <https://www.agenziaentrate.gov.it/portale/web/guest/aree-tematiche/fatturazione-elettronica>`_
|
||||
- `Official guide on Tax exemption <https://www.agenziaentrate.gov.it/portale/documents/20143/451259/Guida_compilazione-FE-Esterometro-V_1.9_2024-03-05.pdf/67fe4c2d-1174-e8de-f1ee-cea77b7f5203>`_
|
||||
|
||||
.. note::
|
||||
If you need to use a different kind of exoneration, go to :menuselection:`Accounting -->
|
||||
Configuration --> Taxes`, select a similar tax, then click on the cog icon and select
|
||||
:guilabel:`Duplicate`. In the :guilabel:`Advanced Options` tab, add the :guilabel:`Exoneration`
|
||||
and :guilabel:`Law Reference`. To confirm click on :guilabel:`Save`.
|
||||
|
||||
.. tip::
|
||||
**Rename** your taxes in the :guilabel:`Name` field according to their :guilabel:`Exoneration` to
|
||||
differentiate them easily.
|
||||
|
||||
.. _italy/reverse-charge:
|
||||
|
||||
Reverse charge
|
||||
==============
|
||||
|
||||
The **reverse charge** mechanism is a VAT rule that shifts the liability to pay VAT from the
|
||||
supplier to the customer. The customers pay the VAT *themselves* to the :abbr:`AdE (Agenzia delle
|
||||
Entrate)` instead. There are different types:
|
||||
|
||||
- | :guilabel:`Internal Reverse Charge` (for domestic sales)
|
||||
| The VAT responsibility is shifted to the buyer for certain categories of products and services.
|
||||
- | :guilabel:`External Reverse Charge` (for intra-EU sales)
|
||||
| VAT is due in the country of the delivery or in the country where the service is performed. When
|
||||
the buyer is itself an Italian business, then the EU offers a mechanism that allows the seller
|
||||
to transfer his responsibility to the buyer.
|
||||
|
||||
Invoices
|
||||
--------
|
||||
|
||||
**Reverse-charged** customer invoices show no VAT amount, but the :abbr:`AdE (Agenzia delle
|
||||
Entrate)` requires the seller to specify the :guilabel:`Tax Exemption` reason and the :guilabel:`Law
|
||||
Reference` that enable the reverse-charge mechanism. Odoo provides a set of special 0% taxes that
|
||||
can be assigned to each reverse-charged invoice lines, representing the most commonly used
|
||||
configurations.
|
||||
|
||||
Vendor bills
|
||||
------------
|
||||
|
||||
Italian companies subjected to Reverse Charge must send the information in the bill received to the
|
||||
:abbr:`AdE (Agenzia delle Entrate)`.
|
||||
|
||||
.. note::
|
||||
Self-reported VAT XML files must be issued and sent to the :abbr:`AdE (Agenzia Delle Entrate)`
|
||||
for reverse charged bills.
|
||||
|
||||
When creating a vendor bill, **reverse charge** taxes are available to be added in the
|
||||
:guilabel:`Taxes` field. You can check which taxes are available by going to
|
||||
:menuselection:`Accounting --> Configuration --> Taxes`, you can see that the 10% Goods and 22%
|
||||
Services taxes are activated, among others. Due to the automated configuration of the Italian fiscal
|
||||
position, these are automatically activated in the tax list.
|
||||
|
||||
.. _italy/grids:
|
||||
|
||||
Tax grids
|
||||
---------
|
||||
|
||||
The Italian localization has a specific :ref:`tax grid <tax-returns/tax-grids>` section for
|
||||
**reverse charge** taxes. These tax grids are identifiable by the :ref:`VJ <italy/grids>` tag, and
|
||||
can be found by going to :menuselection:`Accounting --> Reporting --> Audit Reports: Tax Report`.
|
||||
|
||||
.. image:: italy/grids.png
|
||||
:alt: Reverse charge tax grid from the VJ section of the Tax Declaration
|
||||
|
||||
.. _italy/e-invoicing:
|
||||
|
||||
E-invoicing
|
||||
-----------
|
||||
===========
|
||||
|
||||
The :abbr:`SdI (Sistema di Interscambio)` is the electronic invoicing system used in Italy. It
|
||||
enables to send and receive electronic invoices to and from customers. The documents must be in XML
|
||||
format and formally validated by the system before being delivered.
|
||||
The :abbr:`SdI (Sistema di Interscambio)` is the :doc:`electronic invoicing
|
||||
<../accounting/customer_invoices/electronic_invoicing>` system used in Italy. It enables the sending
|
||||
and receiving of electronic invoices to and from customers. The documents must be in an XML
|
||||
:abbr:`EDI (Electronic Data Interchange)` format called **FatturaPA** and formally validated by the
|
||||
system before being delivered.
|
||||
|
||||
To be able to receive invoices and notifications, the :abbr:`SdI (Sistema di Interscambio)` service
|
||||
must be notified that the user's files are to be sent to **Odoo** and processed on their behalf. To
|
||||
so, you must set up Odoo's :guilabel:`Codice Destinatario` on the **Agenzia Delle Entrate**
|
||||
portal.
|
||||
must be notified that the user's files need to be sent to Odoo and processed on their behalf. To do
|
||||
so, you must set up Odoo's :guilabel:`Destination Code` on the :abbr:`AdE (Agenzia Delle
|
||||
Entrate)` portal.
|
||||
|
||||
#. Go to https://ivaservizi.agenziaentrate.gov.it/portale/ and authenticate;
|
||||
#. Go to `Italian authorities portal <https://ivaservizi.agenziaentrate.gov.it/portale>`_ and
|
||||
authenticate;
|
||||
#. Go to section :menuselection:`Fatture e Corrispettivi`;
|
||||
#. Set the user as Legal Party for the VAT number you wish to configure the electronic address;
|
||||
#. In :menuselection:`Servizi Disponibili --> Fatturazione Elettronica --> Registrazione
|
||||
dell’indirizzo telematico dove ricevere tutte le fatture elettroniche`, insert Odoo's
|
||||
:guilabel:`Codice Destinatario` `K95IV18`, and confirm.
|
||||
:guilabel:`Destination Code` `K95IV18`, and confirm.
|
||||
|
||||
Electronic Data Interchange (EDI)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Odoo uses the **FatturaPA** :abbr:`EDI (Electronic Data Interchange)` format for the Italian
|
||||
localization and is enabled on the default journals when installed. When the **file processing
|
||||
authorization** has been set, all **invoices** and **bills** are automatically sent.
|
||||
|
||||
.. note::
|
||||
You can :ref:`enable electronic invoicing for other sales and purchase journals
|
||||
<e-invoicing/configuration>` than the default ones.
|
||||
|
||||
You can check the current status of an invoice by the :guilabel:`Electronic invoicing` field. The
|
||||
XML file can be found in the **chatter** of the invoice.
|
||||
|
||||
.. image:: italy/italy-test.png
|
||||
:align: center
|
||||
:alt: Electronic invoicing status (waiting for confirmation)
|
||||
|
||||
.. seealso::
|
||||
:doc:`../accounting/customer_invoices/electronic_invoicing`
|
||||
|
||||
File processing authorization (Odoo)
|
||||
------------------------------------
|
||||
EDI Mode and authorization
|
||||
--------------------------
|
||||
|
||||
Since the files are transmitted through Odoo's server before being sent to the :abbr:`SdI (Sistema
|
||||
di Interscambio)` or received by your database, you need to authorize Odoo to process your files
|
||||
from your database. To do so, go to :menuselection:`Accounting --> Configuration --> Settings -->
|
||||
Electronic Document Invoicing`.
|
||||
|
||||
There are **three** modes available:
|
||||
There are three modes available:
|
||||
|
||||
:guilabel:`Demo`
|
||||
This mode simulates an environment in which invoices are sent to the government. In this mode,
|
||||
invoices need to be *manually* downloaded as XML files and uploaded to the **Agenzia delle
|
||||
Entrate**'s website.
|
||||
:guilabel:`Test (experimental)`
|
||||
This mode sends invoices to a non-production (i.e., test) service made available by the **Agenzia
|
||||
delle Entrate**. Saving this change directs all companies on the database to use this
|
||||
configuration.
|
||||
:guilabel:`Official`
|
||||
This is a production mode that sends your invoices directly to the **Agenzia delle Entrate**.
|
||||
- | :guilabel:`Demo`
|
||||
| This mode simulates an environment in which invoices are sent to the government. In this mode,
|
||||
invoices need to be *manually* downloaded as XML files and uploaded to the :abbr:`AdE
|
||||
(Agenzia delle Entrate)`'s website.
|
||||
- | :guilabel:`Test (experimental)`
|
||||
| This mode sends invoices to a non-production (i.e., test) service made available by the
|
||||
:abbr:`AdE (Agenzia delle Entrate)`. Saving this change directs all companies on the database to
|
||||
use this configuration.
|
||||
- | :guilabel:`Official`
|
||||
| This is a production mode that sends your invoices directly to the :abbr:`AdE (Agenzia delle
|
||||
Entrate)`.
|
||||
|
||||
Once a mode is selected, you need to accept the **terms and conditions** by ticking :guilabel:`Allow
|
||||
Odoo to process invoices`, and then :guilabel:`Save`. You can now record your transactions in Odoo
|
||||
@@ -120,340 +195,436 @@ Accounting.
|
||||
|
||||
.. warning::
|
||||
Selecting either :guilabel:`Test (experimental)` or :guilabel:`Official` is **irreversible**.
|
||||
Once in :guilabel:`Official` mode, it is not possible to select :guilabel:`Test (experimental)`
|
||||
or :guilabel:`Demo`, and same for :guilabel:`Test (experimental)`. We recommend creating a
|
||||
separate database for testing purposes only.
|
||||
For example, once in :guilabel:`Official` mode, it is not possible to select :guilabel:`Test
|
||||
(experimental)` or :guilabel:`Demo`. We recommend creating a **separate database** for testing
|
||||
purposes only.
|
||||
|
||||
.. note::
|
||||
When in :guilabel:`Test (Experimental)` mode, all invoices sent *must* have a partner using one
|
||||
of the following fake :guilabel:`Codice Destinatario` given by the **Agenzia Delle Entrate**:
|
||||
`0803HR0` - `N8MIMM9` - `X9XX79Z`. Any real production :guilabel:`Codice Destinario` of your
|
||||
customers will not be recognized as valid by the test service.
|
||||
of the following fake :guilabel:`Destination Code` given by the :abbr:`AdE (Agenzia Delle
|
||||
Entrate)`: `0803HR0` - `N8MIMM9` - `X9XX79Z`. Any real production :guilabel:`Codice Destinario`
|
||||
of your customers will not be recognized as valid by the test service.
|
||||
|
||||
.. image:: italy/italy-edi.png
|
||||
:align: center
|
||||
:alt: Italy's electronic document invoicing options
|
||||
.. image:: italy/edi.png
|
||||
:alt: Electronic document invoicing settings
|
||||
|
||||
Taxes configuration
|
||||
===================
|
||||
.. _italy/e-invoicing-process:
|
||||
|
||||
Many of the e-invoicing features are implemented using Odoo's tax system. As such, it is very
|
||||
important that taxes are properly configured in order to generate invoices correctly and handle
|
||||
other billing use cases. For example, specific configurations are required for the **reverse
|
||||
charge** type of taxes. In case of a **reverse charge** tax, the seller does *not* charge the
|
||||
customer for the VAT but, instead, the customer pays the VAT *themselves* to their government. There
|
||||
are **two** main types:
|
||||
Process
|
||||
-------
|
||||
|
||||
- :ref:`external reverse charge <italy/external-reverse>`;
|
||||
- :ref:`internal reverse charge <italy/internal-reverse>`.
|
||||
|
||||
.. _italy/external-reverse:
|
||||
|
||||
External reverse charge
|
||||
-----------------------
|
||||
|
||||
Invoices
|
||||
~~~~~~~~
|
||||
|
||||
To make an export invoice, make sure that the invoice lines all use a tax configured for **reverse
|
||||
charge**. The **Italian** localization contains an **example** of a reverse charge tax for export in
|
||||
the EU to be used as reference (`0% EU`, invoice label `00eu`), which can be found under
|
||||
:menuselection:`Accounting --> Configuration --> Taxes`. Exports are exempt from VAT, and therefore
|
||||
**reverse charge** taxes require the :guilabel:`Has exoneration of tax (Italy)` option ticked, with
|
||||
both the :guilabel:`Exoneration` kind and :guilabel:`Law Reference` filled in.
|
||||
|
||||
.. image:: italy/italy-tax.png
|
||||
:align: center
|
||||
:alt: External reverse charge settings
|
||||
The submission of invoices to the :abbr:`SdI (Sistema di Interscambio)` for Italy is an electronic
|
||||
process used for the mandatory transmission of tax documents in XML format between companies and the
|
||||
:abbr:`AdE (Agenzia delle Entrate)` to reduce errors and verify the correctness of operations.
|
||||
|
||||
.. note::
|
||||
If you need to use a different kind of :guilabel:`Exoneration`, click :menuselection:`Action -->
|
||||
Duplicate` within the tax menu to create a copy of an existing similar tax. Then, select another
|
||||
:guilabel:`Exoneration`, and :guilabel:`Save`. Repeat this process as many times as you need
|
||||
different kind of :guilabel:`Exoneration` taxes.
|
||||
You can check the current status of an invoice by the :guilabel:`SdI State` field. The XML file
|
||||
is attached to the invoice.
|
||||
|
||||
.. tip::
|
||||
**Rename** your taxes in the :guilabel:`Name` field according to their :guilabel:`Exoneration` to
|
||||
differentiate them easily.
|
||||
.. image:: italy/edi-process.png
|
||||
:alt: EDI system architecture
|
||||
|
||||
On your invoice, select the corresponding tax you need in the :guilabel:`Taxes` field. You can find
|
||||
the following **additional info** by opening the **XML** file of the issued invoice:
|
||||
XML Documents creation
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- :guilabel:`SdI address (Codice Destinatario)`: must be filled for both **EU** or **non-EU**;
|
||||
- :guilabel:`Country Id`: must contain the country of the foreign seller in the two-letter ISO
|
||||
(Alpha-2) code (ex., `IT` for 'Italy');
|
||||
- :guilabel:`CAP`: must be filled with `00000`;
|
||||
- :guilabel:`Partita Iva` (**VAT number**): must contain the **VAT** number for **EU businesses**
|
||||
and `OO99999999999` (double 'O' **letter**, not 'zero') for **non-EU businesses**. In case of
|
||||
private customers without **VAT** number, use `0000000`;
|
||||
- :guilabel:`Fiscal Code`: for foreign entities without an actual **Codice Fiscale**, any
|
||||
recognizable identifier is valid.
|
||||
Odoo generates the required XML files as attachments to invoices in the `FatturaPA` format required
|
||||
by the :abbr:`AdE (Agenzia delle Entrate)`. Once the invoices needed are selected, go to
|
||||
:guilabel:`Action` and click on :guilabel:`Send and Print`.
|
||||
|
||||
.. note::
|
||||
Odoo does not support sending user-modified XML files.
|
||||
.. image:: italy/edi-menu.png
|
||||
:alt: Send and Print menu
|
||||
|
||||
For **invoices**, multiple configurations are technically identified by a :guilabel:`Tipo Documento`
|
||||
code:
|
||||
When the pop-up window opens there is a selection of actions that can be taken. :guilabel:`Generate
|
||||
XML File` generates the attachments.
|
||||
|
||||
- `TD02` - Down payments;
|
||||
- `TDO7` - Simplified invoice;
|
||||
- `TD08` - Simplified credit note;
|
||||
- `TD09` - Simplified debit note;
|
||||
- `TD24` - Deferred invoice.
|
||||
.. image:: italy/edi-send-and-print.png
|
||||
:alt: Send and Print dialog
|
||||
|
||||
.. tabs::
|
||||
The XML file as well as the PDF once can be found attached to the invoice.
|
||||
|
||||
.. tab:: `TD02`
|
||||
.. image:: italy/edi-attachments.png
|
||||
:alt: EDI Attachments
|
||||
|
||||
Down payments.
|
||||
Submission to SDI
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
**Down payment** invoices are imported/exported with a different :guilabel:`Tipo Documento`
|
||||
code `TDO2` than regular invoices. Upon import of the invoice, it creates a regular vendor
|
||||
bill.
|
||||
The :guilabel:`Send to Tax Agency` option in the :guilabel:`Send and Print` dialog sends the
|
||||
attachment to the :guilabel:`Proxy Server`, which gathers all requests and then forwards them via a
|
||||
WebServices channel to the :abbr:`SdI (Sistema di Interscambio)`. Check the sending status of the
|
||||
invoice through the :guilabel:`Check Sending` button at the top of the invoice's view.
|
||||
|
||||
Odoo exports moves as `TD02` if the following conditions are met:
|
||||
Processing by SDI
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
- Is an invoice;
|
||||
- All invoice lines are related to **sales order lines** that have the flag `is_downpayment`
|
||||
set as `True`.
|
||||
The :abbr:`SdI (Sistema di Interscambio)` receives the document and verifies for any errors. At this
|
||||
stage, the invoice is in the :guilabel:`SdI Processing` state, as shown on the invoice. The invoice
|
||||
also gets assigned a :guilabel:`FatturaPA Transaction` number that is shown in the
|
||||
:guilabel:`Electronic Invoicing` tab. The checks may take variable time, ranging from a few seconds
|
||||
up to a day, depending on the queue of invoices sent throughout Italy.
|
||||
|
||||
.. tab:: `TD07`, `TD08`, and `TD09`
|
||||
.. image:: italy/edi-processing.png
|
||||
:alt: Check Sending button and Sdi Processing state
|
||||
|
||||
Simplified invoices, and credit/debit notes.
|
||||
Acceptance
|
||||
~~~~~~~~~~
|
||||
|
||||
Simplified invoices and credit notes can be used to certify **domestic transactions** under
|
||||
**400 EUR** (VAT included). Its status is the same as a regular invoice, but with fewer
|
||||
information requirements.
|
||||
|
||||
For a **simplified** invoice to be established, it must include:
|
||||
|
||||
- :guilabel:`Customer Invoice` reference: **unique** numbering sequence with **no gaps**;
|
||||
- :guilabel:`Invoice Date`: issue **date** of the invoice;
|
||||
- :guilabel:`Company Info`: the **seller**'s full credentials (VAT/TIN number, name, full
|
||||
address) under :menuselection:`General Settings --> Companies (section)`;
|
||||
- :guilabel:`VAT`: the **buyer**'s VAT/TIN number (on their profile card);
|
||||
- :guilabel:`Total`: the total **amount** (VAT included) of the invoice.
|
||||
|
||||
In the :abbr:`EDI (Electronic Data Interchange)`, Odoo exports invoices as simplified if:
|
||||
|
||||
- It is a **domestic** transaction (i.e., the partner is from Italy);
|
||||
- The buyer's data is **insufficient** for a regular invoice;
|
||||
- The **required fields** for a regular invoice (address, ZIP code, city, country) are
|
||||
provided;
|
||||
- The total amount VAT included is **less** than **400 EUR**.
|
||||
|
||||
.. note::
|
||||
The 400 EUR threshold was defined in `the decree of the 10th of May 2019 in the Gazzetta
|
||||
Ufficiale <https://www.gazzettaufficiale.it/eli/id/2019/05/24/19A03271/sg>`_. We advise you
|
||||
to check the current official value.
|
||||
|
||||
.. tab:: `TD24`
|
||||
|
||||
Deferred invoices.
|
||||
|
||||
The **deferred invoice** is an invoice that is **issued at a later time** than the sale of
|
||||
goods or the provision of services. A **deferred invoice** has to be issued at the latest
|
||||
within the **15th day** of the month following the delivery covered by the document.
|
||||
|
||||
It usually is a **summary invoice** containing a list of multiple sales of goods or services,
|
||||
carried out in the month. The business is allowed to **group** the sales into **one invoice**,
|
||||
generally issued at the **end of the month** for accounting purposes. Deferred invoices are
|
||||
default for **wholesaler** having recurrent clients.
|
||||
|
||||
If the goods are transported by a **carrier**, every delivery has an associated **Documento di
|
||||
Transporto (DDT)**, or **Transport Document**. The deferred invoice **must** indicate the
|
||||
details of all the **DDTs** information for better tracing.
|
||||
|
||||
.. note::
|
||||
E-invoicing of deferred invoices requires the `l10n_it_stock_ddt`
|
||||
:ref:`module <italy/modules>`. In this case, a dedicated :guilabel:`Tipo Documento` `TD24`
|
||||
is used in the e-invoice.
|
||||
|
||||
Odoo exports moves as `TD24` if the following conditions are met:
|
||||
|
||||
- Is an invoice;
|
||||
- Is associated to deliveries whose **DDTs** have a **different** date than the issuance date
|
||||
of the invoice.
|
||||
|
||||
Vendor bills
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Italian companies buying goods or services from EU countries (or services from non-EU countries)
|
||||
must send the information contained within the bill received to the **Agenzia delle Entrate**. This
|
||||
allows you to complete tax-related information on your bill, and to send it. The seller must be set
|
||||
as :guilabel:`Cedente/Prestatore`, and the buyer as :guilabel:`Cessionario/Committente`. Contained
|
||||
within the **XML** document for the vendor bill, the vendor's credentials show as
|
||||
:guilabel:`Cedente/Prestatore`, and your company's credentials as
|
||||
:guilabel:`Cessionario/Committente`.
|
||||
|
||||
.. note::
|
||||
Self-billing invoices or VAT invoice integrations must be issued and sent to the tax agency.
|
||||
|
||||
When inputting taxes in a vendor bill, it is possible to select **reverse charge** taxes. These are
|
||||
automatically activated in the Italian fiscal position. By going to :menuselection:`Accounting -->
|
||||
Configuration --> Taxes`, the `10%` and `22%` :guilabel:`Goods` and :guilabel:`Services` tax scopes
|
||||
are activated and preconfigured with the correct tax grids. These are set up automatically to ensure
|
||||
the correct booking of accounting entries and display of the tax report.
|
||||
|
||||
For **vendor bills**, **three** types of configurations are technically identified by a code called
|
||||
:guilabel:`Tipo Documento`:
|
||||
|
||||
- `TD17` - Buying services from **EU** and **non-EU** countries;
|
||||
- `TD18` - Buying **goods** from **EU**;
|
||||
- `TD19` - Buying **goods** from a **foreign** vendor, but the **goods** are already in **Italy**
|
||||
in a **VAT deposit**.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. tab:: `TD17`
|
||||
|
||||
Buying **services** from **EU** and **non-EU** countries:
|
||||
|
||||
The foreign *seller* invoices a service with a **VAT-excluded** price, as it is not
|
||||
taxable in Italy. The VAT is paid by the *buyer* in Italy;
|
||||
|
||||
- Within EU: the *buyer* integrates the invoice received with the **VAT information**
|
||||
due in Italy (i.e., **vendor bill tax integration**);
|
||||
- Non-EU: the *buyer* sends themselves an invoice (i.e., **self-billing**).
|
||||
|
||||
Odoo exports a transaction as `TD17` if the following conditions are met:
|
||||
|
||||
- Is a vendor bill;
|
||||
- At least one tax on the invoice lines targets the tax grids :ref:`VJ <italy/grids>`;
|
||||
- All invoice lines either have :guilabel:`Services` as **products**, or a tax with the
|
||||
:guilabel:`Services` as **tax scope**.
|
||||
|
||||
.. tab:: `TD18`
|
||||
|
||||
Buying **goods** from **EU**:
|
||||
|
||||
Invoices issued within the EU follow a **standard format**, therefore only an integration of
|
||||
the existing invoice is required.
|
||||
|
||||
Odoo exports a transaction as `TD18` if the following conditions are met:
|
||||
|
||||
- Is a vendor bill;
|
||||
- At least one tax on the invoice lines targets the tax grids :ref:`VJ <italy/grids>`;
|
||||
- All invoice lines either have :guilabel:`Consumable` as **products**, or a tax with the
|
||||
:guilabel:`Goods` as **tax scope**.
|
||||
|
||||
.. tab:: `TD19`
|
||||
|
||||
Buying **goods** from a **foreign** vendor, but the **goods** are already in **Italy** in a
|
||||
**VAT deposit**:
|
||||
|
||||
- From EU: the *buyer* integrates the invoice received with the **VAT information** due in
|
||||
Italy (i.e., **vendor bill tax integration**);
|
||||
- Non-EU: the *buyer* sends an invoice to *themselves* (i.e., **self-billing**).
|
||||
|
||||
Odoo exports a move as a `TD19` if the following conditions are met:
|
||||
|
||||
- Is a vendor bill;
|
||||
- At least one tax on the invoice lines targets the tax grid :ref:`VJ3 <italy/grids>`;
|
||||
- All invoice lines either have :guilabel:`Consumable` products, or a tax with
|
||||
:guilabel:`Goods` as tax scope.
|
||||
If the document is valid, it is recorded and considered fiscally valid by the :abbr:`AdE (Agenzia
|
||||
delle Entrate)`, which will proceed with archiving in :guilabel:`Substitute Storage (Conservazione
|
||||
Sostitutiva)` if explicitly requested on the Agency's portal.
|
||||
|
||||
.. warning::
|
||||
Odoo does not offer the
|
||||
`Conservazione Sostitutiva <https://www.agid.gov.it/index.php/it/piattaforme/conservazione>`_
|
||||
requirements. Other providers and **Agenzia delle Entrate** supply free and certified storage to
|
||||
meet the requested conditions.
|
||||
Odoo does not offer the `Conservazione Sostitutiva
|
||||
<https://www.agid.gov.it/index.php/it/piattaforme/conservazione>`_ requirements. Other providers
|
||||
and :abbr:`AdE (Agenzia delle Entrate)` supply free and certified storage to meet the
|
||||
specifications requested by law.
|
||||
|
||||
.. _italy/internal-reverse:
|
||||
The :abbr:`SdI (Sistema di Interscambio)` :guilabel:`Destination Code` attempts to forward the
|
||||
invoice to the customer at the provided address, whether it is a `PEC` email address or a
|
||||
:abbr:`SdI (Sistema di Interscambio)` :guilabel:`Destination Code` for their ERP's WebServices
|
||||
channels. A maximum of 6 attempts are made every 12 hours, so even if unsuccessful, this process can
|
||||
take up to three days. The invoice status is :guilabel:`Accepted by SDI, Forwarding to Partner`.
|
||||
|
||||
Internal reverse charge
|
||||
-----------------------
|
||||
Possible Rejection
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. warning::
|
||||
Odoo currently does not support domestic **internal reverse charge** processes.
|
||||
The :abbr:`SdI (Sistema di Interscambio)` may find inaccuracies in the compilation, possibly even
|
||||
formal ones. In this case, the invoice is in the :guilabel:`SDI Rejected` state. The :abbr:`SdI
|
||||
(Sistema di Interscambio)`'s observations are inserted at the top of the Invoice tab. To resolve the
|
||||
issue, it is sufficient to delete the attachments of the invoice, return the invoice to
|
||||
:guilabel:`Draft`, and fix the errors. Once the invoice is ready, it can be resent.
|
||||
|
||||
.. _italy/grids:
|
||||
.. note::
|
||||
To regenerate the XML, both the XML attachment and the PDF report must be deleted, so that they
|
||||
are then regenerated together. This ensures that both always contain the same data.
|
||||
|
||||
'Reverse Charge' tax grids
|
||||
--------------------------
|
||||
.. image:: italy/edi-rejected.png
|
||||
:alt: EDI Rejected State
|
||||
|
||||
The Italian localization has a specific **tax grid** section for **reverse charge** taxes. These
|
||||
tax grids are identifiable by the :ref:`VJ <italy/grids>` tag, and can be found under
|
||||
:menuselection:`Accounting --> Reporting --> Audit Reports: Tax Report`.
|
||||
Forwarding Completed
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. image:: italy/italy-grids.png
|
||||
:align: center
|
||||
:alt: Italian reverse charge tax grids
|
||||
The invoice has been delivered to the customer; however, you can still send a copy to the customer
|
||||
in PDF via email or post. Its status is :guilabel:`Accepted by SDI, Delivered to Partner`.
|
||||
|
||||
San Marino
|
||||
==========
|
||||
If the :abbr:`SdI (Sistema di Interscambio)` cannot contact your customer, they may not be
|
||||
registered on the :abbr:`AdE (Agenzia delle Entrate)` portal. In this case, just make sure to send
|
||||
the invoice in PDF via email or by mail. The invoice is then in the :guilabel:`Accepted by SDI,
|
||||
Partner Delivery Failed` state.
|
||||
|
||||
Tax Integration
|
||||
---------------
|
||||
|
||||
When you receive a vendor bill, either from :abbr:`SdI (Sistema di Interscambio)`, from paper or
|
||||
from an imported XML file, the Tax Agency might request that you send some tax information
|
||||
integration back to the :abbr:`SdI (Sistema di Interscambio)`. It happens when a transaction that
|
||||
was tax exempt becomes taxable for any reason.
|
||||
|
||||
.. example::
|
||||
Here is a non-exhaustive list:
|
||||
|
||||
- | :ref:`italy/reverse-charge`
|
||||
| As a buyer, you have to pay taxes on what you buy and integrate tax information.
|
||||
:guilabel:`Reverse Charge` taxes.
|
||||
- | :ref:`italy/split-payment`
|
||||
| As a :abbr:`PA (Public Administration)` business buyer, you have to pay taxes and integrate
|
||||
tax information. Be sure that you replace the :guilabel:`0% Sale Taxes` on the vendor bill
|
||||
you received with the correct :guilabel:`Split Payment` taxes.
|
||||
- | :guilabel:`Self Consumption`
|
||||
| When, as a business owner, you use an asset that you bought for business for personal reasons
|
||||
instead, you have to pay those taxes you originally deducted as a business cost for it.
|
||||
|
||||
Odoo may detect that your vendor bill can be interpreted as a document of a type that needs tax
|
||||
integration, as detailed in the :ref:`italy/document-types` section.
|
||||
|
||||
.. important::
|
||||
Be sure that you replace the :guilabel:`0% Sale Taxes` on the vendor bill you received with the
|
||||
ones you're supposed to pay to the :abbr:`AdE (Agenzia delle Entrate)`. A button then appears on
|
||||
the top of the single vendor bill form to send them.
|
||||
|
||||
When clicking on the :guilabel:`Send Tax Integration` button, an XML file of the appropriate
|
||||
:guilabel:`Document Type` is generated, attached to the bill, and sent as for invoices.
|
||||
|
||||
.. image:: italy/edi-tax-integration-button.png
|
||||
:alt: EDI Send Tax Integration button
|
||||
|
||||
.. _italy/document-types:
|
||||
|
||||
Document Types
|
||||
--------------
|
||||
|
||||
The :abbr:`SdI (Sistema di Interscambio)` requires businesses to send customer invoices and other
|
||||
documents through the :abbr:`EDI (Electronic Data Interchange)`.
|
||||
|
||||
The following :guilabel:`Document Type` codes all technically identify different business use cases.
|
||||
|
||||
TD01 - Invoices
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
This represents the standard **domestic** scenario for all invoices exchanged through the :abbr:`SdI
|
||||
(Sistema di Interscambio)`. Any invoice that doesn't fall into one of the specific special cases
|
||||
is categorized as a regular invoice, identified by the :guilabel:`Document Type` `TD01`.
|
||||
|
||||
TD02 - Down payments
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**Down payment** invoices are imported/exported with a different :guilabel:`Document Type` code
|
||||
`TDO2` than regular invoices. Upon import of the invoice, a regular vendor bill is created.
|
||||
|
||||
Odoo exports transactions as `TD02` if the following conditions are met:
|
||||
|
||||
#. It is an invoice;
|
||||
#. All invoice lines are related to down payment sales order lines.
|
||||
|
||||
TD04 - Credit notes
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
It is the standard scenario for all **credit notes** issued to **domestic** clients, when we need to
|
||||
formally acknowledge that the seller is reducing or canceling a previously issued invoice, for
|
||||
example, in case of overbilling, incorrect items, or overpayment. Just like invoices, they must be
|
||||
sent to the :abbr:`SdI (Sistema di Interscambio)`, their :guilabel:`Document Type` `TD04`
|
||||
|
||||
TD07, TD08, TD09 - Simplified Invoicing
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Simplified invoices (`TD07`), credit notes (`TD08`), and debit notes (`TD09`) can be used to certify
|
||||
domestic transactions under 400 EUR (VAT included). Its status is the same as that of a regular
|
||||
invoice, but with fewer information requirements.
|
||||
|
||||
For a simplified invoice to be established, it must include:
|
||||
|
||||
#. :guilabel:`Customer Invoice` reference: **unique** numbering sequence with **no gaps**;
|
||||
#. :guilabel:`Invoice Date`: issue **date** of the invoice;
|
||||
#. :guilabel:`Company Info`: the **seller**'s full credentials (VAT/TIN number, name, full address)
|
||||
under :menuselection:`General Settings --> Companies (section)`;
|
||||
#. :guilabel:`VAT`: the **buyer**'s VAT/TIN number (on the partner form);
|
||||
#. :guilabel:`Total`: the total **amount** (VAT included) of the invoice.
|
||||
|
||||
In the :abbr:`EDI (Electronic Data Interchange)`, Odoo exports invoices as simplified if:
|
||||
|
||||
#. It is a domestic transaction (i.e., the partner is from Italy);
|
||||
#. Your company's **required fields** (:guilabel:`VAT Number` or :guilabel:`Codice Fiscale`,
|
||||
:guilabel:`Fiscal Regime`, and full **address**) are provided;
|
||||
#. The partner's address is not fully specified (i.e., it misses the City or the ZipCode);
|
||||
#. The total amount of VAT included is **less** than **400 EUR**.
|
||||
|
||||
.. note::
|
||||
The 400 EUR threshold was defined in `the decree of the 10th of May 2019 in the Gazzetta
|
||||
Ufficiale <https://www.gazzettaufficiale.it/eli/id/2019/05/24/19A03271/sg>`_. We advise you to
|
||||
check the current official value.
|
||||
|
||||
TD16 - Internal Reverse Charge
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Internal reverse charge transactions (see :ref:`italy/tax-exemption` and
|
||||
:ref:`italy/reverse-charge`) are exported as `TD16` if the following conditions are met:
|
||||
|
||||
- It is a vendor bill;
|
||||
- It has at least **one tax** on the invoice lines that targets one of these :ref:`tax grids
|
||||
<italy/grids>`: `VJ6`, `VJ7`, `VJ8`, `VJ12`, `VJ13`, `VJ14`, `VJ15`, `VJ16`, `VJ17`
|
||||
|
||||
TD17 - Buying services from abroad
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
When buying **services** from **EU** and **non-EU** countries, the foreign *seller* invoices a
|
||||
service with a **VAT-excluded** price, as it is not taxable in Italy. The VAT is paid by the *buyer*
|
||||
in Italy.
|
||||
|
||||
- Within the EU: the *buyer* integrates the invoice received with the **VAT information** due in
|
||||
Italy (i.e., **vendor bill tax integration**);
|
||||
- Non-EU: the *buyer* sends themselves an invoice (i.e., **self-billing**).
|
||||
|
||||
Odoo exports a transaction as `TD17` if the following conditions are met:
|
||||
|
||||
- It is a vendor bill;
|
||||
- It has at least **one tax** on the invoice lines that targets the tax grid :ref:`VJ3
|
||||
<italy/grids>`;
|
||||
- All invoice lines either have :guilabel:`Services` as **products**, or a tax with the
|
||||
:guilabel:`Services` as **tax scope**.
|
||||
|
||||
TD18 - Buying goods from EU
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Invoices issued within the EU follow a **standard format**, therefore only an integration of the
|
||||
existing invoice is required.
|
||||
|
||||
Odoo exports a transaction as `TD18` if the following conditions are met:
|
||||
|
||||
- It is a vendor bill;
|
||||
- The **partner** is from an **EU** country;
|
||||
- It has at least one tax on the invoice lines that targets the tax grid :ref:`VJ9 <italy/grids>`;
|
||||
- All invoice lines either have :guilabel:`Consumable` as **products**, or a tax with
|
||||
:guilabel:`Goods` as **tax scope**.
|
||||
|
||||
TD19 - Buying goods from VAT deposit
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Buying **goods** from a **foreign** vendor, but the **goods** are already in **Italy** in a **VAT
|
||||
deposit**.
|
||||
|
||||
- From the EU: the *buyer* integrates the invoice received with the **VAT information** due in
|
||||
Italy (i.e., **vendor bill tax integration**);
|
||||
- Non-EU: the *buyer* sends an invoice to *themselves* (i.e., **self-billing**).
|
||||
|
||||
Odoo exports a transaction as a `TD19` if the following conditions are met:
|
||||
|
||||
- It is a vendor bill;
|
||||
- It has at least one tax on the invoice lines that targets the tax grid :ref:`VJ3 <italy/grids>`;
|
||||
- All invoice lines either have :guilabel:`Consumables` as products, or a tax with
|
||||
:guilabel:`Goods` as **tax scope**.
|
||||
|
||||
TD24 - Deferred invoices
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The **deferred invoice** is an invoice that is **issued at a later time** than the sale of goods or
|
||||
the provision of services. A **deferred invoice** has to be issued at the latest within the **15th
|
||||
day** of the month following the delivery covered by the document.
|
||||
|
||||
It usually is a **summary invoice** containing a list of multiple sales of goods or services carried
|
||||
out in the month. The business is allowed to **group** the sales into **one invoice**, generally
|
||||
issued at the **end of the month** for accounting purposes. Deferred invoices are default for
|
||||
**wholesalers** having recurrent clients.
|
||||
|
||||
If the goods are transported by a **carrier**, every delivery has an associated **Documento di
|
||||
Transporto (DDT)**, or **Transport Document**. The deferred invoice **must** indicate the details of
|
||||
all the **DDTs** information for better tracing.
|
||||
|
||||
.. note::
|
||||
E-invoicing of deferred invoices requires the `l10n_it_stock_ddt` :ref:`module <italy/modules>`.
|
||||
In this case, a dedicated :guilabel:`Document Type` `TD24` is used in the e-invoice.
|
||||
|
||||
Odoo exports transactions as `TD24` if the following conditions are met:
|
||||
|
||||
#. It is an invoice;
|
||||
#. It is associated with deliveries whose **DDTs** have a **different** date than the issue date of
|
||||
the invoice.
|
||||
|
||||
TD28 - San Marino
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Invoices
|
||||
--------
|
||||
********
|
||||
|
||||
San Marino and Italy have special agreements on e-invoicing operations. As such, **invoices** follow
|
||||
the regular **reverse charge** rules. Additional requirements are not enforced by Odoo, however, the
|
||||
user is requested by the **State** to:
|
||||
the regular **reverse charge** rules. You can use the proper :guilabel:`Document Type` depending on
|
||||
the invoice type: `TD01`, `TD04`, `TD05`, `TD24`, `TD25`. Additional requirements are not enforced
|
||||
by Odoo. However, the user is requested by the **State** to:
|
||||
|
||||
- Select a tax with the option :guilabel:`Has exoneration of tax (Italy)` ticked, and the
|
||||
:guilabel:`Exoneration` set to `N3.3`;
|
||||
- Use the generic :abbr:`SdI (Sistema di Interscambio)` :guilabel:`Codice Destinatario` `2R4GT08`.
|
||||
The invoice is then routed by a dedicated office in San Marino to the correct business.
|
||||
- Select a tax with the :guilabel:`Tax Exemption Kind` set to `N3.3`;
|
||||
- Use the generic :abbr:`SdI (Sistema di Interscambio)` :guilabel:`Destination Code` `2R4GT08`.
|
||||
|
||||
Bills
|
||||
-----
|
||||
The invoice is then routed by a dedicated office in San Marino to the correct business.
|
||||
|
||||
Vendor Bills
|
||||
************
|
||||
|
||||
When a **paper bill** is received from San Marino, any Italian company **must** submit that invoice
|
||||
to the **Agenzia delle Entrate** by indicating the e-invoice's :guilabel:`Tipo Documento` field with
|
||||
the special value `TD28`.
|
||||
to the :abbr:`AdE (Agenzia delle Entrate)` by indicating the e-invoice's :guilabel:`Document Type`
|
||||
field with the special value `TD28`.
|
||||
|
||||
.. tabs::
|
||||
Odoo exports a transaction as `TD28` if the following conditions are met:
|
||||
|
||||
.. tab:: `TD28`
|
||||
#. It is a vendor bill;
|
||||
#. It has at least one tax on the invoice lines that targets the tax grids :ref:`VJ <italy/grids>`;
|
||||
#. The **country** of the partner is **San Marino**.
|
||||
|
||||
Odoo exports a move as `TD28` if the following conditions are met:
|
||||
Public Administration Businesses (B2G)
|
||||
======================================
|
||||
|
||||
- Is a vendor bill;
|
||||
- At least one tax on the invoice lines targets the tax grids :ref:`VJ <italy/grids>`;
|
||||
- The **country** of the partner is **San Marino**.
|
||||
:abbr:`PA (Public Administration)` businesses are subjected to more control than private businesses
|
||||
as they handle public money coming from taxpayers. The :abbr:`EDI (Electronic Data Interchange)`
|
||||
process adds some steps to the :ref:`regular one <italy/e-invoicing-process>`, as :abbr:`PA (Public
|
||||
Administration)` businesses can **accept** or **refuse** invoices.
|
||||
|
||||
Pubblica amministrazione (B2G)
|
||||
==============================
|
||||
.. note::
|
||||
:abbr:`PA (Public Administration)` businesses have a 6-digit long :guilabel:`Destination Code`,
|
||||
also called :abbr:`CUU (Codice Univoco Ufficio)`, that is **mandatory**, **PEC** address cannot
|
||||
be used in this case.
|
||||
|
||||
.. warning::
|
||||
Odoo does **not** send invoices directly to the government as they need to be signed. If we see
|
||||
that the codice destinatario is 6 digits, then it is not sent to the PA automatically, but you
|
||||
can download the XML, sign it with an external program and send it through the portal.
|
||||
|
||||
Digital qualified signature
|
||||
---------------------------
|
||||
|
||||
For invoices and bills intended to the **Pubblica Amministrazione (B2G)**, a **Digital Qualified
|
||||
Signature** is required for all files sent through the :abbr:`SdI (Sistema di Interscambio)`. The
|
||||
**XML** file must be certified using a certificate that is either:
|
||||
|
||||
- a **smart card**;
|
||||
- a **USB token**;
|
||||
- a **Hardware Security Module (HSM)**.
|
||||
.. seealso::
|
||||
`Complete list of businesses that belong to the Public Administration along with their
|
||||
Destination Code <https://www.agenziaentrate.gov.it/portale/web/guest/aree-tematiche/fatturazione-elettronica>`_
|
||||
|
||||
CIG, CUP, DatiOrdineAcquisto
|
||||
----------------------------
|
||||
|
||||
To ensure the effective traceability of payments by public administrations, electronic invoices
|
||||
issued to the public administrations must contain:
|
||||
issued to public administrations must contain:
|
||||
|
||||
- The :abbr:`CIG (Codice Identificativo Gara)`, except in cases of exclusion from traceability
|
||||
obligations provided by law n. 136 of August 13, 2010;
|
||||
- The :abbr:`CUP (Codice Unico di Progetto)`, in case of invoices related to public works.
|
||||
|
||||
If the **XML** file requires it, the **Agenzia Delle Entrate** can *only* proceed payments of
|
||||
electronic invoices when the **XML** file contains a :abbr:`CIG (Codice Identificativo Gara)` and
|
||||
:abbr:`CUP (Codice Unico di Progetto)`. For each electronic invoice, it is **necessary** to indicate
|
||||
the :abbr:`CUU (Codice Univoco Ufficio)`, which represents the unique identifier code that allows
|
||||
the :abbr:`SdI (Sistema di Interscambio)` to correctly deliver the electronic invoice to the
|
||||
recipient office.
|
||||
If the XML file requires it, the :abbr:`AdE (Agenzia Delle Entrate)` can *only* proceed payments of
|
||||
electronic invoices when the XML file contains a :abbr:`CIG (Codice Identificativo Gara)` and
|
||||
:abbr:`CUP (Codice Unico di Progetto)`.
|
||||
|
||||
.. note::
|
||||
- The :abbr:`Codice Unico di Progetto)` and the :abbr:`CIG (Codice Identificativo Gara)` must be
|
||||
included in one of the **2.1.2** (DatiOrdineAcquisto), **2.1.3** (Dati Contratto), **2.1.4**
|
||||
(DatiConvenzione), **2.1.5** (Date Ricezione), or **2.1.6** (Dati Fatture Collegate)
|
||||
information blocks. These correspond to the elements named :guilabel:`CodiceCUP` and
|
||||
:guilabel:`CodiceCIG` of the electronic invoice **XML** file, whose table can be found on the
|
||||
government `website <http://www.fatturapa.gov.it/>`_.
|
||||
- The :abbr:`CUU (Codice Univoco Ufficio)` must be included in the electronic invoice
|
||||
corresponding to the element **1.1.4** (:guilabel:`CodiceDestinario`).
|
||||
The :abbr:`CUP (Codice Unico di Progetto)` and the :abbr:`CIG (Codice Identificativo Gara)` must
|
||||
be included in one of the `DatiOrdineAcquisto`, `DatiContratto`, `DatiConvenzione`,
|
||||
`DateRicezione`, or `DatiFattureCollegate` XML tags.
|
||||
|
||||
These correspond to the elements named :guilabel:`CodiceCUP` and :guilabel:`CodiceCIG` of the
|
||||
electronic invoice XML file, whose table can be found on the government `website
|
||||
<http://www.fatturapa.gov.it/>`_.
|
||||
|
||||
.. _italy/split-payment:
|
||||
|
||||
Split Payment
|
||||
-------------
|
||||
|
||||
The :guilabel:`Split Payment` mechanism behaves much like :ref:`italy/reverse-charge`.
|
||||
|
||||
.. example::
|
||||
When an Italian company bills a :abbr:`PA (Public Administration)` business - for example,
|
||||
cleaning services for a public building - the :abbr:`PA (Public Administration)` business
|
||||
self-reports the VAT to the Tax Agency themselves, and the vendor just has to select the
|
||||
appropriate tax with the right :guilabel:`Tax Exemption` for their invoice lines.
|
||||
|
||||
The specific :guilabel:`Scissione dei Pagamenti` fiscal position is available to deal with partners
|
||||
belonging to the :abbr:`PA (Public Administration)`.
|
||||
|
||||
Process
|
||||
-------
|
||||
|
||||
.. _italy/digital-signature:
|
||||
|
||||
Digital qualified signature
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
For invoices and bills intended for the :abbr:`PA (Public Administration)`, a **Digital Qualified
|
||||
Signature** is required for all files sent through the :abbr:`SdI (Sistema di Interscambio)`. The
|
||||
XML file must be certified using a certificate that is either:
|
||||
|
||||
- a **smart card**;
|
||||
- a **USB token**;
|
||||
- an :abbr:`HSM (Hardware Security Module)`.
|
||||
|
||||
.. warning::
|
||||
Odoo **cannot** digitally sign documents for you. When a 6-digit long :guilabel:`Codice
|
||||
Destinatario` is detected, then the :abbr:`EDI (Electronic Data Interchange)` process stops, and
|
||||
the invoice is set on the :guilabel:`Requires user signature` state. You can download the
|
||||
document in XML, sign it with any :guilabel:`Digital Qualified Signature` provider's external
|
||||
program and send it through the :abbr:`AdE (Agenzia Delle Entrate)` portal.
|
||||
|
||||
Acceptance or Refusal
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. warning::
|
||||
As Odoo does not handle sending signed invoices to :abbr:`PA (Public Administration)` businesses,
|
||||
these states cannot be directly triggered by Odoo. When you upload the invoice on the :abbr:`AdE
|
||||
(Agenzia Delle Entrate)` portal, Odoo receives notifications about it, putting the correct
|
||||
:guilabel:`SdI State` on the invoice.
|
||||
|
||||
After receiving the invoice through the :abbr:`SdI (Sistema di Interscambio)`, the :abbr:`PA (Public
|
||||
Administration)` business has 15 days to accept the invoice. If it does, then the process ends here.
|
||||
If the :abbr:`PA (Public Administration)` business refuses the invoice, it is still considered valid
|
||||
once it is accepted by the :abbr:`SdI (Sistema di Interscambio)`. You then have to issue a credit
|
||||
note to compensate and send it to the :abbr:`SdI (Sistema di Interscambio)`.
|
||||
|
||||
Expired Terms
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
If the :abbr:`PA (Public Administration)` business doesn't reply within 15 days, you need to contact
|
||||
the :abbr:`PA (Public Administration)` business directly, sending them both the invoice and the
|
||||
received deadline notification by email. You can make an arrangement with them and manually set the
|
||||
correct :guilabel:`SdI State` on your invoice.
|
||||
|
||||
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 8.6 KiB |
@@ -284,8 +284,8 @@ in the *System Parameters*. To override the following defaults they need to be a
|
||||
|
||||
The two system parameters are as follows:
|
||||
|
||||
- `mail.incoming.limit.period` (60 minutes by default)
|
||||
- `mail.incoming.limit.alias` (5 by default)
|
||||
- `mail.gateway.loop.minutes` (120 minutes by default)
|
||||
- `mail.gateway.loop.threshold` (20 by default)
|
||||
|
||||
Add these fields in Odoo by first enabling :ref:`developer mode <developer-mode>`, and then
|
||||
navigating to :menuselection:`Settings --> Technical Menu --> Parameters --> System Parameters`.
|
||||
@@ -293,13 +293,13 @@ Change the value of these parameters, as needed.
|
||||
|
||||
When an email is received in the Odoo database on the catchall email address or on any alias, Odoo
|
||||
looks at the mail received for the given period of time defined in the system parameter
|
||||
`mail.incoming.limit.period`. If the received email was sent to an alias then Odoo will reference
|
||||
the `mail.incoming.limit.alias` system parameter and determine the value as the number of records
|
||||
this alias is allowed to create in the given period of time (value of `mail.incoming.limit.period`).
|
||||
`mail.gateway.loop.minutes`. If the received email was sent to an alias then Odoo will reference the
|
||||
`mail.gateway.loop.threshold` system parameter and determine the value as the number of records this
|
||||
alias is allowed to create in the given period of time (value of `mail.gateway.loop.minutes`).
|
||||
|
||||
In addition, when email is received to the catchall email address, Odoo will reference the emails
|
||||
received to the database during the set period of time (as stated by the value in the system
|
||||
parameter: `mail.incoming.limit.period`). Odoo will then determine whether any of the emails
|
||||
parameter: `mail.gateway.loop.minutes`). Odoo will then determine whether any of the emails
|
||||
received match that of the email(s) being received during the specified time-frame, and will prevent
|
||||
a feedback loop from occurring if a duplicate email is detected.
|
||||
|
||||
|
||||
@@ -11,6 +11,6 @@ Configuration
|
||||
config/connect
|
||||
config/pos
|
||||
config/https_certificate_iot
|
||||
config/flash_sdcard
|
||||
config/updating_iot
|
||||
config/troubleshooting
|
||||
config/windows_iot
|
||||
|
||||
@@ -37,8 +37,8 @@ via :ref:`WiFi <iot_connect/wifi>`.
|
||||
.. important::
|
||||
The disk image that the :abbr:`IoT (Internet of Things)` box SD card is formatted with is unique
|
||||
to the version of the Odoo database that the :abbr:`IoT (Internet of Things)` box is running on.
|
||||
Ensure that the :abbr:`IoT (Internet of Things)` box is :doc:`flashed <flash_sdcard>` with the
|
||||
most up-to-date disk image.
|
||||
Ensure that the :abbr:`IoT (Internet of Things)` box is :ref:`flashed <iot/config/flash>` with
|
||||
the most up-to-date disk image.
|
||||
|
||||
.. _iot_connect/ethernet:
|
||||
|
||||
|
||||
@@ -1,68 +0,0 @@
|
||||
====================
|
||||
Flashing the SD card
|
||||
====================
|
||||
|
||||
In some circumstances, the :abbr:`IoT (Internet of Things)` box's micro SD Card may need to be
|
||||
re-flashed to benefit from Odoo's latest :abbr:`IoT (Internet of Things)` image update. This means
|
||||
that the Odoo :abbr:`IoT (Internet of Things)` box software may need to be updated.
|
||||
|
||||
Upgrade from the IoT box home page
|
||||
==================================
|
||||
|
||||
Go to the :abbr:`IoT (Internet of Things)` box homepage by navigating to :menuselection:`IoT app -->
|
||||
IoT Boxes` and clicking on the :guilabel:`IP address` of the :abbr:`IoT (Internet of Things)` box.
|
||||
Then click on :guilabel:`Update` (next to the version number).
|
||||
|
||||
If a new version of the :abbr:`IoT (Internet of Things)` Box image is available, an
|
||||
:guilabel:`Upgrade to _xx.xx_` button will appear at the bottom of the page. Click this button to
|
||||
upgrade the unit and the :abbr:`IoT (Internet of Things)` box will then flash itself to the new
|
||||
version. All of the previous configurations will be saved.
|
||||
|
||||
.. note::
|
||||
This process can take more than 30 minutes. Do not turn off or unplug the :abbr:`IoT (Internet of
|
||||
Things)` box as it would leave it in an inconsistent state. This means that the :abbr:`IoT
|
||||
(Internet of Things)` box will need to be re-flashed with a new image. See
|
||||
:ref:`flash_sdcard/etcher`.
|
||||
|
||||
.. image:: flash_sdcard/flash-upgrade.png
|
||||
:align: center
|
||||
:alt: IoT box software upgrade in the IoT Box Home Page.
|
||||
|
||||
.. _flash_sdcard/etcher:
|
||||
|
||||
Upgrade with Etcher Software
|
||||
============================
|
||||
|
||||
.. note::
|
||||
A computer with a micro SD card reader/adapter is required in order to re-flash the micro SD
|
||||
card.
|
||||
|
||||
Navigate to Balena's website and download `Etcher <https://www.balena.io/>`_. It's a free and
|
||||
open-source utility used for burning image files onto drives. Click to `download
|
||||
<https://www.balena.io/etcher#download-etcher>`_. Install and launch the program on the computer.
|
||||
|
||||
Then download the version-specific :abbr:`IoT (Internet of Things)` image from `nightly
|
||||
<http://nightly.odoo.com/master/iotbox/>`_.
|
||||
|
||||
The following are image versions on the `nightly <http://nightly.odoo.com/master/iotbox/>`_ website
|
||||
with their corresponding Odoo database version:
|
||||
|
||||
- Odoo V16 --> iotbox-latest.zip
|
||||
- Odoo V15 --> iotboxv21_10.zip
|
||||
- Odoo V14 --> iotboxv21_04.zip
|
||||
- Odoo V13 --> iotboxv20_10.zip
|
||||
|
||||
The images should be downloaded and extracted to a convenient file location.
|
||||
|
||||
After this step is complete, insert the :abbr:`IoT (Internet of Things)` box's micro SD card into
|
||||
the computer or reader. Open *Etcher* and select :guilabel:`Flash from file`, then find and select
|
||||
the image just downloaded and extracted. Next, select the drive the image should be burned to.
|
||||
Lastly, click on :guilabel:`Flash` and wait for the process to finish.
|
||||
|
||||
.. image:: flash_sdcard/etcher-app.png
|
||||
:align: center
|
||||
:alt: Balena's Etcher software dashboard.
|
||||
|
||||
.. note::
|
||||
An alternative software for flashing the micro SD card is *Raspberry Pi Imager*. Download the
|
||||
*Raspberry Pi* software `here <https://www.raspberrypi.com/software/>`_.
|
||||
@@ -19,10 +19,10 @@ The pairing code does not show under the following circumstances:
|
||||
It is automatically removed from connected displays when this time has expired.
|
||||
- The version of the :abbr:`IoT (Internet of Things)` box image is too old. If the :abbr:`IoT
|
||||
(Internet of Things)` box image is from an earlier version, then the SD card of the :abbr:`IoT
|
||||
(Internet of Things)` box will need to be re-flashed to update the image (see :doc:`Flashing the
|
||||
SD Card <flash_sdcard>`).
|
||||
(Internet of Things)` box needs to be re-flashed to update the image (see :ref:`Flashing the SD
|
||||
Card <iot/config/flash>`).
|
||||
|
||||
If none of the cases listed above correct the issue, then make sure that the :abbr:`IoT (Internet of
|
||||
If none of the cases listed above correct the issue, then make sure the :abbr:`IoT (Internet of
|
||||
Things)` box has correctly started, by checking that a fixed green LED is showing next to the power
|
||||
port.
|
||||
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
==============
|
||||
Updating (IoT)
|
||||
==============
|
||||
|
||||
Due to the complexity of the :abbr:`IoT (Internet of Things)` box, and virtual Windows :abbr:`IoT
|
||||
(Internet of Things)` box, the term 'updating' can mean several different things.
|
||||
|
||||
The actual drivers can be updated, the core code on the :abbr:`IoT (Internet of Things)` box can be
|
||||
updated, or a new image can be flashed (using a physical :abbr:`IoT (Internet of Things)` box).
|
||||
|
||||
This document explores the various ways to update :abbr:`IoT (Internet of Things)` boxes to ensure
|
||||
smooth operation of :abbr:`IoT (Internet of Things)` box processes and devices.
|
||||
|
||||
.. _iot/config/flash:
|
||||
|
||||
Flashing the SD card on IoT box
|
||||
===============================
|
||||
|
||||
.. important::
|
||||
This update does **not** apply to the Windows :abbr:`IoT (Internet of Things)` box (Odoo 16 and
|
||||
higher).
|
||||
|
||||
To update the Windows :abbr:`IoT (Internet of Things)`, first, uninstall the previous version of
|
||||
the Odoo Windows program, and then reinstall it using the most up-to-date installation package.
|
||||
|
||||
To begin the installation, navigate to the Odoo 16 (or higher) installation package for
|
||||
Enterprise or Community - Windows edition, at `Odoo's download page
|
||||
<https://odoo.com/download>`_.
|
||||
|
||||
In some circumstances, the :abbr:`IoT (Internet of Things)` box's micro SD Card may need to be
|
||||
re-flashed with *Etcher* software to benefit from Odoo's latest :abbr:`IoT (Internet of Things)`
|
||||
image update. This means the Odoo :abbr:`IoT (Internet of Things)` box software may need to be
|
||||
updated in instances of a new :abbr:`IoT (Internet of Things)` box, or when a handler's update, or
|
||||
an update from the :abbr:`IoT (Internet of Things)` box home page, does not resolve issues.
|
||||
|
||||
|
||||
.. note::
|
||||
- It is often necessary to re-flash the :abbr:`IoT (Internet of Things)` box's image after
|
||||
upgrading the Odoo database to a new version.
|
||||
- A computer with a micro SD card reader/adapter is **required** to re-flash the micro SD card.
|
||||
|
||||
First, begin by downloading `Etcher <https://www.balena.io/etcher#download-etcher>`_. It is a free,
|
||||
open-source utility, used for burning image files onto drives. After the download completes, install
|
||||
and launch the program on the computer.
|
||||
|
||||
Then, download the latest :abbr:`IoT (Internet of Things)` image from `nightly
|
||||
<http://nightly.odoo.com/master/iotbox>`_, which will be labeled as `iotbox-latest.zip`. This
|
||||
particular image is compatible with *all* supported versions of Odoo.
|
||||
|
||||
After this step is complete, insert the :abbr:`IoT (Internet of Things)` box's micro SD card into
|
||||
the computer or reader. Open *Etcher*, and select :guilabel:`Flash from file`, then find and select
|
||||
the `iotbox-latest.zip` image and extract it. Next, select the drive the image should be burned to.
|
||||
|
||||
Lastly, click :guilabel:`Flash`, and wait for the process to finish.
|
||||
|
||||
.. image:: updating_iot/etcher-app.png
|
||||
:align: center
|
||||
:alt: Balena's Etcher software dashboard.
|
||||
|
||||
.. tip::
|
||||
Balena's *Etcher* software also allows for the administrator to flash the :abbr:`SD (Secure
|
||||
Digital)` card from a :abbr:`URL (Uniform Resource Locator)`. To flash from a :abbr:`URL (Uniform
|
||||
Resource Locator)`, simply click :guilabel:`Flash from URL`, instead of :guilabel:`Flash from
|
||||
file`.
|
||||
|
||||
Then, enter the following: `http://nightly.odoo.com/master/iotbox/iotbox-latest.zip`.
|
||||
|
||||
.. image:: updating_iot/url-flash.png
|
||||
:align: center
|
||||
:alt: A view of Balena's Etcher software, with the flash from URL option highlighted.
|
||||
|
||||
.. note::
|
||||
An alternative software for flashing the micro SD card is `Raspberry Pi Imager
|
||||
<https://www.raspberrypi.com/software/>`_.
|
||||
|
||||
.. _iot/config/homepage-upgrade:
|
||||
|
||||
Update from the IoT box home page
|
||||
=================================
|
||||
|
||||
In the background, the :abbr:`IoT (Internet of Things)` box uses a version of Odoo code to run and
|
||||
connect to the Odoo database. This code may need to be updated in order for the :abbr:`IoT (Internet
|
||||
of Things)` box to operate effectively. This operation should be completed on a routine basis, to
|
||||
ensure the :abbr:`IoT (Internet of Things)` system, and its processes, stay up-to-date.
|
||||
|
||||
Go to the :abbr:`IoT (Internet of Things)` box home page by navigating to :menuselection:`IoT app
|
||||
--> IoT Boxes`, and clicking on the :guilabel:`IP address` of the :abbr:`IoT (Internet of Things)`
|
||||
box. Then, click on :guilabel:`Update` (next to the version number).
|
||||
|
||||
If a new version of the :abbr:`IoT (Internet of Things)` box image is available, an
|
||||
:guilabel:`Upgrade to _xx.xx_` button appears at the bottom of the page. Click this button to
|
||||
upgrade the unit, at which point the :abbr:`IoT (Internet of Things)` box flashes itself to the
|
||||
newer version. All of the previous configurations are then saved.
|
||||
|
||||
.. important::
|
||||
This process can take more than 30 minutes. Do **not** turn off, or unplug, the :abbr:`IoT
|
||||
(Internet of Things)` box, as it would leave it in an inconsistent state. This means the
|
||||
:abbr:`IoT (Internet of Things)` box needs to be :ref:`re-flashed <iot/config/flash>` with a new
|
||||
image.
|
||||
|
||||
.. image:: updating_iot/flash-upgrade.png
|
||||
:align: center
|
||||
:alt: IoT box software upgrade in the IoT Box Home Page.
|
||||
|
||||
Handler (driver) update
|
||||
=======================
|
||||
|
||||
There may be some instances where drivers or interfaces need to be updated for individual devices
|
||||
(e.g. scales, measurement tools, etc.). The IoT handler's (drivers and interfaces) code can be
|
||||
modified by syncing them with the configured server handler's code.
|
||||
|
||||
This can be helpful in instances where :abbr:`IoT (Internet of Things)` devices (e.g. scales,
|
||||
measurement tools, etc.) are not working properly with the :abbr:`IoT (Internet of Things)` box.
|
||||
|
||||
For both the Windows :abbr:`IoT (Internet of Things)` (Odoo 16 and higher) and physical :abbr:`IoT
|
||||
(Internet of Things)` box, this process can be performed manually from the :abbr:`IoT (Internet of
|
||||
Things)` box home page. Go to the :abbr:`IoT (Internet of Things)` box home page by navigating to
|
||||
:menuselection:`IoT app --> IoT Boxes`, and clicking on the :guilabel:`IP address` of the :abbr:`IoT
|
||||
(Internet of Things)` box.
|
||||
|
||||
Next, click :guilabel:`Handlers list`, and then select :guilabel:`Load Handlers` at the bottom of
|
||||
the page.
|
||||
|
||||
.. image:: updating_iot/load-handlers.png
|
||||
:align: center
|
||||
:alt: Handlers list on an IoT box with the load handlers button highlighted.
|
||||
|
||||
.. important::
|
||||
Handler's code is fetched from the configured server, and it needs to be up-to-date to have the
|
||||
latest fixes and patches.
|
||||
|
||||
.. note::
|
||||
A handler update is also performed automatically each time the :abbr:`IoT (Internet of Things)`
|
||||
box is restarted. The only exception to this process is if the *Automatic drivers update* is
|
||||
unchecked in the form view of the :abbr:`IoT (Internet of Things)` box on the Odoo server. This
|
||||
setting can be reached by going to :menuselection:`IoT App --> Select the IoT box --> Automatic
|
||||
drivers update`.
|
||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 115 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
@@ -7,6 +7,7 @@ Product tracking
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
product_tracking/type
|
||||
product_tracking/differences
|
||||
product_tracking/serial_numbers
|
||||
product_tracking/lots
|
||||
|
||||
@@ -0,0 +1,232 @@
|
||||
============
|
||||
Product type
|
||||
============
|
||||
|
||||
.. |BOM| replace:: :abbr:`BoM (Bill of Materials)`
|
||||
|
||||
Define *product types* in Odoo to track products in varying levels of detail.
|
||||
|
||||
Classify products as *storable* to track stock counts, allowing users to trigger :doc:`reordering
|
||||
rules <../product_replenishment/reordering_rules>` for generating purchase orders. *Consumable*
|
||||
products are assumed to always be in stock, and *service* products are performed and served by the
|
||||
business.
|
||||
|
||||
.. seealso::
|
||||
`Odoo Tutorials: Product Type <https://www.youtube.com/watch?v=l6j0ZkP5mLM>`_
|
||||
|
||||
Set product type
|
||||
================
|
||||
|
||||
To set a product type, go to :menuselection:`Inventory app --> Products --> Products`, and select
|
||||
the desired product from the list.
|
||||
|
||||
On the product form, in the :guilabel:`Product Type` field, select:
|
||||
|
||||
- :guilabel:`Storable Product` for products tracked with stock counts. Only storable products can
|
||||
trigger reordering rules for generating purchase orders;
|
||||
|
||||
.. tip::
|
||||
Choose :guilabel:`Storable Product` if it is necessary to track a product's stock at various
|
||||
locations, inventory valuations, or if the product has lots and/or serial numbers.
|
||||
|
||||
- :guilabel:`Consumable` for products that are always assumed to be in stock, whose quantities are
|
||||
not necessary to track or forecast (e.g. nails, toilet paper, coffee, etc.). Consumables are
|
||||
replaceable and essential, but exact counts are unnecessary; or
|
||||
- :guilabel:`Service` for sellable service products that are performed, and not tracked with stock
|
||||
counts (i.e. maintenance, installation, or repair services).
|
||||
|
||||
.. image:: type/product-form.png
|
||||
:align: center
|
||||
:alt: Set a product type on the product form.
|
||||
|
||||
.. note::
|
||||
The product types listed above are part of the standard *Inventory* app. For access to the fields
|
||||
below, :ref:`install <general/install>` the corresponding apps **in addition** to *Inventory*.
|
||||
|
||||
- :guilabel:`Booking Fees`: charge a fee for booking appointments through the *Appointments* app.
|
||||
Requires the installation of the *Calendar* app and *Pay to Book* (`appointment_account_payment`)
|
||||
module
|
||||
- :guilabel:`Combo`: create discounted products sold in a bundle. Requires the installation of the
|
||||
*PoS* app.
|
||||
- :guilabel:`Event Ticket`: sold to attendees wanting to go to an event. Requires the installation
|
||||
of the *Events* app
|
||||
- :guilabel:`Event Booth`: sold to partners or sponsors to set up a booth at an event. Requires the
|
||||
installation of the *Events* app
|
||||
- :guilabel:`Course`: sell access to an educational course. Requires the installation of the
|
||||
*eLearning* app
|
||||
|
||||
Compare types
|
||||
=============
|
||||
|
||||
Below is a summary of how each product type affects common *Inventory* operations, like transfers,
|
||||
reordering rules, and the forecasted report. Click the chart item with an asterisk (*) to navigate
|
||||
to detailed sections.
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
:stub-columns: 1
|
||||
|
||||
* - Product type
|
||||
- Storable
|
||||
- Consumable
|
||||
- Service
|
||||
* - Physical product
|
||||
- Yes
|
||||
- Yes
|
||||
- No
|
||||
* - On-hand quantity
|
||||
- :ref:`Yes* <inventory/product_management/on-hand-store>`
|
||||
- :ref:`Yes* <inventory/product_management/on-hand-con>`
|
||||
- No
|
||||
* - :doc:`Inventory valuation
|
||||
<../../warehouses_storage/inventory_valuation/using_inventory_valuation>`
|
||||
- Yes
|
||||
- No
|
||||
- No
|
||||
* - Create transfer
|
||||
- :ref:`Yes* <inventory/product_management/transfer-store>`
|
||||
- :ref:`Yes* <inventory/product_management/transfer-con>`
|
||||
- :ref:`No* <inventory/product_management/transfer-serv>`
|
||||
* - :doc:`Lot/serial number tracking <differences>`
|
||||
- Yes
|
||||
- No
|
||||
- No
|
||||
* - Create purchase order
|
||||
- Yes
|
||||
- :ref:`Yes* <inventory/product_management/po>`
|
||||
- No
|
||||
* - Can be manufactured or subcontracted
|
||||
- :ref:`Yes* <inventory/product_management/manufacture>`
|
||||
- :ref:`Yes* <inventory/product_management/manufacture>`
|
||||
- No
|
||||
* - Can be in a kit
|
||||
- Yes
|
||||
- Yes
|
||||
- No
|
||||
* - Placed in package
|
||||
- Yes
|
||||
- :ref:`Yes* <inventory/product_management/package>`
|
||||
- No
|
||||
* - Appears on Inventory report
|
||||
- :ref:`Yes <inventory/product_management/report>`
|
||||
- No
|
||||
- No
|
||||
|
||||
.. _inventory/product_management/on-hand-store:
|
||||
|
||||
On-hand quantity
|
||||
----------------
|
||||
|
||||
A storable product's on-hand and forecasted quantities, based on incoming and outgoing orders, are
|
||||
reflected on the product form, accessed by going to :menuselection:`Inventory app --> Products -->
|
||||
Products`, and selecting the desired product.
|
||||
|
||||
.. figure:: type/on-hand.png
|
||||
:align: center
|
||||
:alt: Show "On Hand" and "Forecast" smart buttons.
|
||||
|
||||
Current and forecasted quantities are displayed in the **On Hand** and **Forecasted** smart
|
||||
buttons on the product form.
|
||||
|
||||
.. _inventory/product_management/on-hand-con:
|
||||
|
||||
On the other hand, consumable products are regarded as always available, and they **cannot** be
|
||||
managed using reordering rules or lot/serial numbers.
|
||||
|
||||
.. _inventory/product_management/transfer-store:
|
||||
|
||||
Create transfer
|
||||
---------------
|
||||
|
||||
*Transfers* are any warehouse operation, such as receipts, internal or batch transfers, or
|
||||
deliveries.
|
||||
|
||||
When creating a transfer for storable products in the *Inventory* app, transfers modify the on-hand
|
||||
quantity at each location.
|
||||
|
||||
For example, transferring five units from the internal location `WH/Stock` to `WH/Packing Zone`
|
||||
decreases the recorded quantity at `WH/Stock` and increases it at `WH/Packing Zone`.
|
||||
|
||||
.. _inventory/product_management/transfer-con:
|
||||
|
||||
For consumable products, transfers can be created, but exact quantities at each storage location are
|
||||
not tracked.
|
||||
|
||||
.. _inventory/product_management/transfer-serv:
|
||||
|
||||
Service products cannot be included in transfers, but these products can be `linked to projects and
|
||||
tasks for deadline tracking <https://www.youtube.com/watch?v=fix2LGkv13c>`_.
|
||||
|
||||
.. _inventory/product_management/po:
|
||||
|
||||
Create purchase order
|
||||
---------------------
|
||||
|
||||
Both storable and consumable products can be included in a request for quotation in the *Purchase*
|
||||
app.
|
||||
|
||||
However, when receiving consumable products, their on-hand quantity does not change upon validating
|
||||
the receipt (e.g. `WH/IN`).
|
||||
|
||||
.. _inventory/product_management/manufacture:
|
||||
|
||||
Manufacture or subcontract
|
||||
--------------------------
|
||||
|
||||
Storable and consumable products can be manufactured, subcontracted, or included in a bill of
|
||||
materials (BoM).
|
||||
|
||||
.. figure:: type/manufacture.png
|
||||
:align: center
|
||||
:alt: Show "Bill of Materials" and "Used In" smart buttons.
|
||||
|
||||
When the **Bill of Materials** and **Used In** smart buttons are visible on the product form,
|
||||
this indicates the product can be manufactured or used as a component of a |BOM|.
|
||||
|
||||
.. _inventory/product_management/package:
|
||||
|
||||
Packages
|
||||
--------
|
||||
|
||||
Both storable and consumable products can be placed in :doc:`packages <package>`.
|
||||
|
||||
However, for consumable products, the quantity is not tracked, and the product is not listed in the
|
||||
package's :guilabel:`Contents`, accessed by going to :menuselection:`Inventory app --> Products -->
|
||||
Packages`, and selecting the desired package.
|
||||
|
||||
.. figure:: type/package-content.png
|
||||
:align: center
|
||||
:alt: Show Packages page, containing the package contents list.
|
||||
|
||||
A consumable product was placed in the package, but the **Content** section does not list it.
|
||||
|
||||
If the *Move Entire Package* feature is enabled, moving a package updates the location of the
|
||||
contained storable products. However, the location of consumable products are not updated.
|
||||
|
||||
.. _inventory/product_management/report:
|
||||
|
||||
Inventory report
|
||||
----------------
|
||||
|
||||
**Only** storable products appear on the following reports.
|
||||
|
||||
The *stock report* is a comprehensive list of all on-hand, unreserved, incoming, and outgoing
|
||||
storable products. The report is only available to users with :doc:`administrator access
|
||||
<../../../../general/users/access_rights>`, and is found by navigating to :menuselection:`Inventory
|
||||
app --> Reporting --> Stock`.
|
||||
|
||||
.. image:: type/stock-report.png
|
||||
:align: center
|
||||
:alt: Show stock reporting list found in Inventory > Reporting > Stock.
|
||||
|
||||
The *location report* is a breakdown of each location (internal, external, or virtual) and the
|
||||
on-hand and reserved quantity of each storable product. The report is only available with the
|
||||
*Storage Location* feature activated (:menuselection:`Inventory app --> Configuration -->
|
||||
Settings`), and to users with :doc:`administrator access <../../../../general/users/access_rights>`.
|
||||
|
||||
Navigate to the location report by going to :menuselection:`Inventory app --> Reporting -->
|
||||
Locations`.
|
||||
|
||||
.. image:: type/location-report.png
|
||||
:align: center
|
||||
:alt: Show location reporting list found in Inventory > Reporting > Locations.
|
||||
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 34 KiB |
@@ -101,9 +101,11 @@ Operations Types`, and then clicking on a specific operations type.
|
||||
.. seealso::
|
||||
- :doc:`reservation_methods/at_confirmation`
|
||||
- :doc:`reservation_methods/manually`
|
||||
- :doc:`reservation_methods/before_scheduled_date`
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
reservation_methods/at_confirmation
|
||||
reservation_methods/manually
|
||||
reservation_methods/before_scheduled_date
|
||||
|
||||
@@ -9,6 +9,9 @@ At confirmation reservation
|
||||
The *at confirmation* reservation method reserves products **only** when a sales order (SO) is
|
||||
confirmed, **and** if enough stock of the products included in the |SO| is already available.
|
||||
|
||||
.. seealso::
|
||||
:doc:`About reservation methods <../reservation_methods>`
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
@@ -83,4 +86,5 @@ Availability` field reads `Available` (in green text), and the numbers in the :g
|
||||
Once ready, click :guilabel:`Validate`.
|
||||
|
||||
.. seealso::
|
||||
:doc:`About reservation methods <../reservation_methods>`
|
||||
- :doc:`Manual reservation <manually>`
|
||||
- :doc:`Before scheduled date reservation <before_scheduled_date>`
|
||||
|
||||
@@ -0,0 +1,153 @@
|
||||
=================================
|
||||
Before scheduled date reservation
|
||||
=================================
|
||||
|
||||
.. _inventory/reservation_methods/before-scheduled-date:
|
||||
|
||||
.. |SO| replace:: :abbr:`SO (Sales Order)`
|
||||
|
||||
The *Before scheduled date* reservation method allows users to select a specific number of days that
|
||||
act as the maximum number of days **before** a scheduled delivery date, when products included in a
|
||||
sales order (SO) should be reserved.
|
||||
|
||||
.. seealso::
|
||||
:doc:`About reservation methods <../reservation_methods>`
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
To set the reservation method to *Before scheduled date*, navigate to :menuselection:`Inventory app
|
||||
--> Configuration --> Operations Types`. Then, select the desired :guilabel:`Operation Type` to
|
||||
configure, or create a new one by clicking :guilabel:`New`.
|
||||
|
||||
In the :guilabel:`General` tab, locate the :guilabel:`Reservation Method` field, and select
|
||||
:guilabel:`Before scheduled date`.
|
||||
|
||||
.. image:: before_scheduled_date/before-scheduled-date-configuration.png
|
||||
:align: center
|
||||
:alt: Reservation method field on delivery order operation type form.
|
||||
|
||||
.. note::
|
||||
When the :guilabel:`Type of Operation` is changed to :guilabel:`Receipt` on an
|
||||
:guilabel:`Operations Type` form, reservation methods are **not** available.
|
||||
|
||||
Once selected, a new :guilabel:`Reserve before scheduled date` field appears below. From this field,
|
||||
the number of :guilabel:`days before` and :guilabel:`days before when starred` can be changed from
|
||||
the default `0`.
|
||||
|
||||
Changing the :guilabel:`days before` value changes the maximum number of days before a scheduled
|
||||
date that products should be reserved.
|
||||
|
||||
Changing the :guilabel:`days before when starred` value changes the maximum number of days before a
|
||||
scheduled date that products should be reserved if the transfers are starred (favorited).
|
||||
|
||||
.. example::
|
||||
Here, the :guilabel:`days before` value is set to `2` days before, and the :guilabel:`days before
|
||||
when starred` value is set to `3`.
|
||||
|
||||
This means products are reserved two days before the scheduled delivery date for normal orders,
|
||||
and three days before the scheduled delivery date for starred (favorited) transfers.
|
||||
|
||||
.. image:: before_scheduled_date/before-scheduled-date- days-before.png
|
||||
:align: center
|
||||
:alt: Reserve before scheduled date field with set numerical values.
|
||||
|
||||
This is the configuration applied for the following workflow found below.
|
||||
|
||||
Edit product form
|
||||
-----------------
|
||||
|
||||
Before the *Before scheduled date* reservation method can be used, ensure that a *customer lead
|
||||
time* is added to products that plan to be sold with this method.
|
||||
|
||||
To do that, navigate to :menuselection:`Inventory app --> Products --> Products`, and select the
|
||||
desired product to configure.
|
||||
|
||||
On the product form, click the :guilabel:`Inventory` tab, and under the :guilabel:`Logistics`
|
||||
section, change the value in the :guilabel:`Customer Lead Time` field.
|
||||
|
||||
For this example workflow, change it to `5` days.
|
||||
|
||||
This sets the scheduled delivery date for this specific product to five days after the creation date
|
||||
of the sales order.
|
||||
|
||||
.. image:: before_scheduled_date/before-scheduled-date-customer-lead-time.png
|
||||
:align: center
|
||||
:alt: Product form with customer lead time set in Inventory tab.
|
||||
|
||||
Workflow
|
||||
========
|
||||
|
||||
To see the *Before scheduled date* reservation method in action, create a new |SO| by navigating to
|
||||
:menuselection:`Sales app --> New`.
|
||||
|
||||
Add a customer in the :guilabel:`Customer` field, then, in the :guilabel:`Order Lines` tab, click
|
||||
:guilabel:`Add a product`, and select a product from the drop-down menu that has a configured
|
||||
*customer lead time*, to add to the quotation form.
|
||||
|
||||
Finally, in the :guilabel:`Quantity` column, adjust the desired quantity of the product to sell.
|
||||
|
||||
For this sample workflow, set the :guilabel:`Quantity` to `10`.
|
||||
|
||||
Once ready, click :guilabel:`Confirm` to confirm the sales order.
|
||||
|
||||
Click the green :guilabel:`📈 (area graph)` icon on the product line to reveal the product's
|
||||
:guilabel:`Availability` tooltip. This tooltip reveals the reserved number of units for this order.
|
||||
Because the reservation method is set to *Before scheduled date*, the :guilabel:`Reserved` quantity
|
||||
reads `0 Units`.
|
||||
|
||||
However, below that quantity reads `Available in stock`. This is because the quantity is available,
|
||||
but the scheduled date, for this example workflow, is five days from the order date.
|
||||
|
||||
Since reservation is not until two days before the scheduled delivery, it will not reserve the
|
||||
products until then.
|
||||
|
||||
.. note::
|
||||
If there is **not** sufficient quantity of stock for the product included in the |SO|, the
|
||||
:guilabel:`📈 (area graph)` icon is red, instead of green.
|
||||
|
||||
Instead of revealing the reserved number of units for the order, the :guilabel:`Availability`
|
||||
tooltip reads :guilabel:`Reserved`, and reveals the available number of units (e.g., `0 Units`).
|
||||
|
||||
Additionally, unless there is a set replenishment or a live receipt, it also reads :guilabel:`No
|
||||
future availability`, in red text.
|
||||
|
||||
.. image:: before_scheduled_date/before-scheduled-date-availability-tooltip.png
|
||||
:align: center
|
||||
:alt: Confirmed sales order with product availability tooltip selected.
|
||||
|
||||
Click the :guilabel:`Delivery` smart button to see the delivery order form.
|
||||
|
||||
On the delivery order form, the status in the :guilabel:`Product Availability` field is listed as
|
||||
`Available`, in yellow text, instead of green. This is because there is sufficient stock on-hand for
|
||||
this order, but no quantity has been reserved yet.
|
||||
|
||||
Note the :guilabel:`Scheduled Date` field, above the :guilabel:`Product Availability` field,
|
||||
displays the date five days from the order creation date. This indicates that the products are not
|
||||
reserved until three days from today's date (two days before the scheduled delivery date).
|
||||
|
||||
.. image:: before_scheduled_date/before-scheduled-date-delivery-order-form.png
|
||||
:align: center
|
||||
:alt: Delivery order form with product availability and reserved quantity.
|
||||
|
||||
In the :guilabel:`Operations` tab on the :guilabel:`Product` line, the numbers in the
|
||||
:guilabel:`Demand` column and the :guilabel:`Quantity` column do not match (in this case, the
|
||||
:guilabel:`Demand` column lists `10.00`, while the :guilabel:`Quantity` column lists `0`).
|
||||
|
||||
The :guilabel:`Quantity` column lists `0` because the products aren't reserved until two days
|
||||
*before* their delivery date. Odoo automatically reserves the products once the scheduled date
|
||||
arrives, at which point the :guilabel:`Demand` and :guilabel:`Quantity` columns will match.
|
||||
|
||||
.. tip::
|
||||
If the products in the |SO| should be reserved *sooner* than the scheduled reservation date, the
|
||||
reservation can be manually overridden. To manually reserve the products sooner than scheduled,
|
||||
click :guilabel:`Check Availability` at the top of the form.
|
||||
|
||||
This turns the `Available` status in the :guilabel:`Product Availability` field green, and
|
||||
changes the number in the :guilabel:`Quantity` column to match the :guilabel:`Demand` column.
|
||||
|
||||
Once ready, click :guilabel:`Validate`.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`Manual reservation <manually>`
|
||||
- :doc:`At confirmation reservation <at_confirmation>`
|
||||
|
After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 93 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 44 KiB |
@@ -135,4 +135,5 @@ Once ready, click :guilabel:`Validate`.
|
||||
:alt: List of orders in waiting status and check availability button.
|
||||
|
||||
.. seealso::
|
||||
:doc:`At confirmation reservation <../reservation_methods/at_confirmation>`
|
||||
- :doc:`At confirmation reservation <at_confirmation>`
|
||||
- :doc:`Before scheduled date reservation <before_scheduled_date>`
|
||||
|
||||
@@ -14,5 +14,4 @@ Advanced operations
|
||||
advanced_operations_warehouse/cross_dock
|
||||
advanced_operations_warehouse/stock_warehouses
|
||||
advanced_operations_warehouse/putaway
|
||||
advanced_operations_warehouse/usage
|
||||
advanced_operations_warehouse/cluster_picking
|
||||
|
||||
@@ -83,7 +83,7 @@ form.
|
||||
Set the :guilabel:`Package Use` field to :guilabel:`Reusable Box`.
|
||||
|
||||
.. seealso::
|
||||
:ref:`Packages <inventory/management/packages>`
|
||||
:doc:`Packages <../../product_management/product_tracking/package>`
|
||||
|
||||
.. example::
|
||||
A package intended for cluster picking is named `CLUSTER-PACK-3` for easy identification. For
|
||||
|
||||
@@ -1,195 +0,0 @@
|
||||
=======================
|
||||
Packages and packagings
|
||||
=======================
|
||||
|
||||
In Odoo, there are a variety of ways to specify the amount of products being bought, stocked, and
|
||||
sold. *Packages* and *packagings* are all available to streamline inventory flows, allowing for a
|
||||
variety of configurations for products as they enter and leave the warehouse.
|
||||
|
||||
.. _inventory/management/packages:
|
||||
|
||||
Packages
|
||||
========
|
||||
|
||||
Packages are a physical container that holds one or several products from a picking, typically used
|
||||
for outgoing deliveries or internal transfers. Packages can be a reusable or disposable (shipping)
|
||||
box, and are **not** specific to a product.
|
||||
|
||||
Reusable boxes temporarily hold products during a picking to be brought to either a packing or
|
||||
shipping area. Disposable boxes are the actual shipping containers (e.g. cardboard boxes, envelopes,
|
||||
shipping bags, etc). These are used to ship the products out to customers.
|
||||
|
||||
Multiple items in a sales order (SO) can be separated into different packages to accommodate the
|
||||
products. For example, an :abbr:`SO (Sales Order)` that has 20 boxes of pencils and 4 boxes of
|
||||
erasers can be separated into two separate packages, each containing 10 boxes of pencils and 2 boxes
|
||||
of erasers.
|
||||
|
||||
.. note::
|
||||
Products do *not* have to be divided equally. Products can be divided into as many packages that
|
||||
are needed to accommodate the :abbr:`SO (Sales Order)`.
|
||||
|
||||
In Odoo, the quantity of products in each package needs to be recorded, so there is a full history
|
||||
for each product, including which package each item is shipped out in.
|
||||
|
||||
To use this method, ensure the :guilabel:`Packages` option is enabled, by navigating to
|
||||
:menuselection:`Inventory app --> Configuration --> Settings --> Operations`. Click the
|
||||
:guilabel:`Packages` check box, and then :guilabel:`Save` to activate the feature.
|
||||
|
||||
On a delivery order, assign which package to use by clicking on the :guilabel:`≣ (Detailed
|
||||
Operations)` icon to the right of each product in the :guilabel:`Operations` tab.
|
||||
|
||||
.. image:: usage/detailed-operations-icon.png
|
||||
:align: center
|
||||
:alt: Find detailed operations icon to the right on the product line.
|
||||
|
||||
Clicking the :guilabel:`≣ (Detailed Operations)` icon of a product reveals a pop-up window. In this
|
||||
window, the :guilabel:`Product` name, :guilabel:`Demand`, and :guilabel:`Quantity Done` are clearly
|
||||
displayed above the customizable product line.
|
||||
|
||||
Here, the warehouse location the product is coming from can be modified, in addition to the
|
||||
:guilabel:`Source Package` and :guilabel:`Destination Package`, which represents what package(s) the
|
||||
product(s) will be packaged into.
|
||||
|
||||
Click :guilabel:`Add a line` to include each additional package used. Enter the desired amount in
|
||||
the :guilabel:`Done` field to specify the amount of products that will go into the
|
||||
:guilabel:`Destination Package`.
|
||||
|
||||
Multiple packages in a single delivery
|
||||
--------------------------------------
|
||||
|
||||
Although a :abbr:`DO (Delivery Order)` is typically associated with a single package, orders can be
|
||||
split by clicking the :guilabel:`≣ (Detailed Operations)` icon next to the products on an :abbr:`SO
|
||||
(Sales Order)` line. This opens the :guilabel:`Detailed Operations` window with an editable table to
|
||||
specify which products are intended for which package.
|
||||
|
||||
.. example::
|
||||
To package 10 boxes of pencils with 2 boxes of erasers from the same :abbr:`SO (Sales Order)`,
|
||||
begin by navigating to the :abbr:`DO (Delivery Order)`. Then, select the :guilabel:`≣ (four
|
||||
horizontal lines)` icon to the right of the product, `Box of Pencils`. Clicking the icon opens
|
||||
the :guilabel:`Detailed Operations` window that is used to detail how products, like the 20 `Box
|
||||
of Pencils`, are packaged.
|
||||
|
||||
Type in `10` under the :guilabel:`Done` field to package 10 products into the
|
||||
:guilabel:`Destination Package`. To specify the destination package, type the name of an existing
|
||||
package (such as `PACK0000006`) under the field, :guilabel:`Destination Package`. If the package
|
||||
does not exist, Odoo displays the :guilabel:`Create` button to create a new package. Click
|
||||
:guilabel:`Add a line` to assign the remaining products in another package, `PACK0000007`.
|
||||
|
||||
.. image:: usage/add-destination-package.png
|
||||
:align: center
|
||||
:alt: Detailed operations pop-up where the amount of product going in a pack can be specified.
|
||||
|
||||
Select :guilabel:`Detailed Operations` on the product line for `Box of Erasers` and similarly set
|
||||
2 :guilabel:`Done` products to `PACK0000006` and `PACK0000007` each.
|
||||
|
||||
.. image:: usage/put-in-pack-button.png
|
||||
:align: center
|
||||
:alt: Put in pack button to match the done amount matches the demand.
|
||||
|
||||
Once all the products for each line have been entered, click :guilabel:`Confirm` to return to the
|
||||
:abbr:`DO (Delivery Order)`.
|
||||
|
||||
The :guilabel:`Done` quantity on the :abbr:`DO (Delivery Order)` updates as products are selected
|
||||
for each package. When the :guilabel:`Done` amount matches the :guilabel:`Demand` amount, click the
|
||||
:guilabel:`Validate` button to complete the delivery order.
|
||||
|
||||
.. tip::
|
||||
The :guilabel:`Put In Pack` button is intended to quickly package all products in the :abbr:`DO
|
||||
(Delivery Order)` into one new package. The option to rename the package, or modify its contents,
|
||||
is available in the :guilabel:`Detailed Operations` pop-up.
|
||||
|
||||
Clicking on the :guilabel:`Packages` smart button in the upper-right corner of the delivery order
|
||||
reveals a separate page, showing all the packages used in that :abbr:`DO (Delivery Order)`.
|
||||
|
||||
Packagings
|
||||
==========
|
||||
|
||||
*Packaging* is product specific, and refers to a disposable container that holds several units of a
|
||||
specific product. Unlike packages, packagings cannot be reusable, and each specific packaging must
|
||||
be defined on the individual product form.
|
||||
|
||||
For example, different packages for cans of soda can be configured as a 6-pack, a 12-pack, or a case
|
||||
of 36. Each flavor of soda would need a `6`, `12`, and `36` can packaging configured on the
|
||||
individual product since packagings are product specific, not generic.
|
||||
|
||||
Set up packagings
|
||||
-----------------
|
||||
|
||||
To use packagings, ensure the :guilabel:`Product Packagings` feature is enabled. To do that,
|
||||
navigate to :menuselection:`Inventory app --> Configuration --> Settings`. Then, under the
|
||||
:guilabel:`Products` heading, check the box next to :guilabel:`Product Packagings`, and click
|
||||
:guilabel:`Save`.
|
||||
|
||||
In Odoo, product packagings are used on sales/purchase orders and inventory transfers.
|
||||
|
||||
Next, to create packagings, navigate to :menuselection:`Inventory app --> Products --> Products` and
|
||||
click on the desired product, then click :guilabel:`Edit` on the product page.
|
||||
|
||||
Under the :guilabel:`Inventory` tab, scroll down to the :guilabel:`Packaging` section, and click
|
||||
:guilabel:`Add a line`. Then, a pop-up window appears, in which the following information for each
|
||||
packaging should be entered:
|
||||
|
||||
- :guilabel:`Packaging`: name of packaging that appears on sales/purchase orders as a packaging
|
||||
option for the product
|
||||
- :guilabel:`Contained quantity`: amount of product in the packaging
|
||||
- :guilabel:`Barcode`: identifier used with the :ref:`Barcode app <barcode/operations/intro>` to
|
||||
trace the packaging of a product during stock moves or pickings. Leave blank if not in use
|
||||
- :guilabel:`Company`: indicates the packaging is only available at the selected company. Leave
|
||||
blank to make the packaging available across all companies.
|
||||
|
||||
.. example::
|
||||
Create a packaging type for 6 cans of the product, `Grape Soda`, by naming the
|
||||
:guilabel:`Packaging` to `6-pack` and setting the :guilabel:`Contained quantity` to `6` in the
|
||||
pop-up window that appears after clicking on :guilabel:`Add a line`.
|
||||
|
||||
.. image:: usage/create-product-packages.png
|
||||
:align: center
|
||||
:alt: Create 6-pack case for product.
|
||||
|
||||
When all the necessary information has been entered, either click :guilabel:`Save & Close` to save
|
||||
the packaging and return to the product detail form, or :guilabel:`Save & New` to save the packaging
|
||||
and create another one in a fresh pop-up window.
|
||||
|
||||
.. example::
|
||||
View all product packagings in the :guilabel:`Inventory` tab of the product form.
|
||||
|
||||
.. image:: usage/display-product-packaging.png
|
||||
:align: center
|
||||
:alt: Show packaging and contained quantities, specified on the product page form in the
|
||||
Inventory tab.
|
||||
|
||||
View all packagings
|
||||
-------------------
|
||||
|
||||
To view all packagings that have been created, go to :menuselection:`Inventory app --> Configuration
|
||||
--> Product Packagings`. Doing so reveals the :guilabel:`Product Packagings` page with a complete
|
||||
list of all packagings that have been created for all products. Create new packagings by clicking
|
||||
:guilabel:`Create`.
|
||||
|
||||
.. example::
|
||||
Two soda products, `Grape Soda` and `Diet Coke`, have three types of packaging configured. On the
|
||||
:guilabel:`Product Packagings` page, each product can sold as a `6-Pack` that contains 6
|
||||
products, `12-Pack` of 12 products, or a `Case` of 32 products.
|
||||
|
||||
.. image:: usage/packagings.png
|
||||
:align: center
|
||||
:alt: List of different packagings for products.
|
||||
|
||||
Apply packagings
|
||||
----------------
|
||||
|
||||
When creating a sales order in the :menuselection:`Sales` app, specify the packagings that should be
|
||||
used for the product(s). The chosen packaging is displayed on the :abbr:`SO (Sales Order)` under the
|
||||
:guilabel:`Package` field.
|
||||
|
||||
.. example::
|
||||
18 cans of the product, `Grape Soda`, is packed using three 6-pack packagings.
|
||||
|
||||
.. image:: usage/packagings-sales-order.png
|
||||
:align: center
|
||||
:alt: Assign packagings on the Sales Order Line.
|
||||
|
||||
.. tip::
|
||||
Packaging can be used in conjunction with Odoo :ref:`Barcode <inventory/barcode/software>`. When
|
||||
receiving products from suppliers, scanning the packaging barcode automatically adds the number
|
||||
of units in the packaging to the internal count of the product.
|
||||
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 52 KiB |
@@ -169,7 +169,7 @@ the :guilabel:`Packages` feature.
|
||||
:alt: Enable the packages feature.
|
||||
|
||||
.. seealso::
|
||||
- :ref:`Packages <inventory/management/packages>`
|
||||
- :doc:`Packages <../product_management/product_tracking/package>`
|
||||
- :doc:`2-step delivery <../shipping_receiving/daily_operations/receipts_delivery_two_steps>`
|
||||
- :doc:`3-step delivery <../shipping_receiving/daily_operations/delivery_three_steps>`
|
||||
|
||||
|
||||
@@ -1,96 +1,107 @@
|
||||
=============================================================
|
||||
Use blanket orders to create purchase agreements with vendors
|
||||
=============================================================
|
||||
==============
|
||||
Blanket orders
|
||||
==============
|
||||
|
||||
.. _purchase/manage_deals/blanket-orders:
|
||||
|
||||
.. |SO| replace:: :abbr:`SO (Sales Order)`
|
||||
.. |PO| replace:: :abbr:`PO (Purchase Order)`
|
||||
.. |UoM| replace:: :abbr:`UoM (Unit of Measure)`
|
||||
.. |RfQ| replace:: :abbr:`RfQ (Request for Quotation)`
|
||||
.. |RfQs| replace:: :abbr:`RfQs (Requests for Quotation)`
|
||||
|
||||
Blanket orders are long-term purchase agreements between a company and a vendor to deliver products
|
||||
on a recurring basis with predetermined pricing. Using blanket orders are useful when products are
|
||||
always purchased from the same vendor, but in different quantities at different times.
|
||||
on a recurring basis with predetermined pricing.
|
||||
|
||||
Blanket orders are helpful when products are consistently purchased from the same vendor, but in
|
||||
different quantities, and at different times.
|
||||
|
||||
By simplifying the ordering process, blanket orders not only save time, they also save money, since
|
||||
they can be advantageous when negotiating bulk pricing with vendors.
|
||||
|
||||
.. seealso::
|
||||
:doc:`calls_for_tenders`
|
||||
|
||||
Create a new blanket order
|
||||
==========================
|
||||
|
||||
To create blanket orders, the *Purchase Agreements* feature first needs to be enabled in the
|
||||
settings of the *Purchase* app. To do this, go to :menuselection:`Purchase --> Configuration -->
|
||||
Settings`, and under the :guilabel:`Orders` section, click the checkbox next to :guilabel:`Purchase
|
||||
Agreements`. Doing so will enable the ability to create blanket orders, as well as alternative
|
||||
requests for quotation (RFQs).
|
||||
To create blanket orders, enable the *Purchase Agreements* feature from the *Purchase* app settings.
|
||||
Navigate to :menuselection:`Purchase app --> Configuration --> Settings`, and under the
|
||||
:guilabel:`Orders` section, click the checkbox for :guilabel:`Purchase Agreements`. Then click
|
||||
:guilabel:`Save` to implement the changes.
|
||||
|
||||
.. image:: blanket_orders/blanket-orders-settings-page.png
|
||||
.. note::
|
||||
In addition to creating blanket orders, the *Purchase Agreements* setting also allows users to
|
||||
create alternative requests for quotation (RfQs).
|
||||
|
||||
.. image:: blanket_orders/blanket-orders-enabled-setting.png
|
||||
:align: center
|
||||
:alt: Purchase Agreements enabled in the Purshase app settings.
|
||||
:alt: Purchase Agreements enabled in the Purchase app settings.
|
||||
|
||||
To create a blanket order, go to :menuselection:`Purchase --> Orders --> blanket orders`, and click
|
||||
:guilabel:`New`. This creates (and navigates to) a new blanket order form.
|
||||
To create a blanket order, go to :menuselection:`Purchase app --> Orders --> Blanket Orders`, and
|
||||
click :guilabel:`New`. This opens a new blanket order form.
|
||||
|
||||
From this new blanket order form, different fields and settings can be configured, so there are
|
||||
pre-determined rules that the recurring long-term agreement must follow:
|
||||
Configure the following fields in the new blanket order form to establish predetermined rules for
|
||||
the recurring long-term agreement:
|
||||
|
||||
- :guilabel:`Purchase Representative`: is the user assigned to this specific blanket order. By
|
||||
default, this is the user who created the agreement; the user can be changed directly from the
|
||||
drop-down menu next to this field.
|
||||
- :guilabel:`Agreement Type`: is the type of purchase agreement this blanket order is classified
|
||||
as. In Odoo, blanket orders are the only official purchase agreement.
|
||||
- :guilabel:`Vendor`: is the supplier to whom this agreement is tied, either once or on a recurring
|
||||
- :guilabel:`Purchase Representative`: the user assigned to this specific blanket order. By default,
|
||||
this is the user who created the agreement; the user can be changed directly from the drop-down
|
||||
menu next to this field.
|
||||
- :guilabel:`Agreement Type`: the type of purchase agreement this blanket order is classified as. In
|
||||
Odoo, blanket orders are the only official purchase agreement.
|
||||
- :guilabel:`Vendor`: the supplier to whom this agreement is tied, either once or on a recurring
|
||||
basis. The vendor can be selected directly from the drop-down menu next to this field.
|
||||
- :guilabel:`Currency`: is the agreed-upon currency that will be used for this exchange. If multiple
|
||||
- :guilabel:`Currency`: the agreed-upon currency to be used for this exchange. If multiple
|
||||
currencies have been activated in the database, the currency can be changed from the drop-down
|
||||
menu next to this field.
|
||||
- :guilabel:`Agreement Deadline`: is the date that this purchase agreement will be set to expire on
|
||||
(if desired). If this blanket order should not expire, leave this field blank.
|
||||
- :guilabel:`Ordering Date`: is the date that this blanket order should be placed on if a new
|
||||
quotation is created directly from the blanket order form. If a new quotation is created, this
|
||||
value will automatically populate the *Order Deadline* field on the :abbr:`RFQ (Request for
|
||||
Quotation)`.
|
||||
- :guilabel:`Delivery Date`: is the expected delivery date that the products included in an
|
||||
:abbr:`RFQ (Request for Quotation)` created directly from the blanket order form will be expected
|
||||
to arrive. If a new quotation is created, this value will automatically populate the *Expected
|
||||
Arrival* field on the :abbr:`RFQ (Request for Quotation)`.
|
||||
- :guilabel:`Source Document`: is the source purchase order (PO) that this blanket order will be
|
||||
tied to. If this blanket order should not be tied to any existing :abbr:`POs (Purchase Orders)`,
|
||||
leave this field blank.
|
||||
- :guilabel:`Company`: is the company assigned to this specific blanket order. By default, this is
|
||||
the company that the user creating the blanket order is listed under. If the database is not a
|
||||
multi-company database, this field can not be changed, and will default to the only company
|
||||
listed in the database.
|
||||
- :guilabel:`Agreement Deadline`: the date that this purchase agreement will be set to expire on. If
|
||||
this blanket order should not expire, leave this field blank.
|
||||
- :guilabel:`Ordering Date`: the date that this blanket order should be placed on if a new quotation
|
||||
is created directly from the blanket order form. If a new quotation is created, this value
|
||||
automatically populates the *Order Deadline* field on the |RfQ|.
|
||||
- :guilabel:`Delivery Date`: the expected delivery date that the products included in an |RfQ| are
|
||||
expected, if created directly from a blanket order form. If a new quotation is created, this value
|
||||
automatically populates the *Expected Arrival* field on the |RfQ|.
|
||||
- :guilabel:`Source Document`: the source purchase order (PO) that this blanket order is tied to. If
|
||||
this blanket order should not be tied to any existing |PO|, leave this field blank.
|
||||
- :guilabel:`Company`: the company assigned to this specific blanket order. By default, this is the
|
||||
company that the user creating the blanket order is listed under. If the database is not a
|
||||
multi-company database, this field **cannot** be changed, and defaults to the only company listed
|
||||
in the database.
|
||||
|
||||
.. image:: blanket_orders/blanket-orders-new-agreement.png
|
||||
:align: center
|
||||
:alt: New blanket order purchase agreement with added products.
|
||||
|
||||
Once all relevant fields have been filled out, click :guilabel:`Add a line` to add products under
|
||||
the :guilabel:`Product` column. Then, change the quantity of each product in the
|
||||
:guilabel:`Quantity` column (if desired), and set a price in the :guilabel:`Unit Price` column.
|
||||
the :guilabel:`Product` column. Then, in the :guilabel:`Quantity` column, change the quantity of
|
||||
each product, and set a price in the :guilabel:`Unit Price` column.
|
||||
|
||||
.. important::
|
||||
When adding products to a new blanket order, the pre-existing prices of products will not be
|
||||
added automatically to the product lines. The prices must be manually assigned by changing the
|
||||
value in the :guilabel:`Unit Price` column to an agreed-upon price with the listed vendor.
|
||||
Otherwise, the price will remain **0**.
|
||||
When adding products to a new blanket order, the pre-existing prices of products are not
|
||||
automatically added to the product lines. Instead, the prices **must** be manually assigned, by
|
||||
changing the value in the :guilabel:`Unit Price` column to an agreed-upon price with the listed
|
||||
vendor. Otherwise, the price will remain `0`.
|
||||
|
||||
To view and change the default purchase agreement settings for blanket orders directly from the
|
||||
blanket order form, click the :guilabel:`internal link (arrow icon)` next to the
|
||||
:guilabel:`Agreement Type` field where :guilabel:`Blanket Order` is listed. This navigates to the
|
||||
blanket order settings.
|
||||
blanket order form, click the :guilabel:`➡️ (right arrow)` icon that becomes visible when hovering
|
||||
over the :guilabel:`Agreement Type` field, where :guilabel:`Blanket Order` is listed. This navigates
|
||||
to the blanket order settings.
|
||||
|
||||
.. image:: blanket_orders/blanket-orders-internal-link-arrow.png
|
||||
:align: center
|
||||
:alt: Internal link arrow next to Agreement Type field on blanket order form.
|
||||
|
||||
From here, the settings for blanket orders can be edited. Under the :guilabel:`Agreement Type`
|
||||
section, the name of the :guilabel:`Agreement Type` can be changed (if desired), and the
|
||||
:guilabel:`Agreement Selection Type` can be changed, as well. There are two options that can be
|
||||
activated for the type of selection:
|
||||
section, the name of the :guilabel:`Agreement Type` can be changed, and the :guilabel:`Agreement
|
||||
Selection Type` can be changed, as well. There are two options that can be activated for the type of
|
||||
selection:
|
||||
|
||||
- :guilabel:`Select only one RFQ (exclusive)`: when a purchase order is confirmed, the remaining
|
||||
purchase orders will be canceled.
|
||||
- :guilabel:`Select multiple RFQ (non-exclusive)`: when a purchase order is confirmed, remaining
|
||||
purchase orders will ***not** be canceled. Instead, multiple purchase orders are allowed.
|
||||
- :guilabel:`Select only one RfQ (exclusive)`: when a purchase order is confirmed, the remaining
|
||||
purchase orders are canceled.
|
||||
- :guilabel:`Select multiple RfQ (non-exclusive)`: when a purchase order is confirmed, remaining
|
||||
purchase orders are **not** canceled. Instead, multiple purchase orders are allowed.
|
||||
|
||||
Under the :guilabel:`Data For New Quotations` section, the settings for how product lines and
|
||||
quantities will be populated on new quotations using this purchase agreeement can be changed next
|
||||
to the :guilabel:`Lines` and :guilabel:`Quantities` fields.
|
||||
Under the :guilabel:`Data For New Quotations` section, the :guilabel:`Lines` and
|
||||
:guilabel:`Quantities` fields can be edited. Doing so sets how new quotations should be populated
|
||||
when using this purchase agreement.
|
||||
|
||||
.. image:: blanket_orders/blanket-orders-edit-agreement-type.png
|
||||
:align: center
|
||||
@@ -98,107 +109,76 @@ to the :guilabel:`Lines` and :guilabel:`Quantities` fields.
|
||||
|
||||
There are two options that can be activated for :guilabel:`Lines`:
|
||||
|
||||
- :guilabel:`Use lines of agreement`: when creating a new quotation, the product lines will
|
||||
pre-populate with the same products listed on the blanket order, if said blanket order is chosen
|
||||
on the new quotation.
|
||||
- :guilabel:`Do not create RfQ lines automatically`: when creating a new quotation and selecting
|
||||
an existing blanket order, the settings will carry over to the new quotation, but the product
|
||||
lines will not populate.
|
||||
- :guilabel:`Use lines of agreement`: when creating a new quotation, the product lines pre-populate
|
||||
with the same products listed on the blanket order, if said blanket order is chosen for the new
|
||||
quotation.
|
||||
- :guilabel:`Do not create RfQ lines automatically`: when creating a new quotation, **and**
|
||||
selecting an existing blanket order, the settings carry over to the new quotation, but the product
|
||||
lines do **not** populate.
|
||||
|
||||
And, there are two options that can be activated for :guilabel:`Quantities`:
|
||||
|
||||
- :guilabel:`Use quantities of agreement`: when creating a new quotation, the product quantities
|
||||
listed on the blanket order will pre-populate on the product lines, if said blanket order is
|
||||
chosen on the new quotation.
|
||||
- :guilabel:`Set quantities manually`: when creating a new quotation and selecting an existing
|
||||
blanket order, the product lines will pre-populate, but all quantities will be set to **0**. The
|
||||
quantities will need to be manually set by the user.
|
||||
listed on the blanket order pre-populate on the product lines, if said blanket order is chosen for
|
||||
the new quotation.
|
||||
- :guilabel:`Set quantities manually`: when creating a new quotation, **and** selecting an existing
|
||||
blanket order, the product lines pre-populate, but all quantities are set to `0`. The quantities
|
||||
**must** be manually set by the user.
|
||||
|
||||
Once the desired changes have been made (if any), click :guilabel:`New` (via the breadcrumbs, at
|
||||
the top of the page) to navigate back to the blanket order form, and click :guilabel:`Confirm` to
|
||||
save this new purchase agreement. Once confirmed, the blanket order changes from *Draft* to
|
||||
*Ongoing*, meaning this agreement can be selected and used when creating new :abbr:`RFQs (Requests
|
||||
for Quotation)`.
|
||||
Once any desired changes have been made, click :guilabel:`New` (via the breadcrumbs, at the top of
|
||||
the page) to navigate back to the blanket order form. Then, click :guilabel:`Confirm` to save this
|
||||
new purchase agreement.
|
||||
|
||||
Once confirmed, the blanket order's stage (in the upper-right corner) changes from :guilabel:`Draft`
|
||||
to :guilabel:`Ongoing`, meaning this agreement can be selected and used when creating new |RfQs|.
|
||||
|
||||
.. tip::
|
||||
After creating and confirming a blanket order, products, quantities, and prices can still be
|
||||
edited, added, and removed from the purchase agreement.
|
||||
|
||||
Create a new :abbr:`RFQ (Request for Quotation)` from the blanket order
|
||||
=======================================================================
|
||||
Create a new |RfQ| from the blanket order
|
||||
=========================================
|
||||
|
||||
After confirming a blanket order, new quotations can be created directly from the blanket order
|
||||
form that will use the rules set on the form and pre-populate the new quotation with the correct
|
||||
information. Additionally, this new quotation will be automatically linked to this blanket order
|
||||
form via the :guilabel:`RFQs/Orders` smart button at the top right of the form.
|
||||
form. |RfQs| using this form are pre-populated with information based on the rules set in the form.
|
||||
Additionally, new quotations are automatically linked to this blanket order form, via the
|
||||
:guilabel:`RFQs/Orders` smart button at the top-right of the form.
|
||||
|
||||
To create a new quotation from the blanket order form, click :guilabel:`New Quotation`. This
|
||||
creates (and navigates to) a new :abbr:`RFQ (Request for Quotation)`, that is pre-populated with
|
||||
the correct information, depending on the settings configured on the blanket order form.
|
||||
To create a new quotation from the blanket order form, click the :guilabel:`New Quotation` button.
|
||||
This opens a new |RfQ|, that is pre-populated with the correct information, depending on the
|
||||
settings configured on the blanket order form.
|
||||
|
||||
From the new :abbr:`RFQ (Request for Quotation)` form, click :guilabel:`Send by Email` to compose
|
||||
and send an email to the listed vendor; click :guilabel:`Print RFQ` to generate a printable PDF of
|
||||
the quotation; or, once ready, click :guilabel:`Confirm Order` to confirm the purchase order (PO).
|
||||
From the new |RfQ| form, click :guilabel:`Send by Email` to compose and send an email to the listed
|
||||
vendor. Click :guilabel:`Print RFQ` to generate a printable PDF of the quotation; or, once ready,
|
||||
click :guilabel:`Confirm Order` to confirm the |PO|.
|
||||
|
||||
.. image:: blanket_orders/blanket-orders-new-quotation.png
|
||||
:align: center
|
||||
:alt: New quotation with copied products and rules from blanket order.
|
||||
|
||||
Once the :abbr:`PO (Purchase Order)` has been confirmed, click back to the blanket order form (via
|
||||
the breadcrumbs, at the top of the page). From the blanket order form, there is now one :abbr:`RFQ
|
||||
(Request for Quotation)` listed in the :guilabel:`RFQs/Orders` smart button at the top right of the
|
||||
form. Click the :guilabel:`RFQs/Orders` smart button to see the purchase order that was just created.
|
||||
Once the |PO| has been confirmed, click back to the blanket order form (via the breadcrumbs, at the
|
||||
top of the page). From the blanket order form, there is now one |RfQ| listed in the
|
||||
:guilabel:`RFQs/Orders` smart button at the top-right of the form. Click the :guilabel:`RFQs/Orders`
|
||||
smart button to see the |PO| that was just created.
|
||||
|
||||
.. image:: blanket_orders/blanket-orders-rfq-smart-button.png
|
||||
:align: center
|
||||
:alt: RFQs and Orders smart button from blanket order form.
|
||||
|
||||
Create a new blanket order from an :abbr:`RFQ (Request for Quotation)`
|
||||
======================================================================
|
||||
|
||||
To create a new :abbr:`RFQ (Request for Quotation)`, navigate to the :menuselection:`Purchase` app,
|
||||
and click :guilabel:`New`.
|
||||
|
||||
Then, add information to the :abbr:`RFQ (Request for Quotation)` form: add a vendor from the
|
||||
drop-down menu next to the :guilabel:`Vendor` field, and click :guilabel:`Add a product` to select
|
||||
a product from the drop-down menu in the :guilabel:`Product` column. Then, set the desired purchase
|
||||
quantity in the :guilabel:`Quantity` column, and change the purchase price in the :guilabel:`Unit
|
||||
Price` column, if desired.
|
||||
|
||||
Clicking the :guilabel:`additional options (two-dots)` icon provides additional visibility options
|
||||
to add to the line item. Repeat these steps to add as many additional options as desired, including
|
||||
the :guilabel:`UoM` (Units of Measure) to purchase the products in, and the :guilabel:`Expected
|
||||
Arrival` date.
|
||||
|
||||
Before confirming the new quotation and creating a purchase order, click the drop-down menu next to
|
||||
the :guilabel:`Blanket Order` field, and type a new name for the new blanket order. This creates a
|
||||
brand new purchase agreement, and saves the information entered in the fields of the purchase order
|
||||
form, as well as the product information entered on the product lines.
|
||||
|
||||
From the new :abbr:`RFQ (Request for Quotation)` form, click :guilabel:`Send by Email` to compose
|
||||
and send an email to the listed vendor; click :guilabel:`Print RFQ` to generate a printable PDF of
|
||||
the quotation; or, once ready, click :guilabel:`Confirm Order` to confirm the :abbr:`PO (purchase
|
||||
order)`.
|
||||
|
||||
.. image:: blanket_orders/blanket-orders-new-blanket-order.png
|
||||
:align: center
|
||||
:alt: New blanket order created directly from quotation.
|
||||
|
||||
.. note::
|
||||
To see the newly-created blanket order purchase agreement, go to :menuselection:`Orders -->
|
||||
Blanket Orders`, and click into the new blanket order. From here, settings and rules can be
|
||||
changed, if desired.
|
||||
|
||||
Blanket orders and replenishment
|
||||
================================
|
||||
Replenishment
|
||||
=============
|
||||
|
||||
Once a blanket order is confirmed, a new vendor line is added under the :guilabel:`Purchase` tab of
|
||||
of the products included in the :abbr:`BO (Blanket Order)`. This makes blanket orders useful with
|
||||
:doc:`automated replenishment <../../purchase/products/reordering>`, because information about the
|
||||
:guilabel:`Vendor`, :guilabel:`Price`, and the :guilabel:`Agreement` are referenced on the vendor
|
||||
line. This information is used to determine where, when, and for what price this product could be
|
||||
replenished.
|
||||
the products included in the order.
|
||||
|
||||
.. image:: blanket_orders/blanket-orders-automated-replenishment.png
|
||||
This makes blanket orders useful with :doc:`automated replenishment
|
||||
<../../purchase/products/reordering>`, because information about the :guilabel:`Vendor`,
|
||||
:guilabel:`Price`, and the :guilabel:`Agreement` are referenced on the vendor line. This information
|
||||
dictates when, where, and at what price the product should be replenished.
|
||||
|
||||
.. image:: blanket_orders/blanket-orders-product-form.png
|
||||
:align: center
|
||||
:alt: Product form with replenishment agreement linked to blanket order.
|
||||
|
||||
.. seealso::
|
||||
:doc:`calls_for_tenders`
|
||||
|
||||
|
Before Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 34 KiB |
@@ -1,66 +1,122 @@
|
||||
==================================
|
||||
Manage unsubscriptions (Blacklist)
|
||||
Manage unsubscriptions (blacklist)
|
||||
==================================
|
||||
|
||||
Providing recipients with the power to unsubscribe from mailing lists is not only a smart business
|
||||
practice, it's often a legal requirement. By allowing recipients to unsubscribe from a mailing list
|
||||
establishes a sense of trust with an audience, and helps companies appear genuine (and not spammy).
|
||||
practice, it's often a legal requirement. Allowing recipients to unsubscribe from a mailing list
|
||||
establishes a sense of trust and control with an audience. It also helps companies appear more
|
||||
genuine, and less *spammy*.
|
||||
|
||||
Enable the Blacklist feature
|
||||
============================
|
||||
Unsubscribe and blacklist
|
||||
=========================
|
||||
|
||||
First, the *Blacklist* feature must be enabled. To do that, navigate to :menuselection:`Email
|
||||
Marketing app --> Configuration --> Settings`, enable to :guilabel:`Blacklist Options when
|
||||
Unsubscribing`, and click :guilabel:`Save`.
|
||||
In addition to having the option to unsubscribe from specific mailing lists, the recipient can also
|
||||
*blacklist* themselves during the unsubscription process, meaning they will not receive *any* more
|
||||
marketing emails from the Odoo database.
|
||||
|
||||
In order to provide recipients with the ability to blacklist themselves, a specific feature **must**
|
||||
be enabled in the *Email Marketing* application.
|
||||
|
||||
Navigate to :menuselection:`Email Marketing app --> Configuration --> Settings`, and tick the
|
||||
checkbox next to the :guilabel:`Blacklist Option when Unsubscribing` feature. Then, click
|
||||
:guilabel:`Save` in the upper-left corner of the :guilabel:`Settings` page.
|
||||
|
||||
.. image:: unsubscriptions/blacklist-feature.png
|
||||
:align: center
|
||||
:alt: View of the blacklist feature in the Settings page of the Odoo Email Marketing app.
|
||||
|
||||
With that feature activated, an *Unsubscribe* link appears in mailings. If a recipient clicks that
|
||||
link, Odoo reveals a :guilabel:`Unsubscriptions` page, where they can directly manage their
|
||||
subscriptions.
|
||||
Unsubscribe
|
||||
-----------
|
||||
|
||||
By default, an *Unsubscribe* link appears at the bottom of all mailing templates.
|
||||
|
||||
.. warning::
|
||||
The *Unsubscribe* link does **not** appear by default if the *Start From Scratch* template is
|
||||
used to create a mailing. The user **must** manually add the specific unsubscribe link
|
||||
`/unsubscribe_from_list` in the body of the email, or use a block from the *Footers* section of
|
||||
the email builder, which includes the unsubscribe link.
|
||||
|
||||
If a recipient clicks the *Unsubscribe* link in a mailing, Odoo instantly unsubscribes them from the
|
||||
mailing list, presents them with a :guilabel:`Mailing Subscriptions` page where they can directly
|
||||
manage their subscriptions, and informs them that they've been :guilabel:`Successfully
|
||||
Unsubscribed`.
|
||||
|
||||
.. image:: unsubscriptions/mailing-subscriptions-page.png
|
||||
:align: center
|
||||
:alt: The Mailng Subscriptions page that appears when 'Unsubscribe' link in mailing is clicked.
|
||||
|
||||
Beneath that, Odoo asks the former subscriber to :guilabel:`Please let us know why you updated your
|
||||
subscription`, and the user can proceed to choose the appropriate opt-out reason from a series of
|
||||
options presented to them.
|
||||
|
||||
.. note::
|
||||
With a test mailing, clicking the :guilabel:`Unsubscribe` link reveals an error page (*error 403
|
||||
- Access Denied*). To make sure the link is working properly, create the mailing, and only send
|
||||
it to a personal email.
|
||||
The opt-out answer options can be created and modified by navigating to :menuselection:`Email
|
||||
Marketing app --> Configuration --> Optout Reasons`.
|
||||
|
||||
Once they've chosen the appropriate opt-out reason from the options presented to them, they can
|
||||
click the :guilabel:`Send` button. Odoo then logs their reasoning for unsubscribing in the *Email
|
||||
Marketing* app for future analysis.
|
||||
|
||||
Blacklist
|
||||
=========
|
||||
---------
|
||||
|
||||
In addition to having the option to *Unsubscribe* from specific mailing lists, the recipient can
|
||||
also *Blacklist* themselves, meaning they will not receive *any* more emails.
|
||||
For a recipient to remove (i.e. blacklist) themselves from **all** marketing emails during the
|
||||
unsubscription process, on the :guilabel:`Mailing Subscriptions` page, they must click
|
||||
:guilabel:`Exclude Me`.
|
||||
|
||||
.. note::
|
||||
The mailing list has to be configured as *Public* in order to be visible for users.
|
||||
Upon clicking :guilabel:`Exclude Me`, Odoo informs the recipient they have been successfully
|
||||
blacklisted, with a message reading: :guilabel:`✔️ Email added to our blocklist`.
|
||||
|
||||
To view a complete collection of blacklisted email addresses, navigate to :menuselection:`Email
|
||||
.. image:: unsubscriptions/mailing-subscriptions-blocklist-question.png
|
||||
:align: center
|
||||
:alt: The blocklist question on the Mailing Subscriptions page that recipients see.
|
||||
|
||||
Beneath that, Odoo asks the former subscriber to :guilabel:`Please let us know why you want to be
|
||||
added to our blocklist`, and the user can proceed to choose the appropriate reason from a series of
|
||||
options presented to them.
|
||||
|
||||
Once they've chosen the appropriate reason from the options presented to them, they can click the
|
||||
:guilabel:`Send` button. Odoo then logs their reasoning for blacklisting themselves in the *Email
|
||||
Marketing* app for future analysis.
|
||||
|
||||
Blacklisted email addresses
|
||||
===========================
|
||||
|
||||
To view a complete list of all blacklisted email addresses, navigate to :menuselection:`Email
|
||||
Marketing app --> Configuration --> Blacklisted Email Addresses`.
|
||||
|
||||
.. image:: unsubscriptions/blacklisted-email-addresses.png
|
||||
:align: center
|
||||
:alt: View of the blacklisted email addresses page in Odoo Email Marketing.
|
||||
|
||||
When a blacklisted record is selected from this page, Odoo reveals a separate page with that
|
||||
blacklisted recipient's contact information.
|
||||
When a blacklisted record is selected from this list, Odoo reveals a separate page with the
|
||||
recipient's contact information, along with the provided :guilabel:`Reason` why they chose to
|
||||
blacklist themselves.
|
||||
|
||||
.. image:: unsubscriptions/blacklisted-contact-form.png
|
||||
:align: center
|
||||
:alt: View of a blacklisted contact detail form in Odoo Email Marketing.
|
||||
|
||||
In the :guilabel:`Chatter` of this page, there's a time-stamped message, informing the user when
|
||||
that recipient blacklisted themselves (via a :guilabel:`Mail Blacklist created` log note).
|
||||
In the *chatter* of the blacklisted record page, there's a time-stamped message, informing the user
|
||||
when the recipient blacklisted themselves (via a :guilabel:`Mail Blacklist created` log note).
|
||||
|
||||
.. note::
|
||||
Blacklisted emails are excluded from all marketing mailings, however, these emails can still
|
||||
receive transactional emails, such as order confirmations, shipping notifications, etc.
|
||||
|
||||
Unblacklist contacts
|
||||
====================
|
||||
|
||||
To *Unblacklist* contacts, click the :guilabel:`Unblacklist` button in the upper-left corner to
|
||||
remove the contact from the blacklist, allowing them to receive mailings once again.
|
||||
To *Unblacklist* contacts, click the :guilabel:`Unblacklist` button in the upper-left corner of a
|
||||
blacklisted record's page to remove the contact from the blacklist, allowing them to receive
|
||||
mailings once again.
|
||||
|
||||
When :guilabel:`Unblacklist` is clicked, a pop-up appears. In this pop-up, the specific email
|
||||
address is listed, and there's a :guilabel:`Reason` field, in which a reason can be entered,
|
||||
explaining why this particular contact was removed from the blacklist.
|
||||
When :guilabel:`Unblacklist` is clicked, an :guilabel:`Are you sure you want to unblacklist this
|
||||
Email Address?` pop-up window appears.
|
||||
|
||||
In this pop-up window, the email address of the selected blacklisted record is shown, and there's a
|
||||
:guilabel:`Reason` field, in which a reason can be entered, explaining why this particular contact
|
||||
was removed from the blacklist.
|
||||
|
||||
.. image:: unsubscriptions/unblacklist-popup.png
|
||||
:align: center
|
||||
@@ -70,5 +126,5 @@ After filling in the fields, click :guilabel:`Confirm` to officially remove that
|
||||
from the blacklist.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`/applications/marketing/email_marketing`
|
||||
- :doc:`/applications/marketing/email_marketing/mailing_lists`
|
||||
- :doc:`../email_marketing`
|
||||
- :doc:`mailing_lists`
|
||||
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 8.4 KiB |
@@ -56,8 +56,8 @@ Finally, click :guilabel:`Add` to generate the client secret (:guilabel:`Secret
|
||||
Configuration in Odoo
|
||||
=====================
|
||||
|
||||
In the Odoo database, go to :menuselection:`Settings --> General Settings --> Integrations` and
|
||||
activate the :guilabel:`Outlook Calendar` setting.
|
||||
In the Odoo database, go to :menuselection:`Settings app --> Calendar` in the left menu and activate
|
||||
the :guilabel:`Outlook Calendar` setting.
|
||||
|
||||
.. image:: outlook/outlook-calendar-setting.png
|
||||
:align: center
|
||||
|
||||
@@ -5,8 +5,9 @@ Use VoIP services in Odoo with OnSIP
|
||||
Introduction
|
||||
============
|
||||
|
||||
Odoo *VoIP* can be set up to work together with `OnSIP <https://www.onsip.com/>`_. OnSIP is a VoIP
|
||||
provider. An account is needed with OnSIP in order to use this service.
|
||||
Odoo *VoIP* can be set up to work together with `OnSIP (Odoo Landing Page)
|
||||
<https://info.onsip.com/odoo/>`_. OnSIP is a VoIP provider. An account is needed with OnSIP in order
|
||||
to use this service.
|
||||
|
||||
Before setting up an account with OnSIP, make sure the company's home area, and the areas that will
|
||||
be called, are covered by OnSIP services.
|
||||
@@ -128,14 +129,13 @@ Incorrect number
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
If an *Incorrect Number* message appears in the Odoo widget, make sure to use the international
|
||||
format for the number. This means leading with the :guilabel:`+ (plus)` sign, followed by the
|
||||
international country code.
|
||||
format for the number. This means leading with the international country code.
|
||||
|
||||
A country code is a locator code that allows access to the desired country's phone system. The
|
||||
country code is dialed first, prior to the target number. Each country in the world has its own
|
||||
specific country code.
|
||||
|
||||
For example, `+16505555555` (where `+1` is the international prefix for the United States).
|
||||
For example, `16505555555` (where `1` is the international prefix for the United States).
|
||||
|
||||
.. image:: onsip/onsip05.png
|
||||
:align: center
|
||||
|
||||