diff --git a/Makefile b/Makefile index a09927090f..0ef7cb6123 100644 --- a/Makefile +++ b/Makefile @@ -84,5 +84,13 @@ static: $(HTML_BUILD_DIR)/_static/style.css cp -r extensions/odoo_theme/static/* $(HTML_BUILD_DIR)/_static/ cp -r static/* $(HTML_BUILD_DIR)/_static/ +# Called by runbot for the ci/documentation_guideline check. test: @python tests/main.py $(SOURCE_DIR)/administration $(SOURCE_DIR)/applications $(SOURCE_DIR)/contributing $(SOURCE_DIR)/developer $(SOURCE_DIR)/services redirects + +# Similar as `test`, but called only manually by content reviewers to trigger extra checks. +review: + @read -p "Enter content path: " path; read -p "Enter max line length (default: 100): " line_length; \ + if [ -z "$$path" ]; then echo "Error: Path cannot be empty"; exit 1; fi; \ + if [ -z "$$line_length" ]; then line_length=100; fi; \ + python tests/main.py -e line-too-long -e early-line-breaks --max-line-length=$$line_length $(SOURCE_DIR)/$$path diff --git a/conf.py b/conf.py index 2a48139721..46f89e8ae0 100644 --- a/conf.py +++ b/conf.py @@ -195,7 +195,7 @@ intersphinx_mapping = { 'pillow': ('https://pillow.readthedocs.io/en/stable/', None), 'python': ('https://docs.python.org/3/', None), - 'werkzeug': ('https://werkzeug.palletsprojects.com/en/1.0.x/', None), + 'werkzeug': ('https://werkzeug.palletsprojects.com/en/2.3.x/', None), } github_user = 'odoo' @@ -213,6 +213,8 @@ # is populated. If a version is passed to `versions` but is not listed here, it will not be shown. versions_names = { 'master': "Master", + 'saas-16.4': "Odoo Online", + 'saas-16.3': "Odoo Online", 'saas-16.2': "Odoo Online", 'saas-16.1': "Odoo Online", '16.0': "Odoo 16", @@ -317,13 +319,16 @@ 'Odoo Enterprise Subscription Agreement (ES)', '', 'howto'), ('legal/terms/i18n/partnership_tex_es', 'odoo_partnership_agreement_es.tex', 'Odoo Partnership Agreement (ES)', '', 'howto'), + + ('legal/terms/i18n/enterprise_tex_pt_BR', 'odoo_enterprise_agreement_pt_BR.tex', + 'Odoo Enterprise Subscription Agreement (PT)', '', 'howto'), ] # List of languages that have legal translations (excluding EN). The keys must be in # `languages_names`. These translations will have a link to their versions of the legal # contracts, instead of the default EN one. The main legal documents are not part of the # translations since they have legal meaning. -legal_translations = ['de', 'es', 'fr', 'nl'] +legal_translations = ['de', 'es', 'fr', 'nl', 'pt_BR'] # The name of an image file (relative to this directory) to place at the top of the title page. latex_logo = 'static/img/odoo_logo.png' diff --git a/content/administration/install/deploy.rst b/content/administration/install/deploy.rst index 7aecce747a..514a8ce462 100644 --- a/content/administration/install/deploy.rst +++ b/content/administration/install/deploy.rst @@ -43,7 +43,7 @@ Configuration samples * Show only databases with names beginning with 'mycompany' -in ``/etc/odoo.conf`` set: +in :ref:`the configuration file ` set: .. code-block:: ini @@ -55,7 +55,7 @@ in ``/etc/odoo.conf`` set: was sent to ``www.mycompany.com`` or ``mycompany.co.uk``, but not for ``www2.mycompany.com`` or ``helpdesk.mycompany.com``. -in ``/etc/odoo.conf`` set: +in :ref:`the configuration file ` set: .. code-block:: ini @@ -150,7 +150,7 @@ Configuration sample * with 'pwd' as a password * filtering only db with a name beginning with 'mycompany' -in ``/etc/odoo.conf`` set: +in :ref:`the configuration file ` set: .. code-block:: ini @@ -238,7 +238,7 @@ Configuration sample * We'll use 8 workers + 1 for cron. We'll also use a monitoring system to measure cpu load, and check if it's between 7 and 7.5 . * RAM = 9 * ((0.8*150) + (0.2*1024)) ~= 3Go RAM for Odoo -in ``/etc/odoo.conf``: +in :ref:`the configuration file `: .. code-block:: ini @@ -273,7 +273,7 @@ Configuration sample * Redirect http requests to https * Proxy requests to odoo -in ``/etc/odoo.conf`` set: +in :ref:`the configuration file ` set: .. code-block:: ini diff --git a/content/administration/install/install.rst b/content/administration/install/install.rst index fc6eca666b..261be97241 100644 --- a/content/administration/install/install.rst +++ b/content/administration/install/install.rst @@ -282,14 +282,6 @@ SSH. If you do not know the difference between the two, the best option is most are following the :doc:`Getting started ` developer tutorial, or plan on contributing to Odoo source code, choose SSH. -.. note:: - **The Enterprise Git repository does not contain the full Odoo source code**. It is only a - collection of extra add-ons. The main server code is in the Community version. Running the - Enterprise version actually means running the server from the Community version with the - addons-path option set to the folder with the Enterprise version. You need to clone both the - Community and Enterprise repository to have a working Odoo Enterprise installation. See - :ref:`setup/install/editions` to get access to the Enterprise repository. - .. tabs:: .. group-tab:: Windows @@ -351,7 +343,8 @@ or plan on contributing to Odoo source code, choose SSH. collection of extra add-ons. The main server code is in the Community version. Running the Enterprise version actually means running the server from the Community version with the addons-path option set to the folder with the Enterprise version. You need to clone both the - Community and Enterprise repository to have a working Odoo Enterprise installation. + Community and Enterprise repository to have a working Odoo Enterprise installation. See + :ref:`setup/install/editions` to get access to the Enterprise repository. .. _setup/install/source/prepare: @@ -365,7 +358,7 @@ Python .. group-tab:: Windows - Odoo requires Python 3.7 or later to run. Visit `Python's download page `_ + Odoo requires Python 3.8 or later to run. Visit `Python's download page `_ to download and install the latest version of Python 3 on your machine. During installation, check **Add Python 3 to PATH**, then click **Customize Installation** and make @@ -387,7 +380,7 @@ Python .. group-tab:: Linux - Odoo requires Python 3.7 or later to run. Use your package manager to download and install Python 3 + Odoo requires Python 3.8 or later to run. Use your package manager to download and install Python 3 on your machine if it is not already done. .. note:: @@ -406,7 +399,7 @@ Python .. group-tab:: Mac OS - Odoo requires Python 3.7 or later to run. Use your preferred package manager (homebrew_, macports_) + Odoo requires Python 3.8 or later to run. Use your preferred package manager (homebrew_, macports_) to download and install Python 3 on your machine if it is not already done. .. note:: diff --git a/content/administration/maintain/domain_names.rst b/content/administration/maintain/domain_names.rst index ea5be71f5a..a446a6ccca 100644 --- a/content/administration/maintain/domain_names.rst +++ b/content/administration/maintain/domain_names.rst @@ -115,7 +115,7 @@ name with your website `. .. note:: - Free domain names are also available for free Odoo Online databases (if you installed one app only, for example). In this case, Odoo reviews your request and your website to avoid abuse. - This process may take up to three days. + This process can take several days due to the success of the offer. - This is not available for Odoo.sh databases yet. .. _domain-name/odoo-manage: diff --git a/content/administration/maintain/enterprise.rst b/content/administration/maintain/enterprise.rst index 25f9e7330b..33c3c12bcb 100644 --- a/content/administration/maintain/enterprise.rst +++ b/content/administration/maintain/enterprise.rst @@ -1,9 +1,9 @@ .. _setup/enterprise: -=============================== -Upgrade Community to Enterprise -=============================== +=================================== +Switch from Community to Enterprise +=================================== Depending on your current installation, there are multiple ways to upgrade your community version. @@ -98,7 +98,7 @@ On Windows .. code-block:: console - $ odoo.exe -d -i web_enterprise --stop-after-init + $ ..\python\python.exe odoo-bin -d -i web_enterprise --stop-after-init * No need to manually launch the server, the service is running. You should be able to connect to your Odoo Enterprise instance using your usual diff --git a/content/administration/maintain/enterprise/windows_setup.png b/content/administration/maintain/enterprise/windows_setup.png index a3f47f3f2c..6926bd3a43 100644 Binary files a/content/administration/maintain/enterprise/windows_setup.png and b/content/administration/maintain/enterprise/windows_setup.png differ diff --git a/content/administration/maintain/enterprise/windows_uninstall.png b/content/administration/maintain/enterprise/windows_uninstall.png index b75f6d84d9..e2a0cf421f 100644 Binary files a/content/administration/maintain/enterprise/windows_uninstall.png and b/content/administration/maintain/enterprise/windows_uninstall.png differ diff --git a/content/administration/maintain/odoo_online.rst b/content/administration/maintain/odoo_online.rst index 9024cbaf29..9d76cd480c 100644 --- a/content/administration/maintain/odoo_online.rst +++ b/content/administration/maintain/odoo_online.rst @@ -2,25 +2,15 @@ Odoo Online database management =============================== -To manage a database, sign in to https://www.odoo.com and access the `database management page -`_ by clicking on the user icon, then on -:guilabel:`My Databases`. +To manage a database, go to the `database manager `_ and sign in +as the database administrator. -.. image:: odoo_online/my-databases.png - :align: center - :alt: Clicking on the user icon opens a drop-down menu. "My databases" button is highlighted. +All the main database management options are available by clicking the database name, except the +upgrade option, which can be accessed by clicking the **arrow in a circle** icon next to the +database name. It is only displayed if an upgrade is available. -.. note:: - Make sure to connect as the administrator of the database that changes will be made on. - -.. image:: odoo_online/dropdown-menu.png - :align: right - :alt: Clicking on the gear icon opens the drop-down menu. - -Open the drop-down menu next to the database that changes will be made on by clicking on the gear -icon. - -Several actions are available: +.. image:: odoo_online/database-manager.png + :alt: Accessing the database management options - :ref:`odoo_online/upgrade` - :ref:`odoo_online/duplicate` @@ -37,39 +27,24 @@ Several actions are available: Upgrade ======= -If the database is *not* on the latest **Online version**, the administrator should receive an -invitation to :doc:`upgrade <../upgrade>` the database. A :guilabel:`Rolling Release`` button on the -database's main screen proposes an upgrade to the latest version (e.g., 14.0 to 16.1). - -.. important:: - - | **If the Odoo database's version is lower than the latest major release:** - | The database must be upgraded within two months. After these two months, an automatic - upgrade is initiated. - - | **If the Odoo database's version is equal to or higher than the latest major release:** - | Disregard the invitation to upgrade as the database probably wouldn't benefit from new - features every two months. - -.. note:: - Versions that are not supported anymore become deprecated and need to be updated to avoid - security issues. Odoo recommends that the company initiate the upgrade, as this method allows for - the company to request a test upgrade of the database to check for any discrepancies. +Trigger a database upgrade. .. seealso:: - - :doc:`../upgrade` - - :doc:`supported_versions` + For more information about the upgrade process, check out the :doc:`Odoo Online upgrade + documentation <../upgrade/odoo_online>`. .. _odoo_online/duplicate: Duplicate ========= -This allows to make an exact copy of the database to be able to perform testing without compromising -the daily operations. +Create an exact copy of the database, which can be used to perform testing without compromising +daily operations. .. important:: - - By checking :guilabel:`For testing purposes`, all external communication (emails, payments, - delivery orders, etc.) are disabled by default on the duplicated database. - - Duplicate databases expire automatically after 15 days. + - By checking :guilabel:`For testing purposes`, all external actions (emails, payments, delivery + orders, etc.) are disabled by default on the duplicated database. + - Duplicated databases expire automatically after 15 days. .. _odoo_online/rename: @@ -83,28 +58,31 @@ Rename the database and its URL. Download ======== -Instantly download a ZIP file with a backup of the database. +Download a ZIP file containing a backup of the database. .. note:: - Databases are backed up daily according to the `Odoo Cloud SLA + Databases are backed up daily as per the `Odoo Cloud Hosting SLA `_. .. _odoo_online/domains: -Domains -======= +Domain names +============ -Configure custom domains to access the database via another URL. +Use a custom :doc:`domain name ` to access the database via another URL. -.. seealso:: - - :doc:`domain_names` +.. tip:: + You can :ref:`register a domain name for free `. .. _odoo_online/tags: Tags ==== -Add tags to sort your databases out. You can search the tags in the search bar. +Add tags to easily identify and sort your databases. + +.. tip:: + You can search for tags in the search bar. .. _odoo_online/delete: @@ -114,44 +92,43 @@ Delete Delete a database instantly. .. danger:: - Deleting a database means that all data is permanently lost. The deletion is instant and for all - users. It is recommended to create a backup of the database before deleting it. + Deleting a database means that all data is permanently lost. The deletion is instant and applies + to all users. It is recommended to create a backup of the database before deleting it. -Carefully read the warning message that pops up and proceed only if the implications of deleting a -database are fully understood: +Carefully read the warning message and only proceed if the implications of deleting a database are +fully understood. .. image:: odoo_online/delete.png - :align: center - :alt: A warning message is prompted before deleting a database. + :alt: The warning message displayed before deleting a database .. note:: - Only an administrator can delete a database. - - The database name is immediately available for a new database. - - It is not possible to delete a database if it is expired or linked to a subscription. If - needed, please get in touch with `Odoo Support `_. + - The database name is immediately made available to anyone. + - Deleting a database if it has expired or is linked to a subscription is impossible. In that + case, contact `Odoo Support `_. .. _odoo_online/contact-support: -Contact Support -=============== +Contact us +========== -Access the Odoo `support page `_ with your database's details already +Access the `Odoo.com support page `_ with the database's details already pre-filled. .. _odoo_online/users: -Invite / Remove Users +Invite / remove users ===================== -To invite users, fill out the email address of the new user and click on :guilabel:`Invite`. To add -multiple users, click on :guilabel:`Add more users`. +To invite users, fill out the new user's email address and click :guilabel:`Invite`. To add multiple +users, click :guilabel:`Add more users`. .. image:: odoo_online/invite-users.png - :align: center - :alt: Clicking on "Add more users" adds additional email fields. + :alt: Inviting a user on a database -To remove users, select the users to remove and click on :guilabel:`Remove`. +To remove users, select them and click :guilabel:`Remove`. .. seealso:: - - :doc:`/applications/general/users/manage_users` - - :doc:`/applications/general/users/delete_account` + - :doc:`../../applications/general/users/manage_users` + - :doc:`../../applications/general/users/delete_account` + diff --git a/content/administration/maintain/odoo_online/database-manager.png b/content/administration/maintain/odoo_online/database-manager.png new file mode 100644 index 0000000000..a3254d29ad Binary files /dev/null and b/content/administration/maintain/odoo_online/database-manager.png differ diff --git a/content/administration/maintain/odoo_online/dropdown-menu.png b/content/administration/maintain/odoo_online/dropdown-menu.png deleted file mode 100644 index 0decd3fde3..0000000000 Binary files a/content/administration/maintain/odoo_online/dropdown-menu.png and /dev/null differ diff --git a/content/administration/maintain/odoo_online/my-databases.png b/content/administration/maintain/odoo_online/my-databases.png deleted file mode 100644 index 7815ebe63b..0000000000 Binary files a/content/administration/maintain/odoo_online/my-databases.png and /dev/null differ diff --git a/content/administration/maintain/supported_versions.rst b/content/administration/maintain/supported_versions.rst index b0a866b289..4d71fac7f7 100644 --- a/content/administration/maintain/supported_versions.rst +++ b/content/administration/maintain/supported_versions.rst @@ -23,47 +23,76 @@ This matrix shows the support status of every version. **Major releases are in bold type.** -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| | Odoo Online | Odoo.sh | On-Premise | Release date | End of support | -+=================+=============+==========+=============+================+========================+ -| Odoo saas~16.2 | |green| | N/A | N/A | March 2023 | June 2023 (planned) | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| Odoo saas~16.1 | |green| | N/A | N/A | February 2023 | April 2023 | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| **Odoo 16.0** | |green| | |green| | |green| | October 2022 | October 2025 (planned) | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| Odoo saas~15.2 | |red| | N/A | N/A | March 2022 | January 2023 | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| Odoo saas~15.1 | |red| | N/A | N/A | February 2022 | July 2022 | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| **Odoo 15.0** | |green| | |green| | |green| | October 2021 | October 2024 (planned) | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| **Odoo 14.0** | |green| | |green| | |green| | October 2020 | October 2023 (planned) | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| **Odoo 13.0** | |red| | |red| | |red| | October 2019 | October 2022 | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| Odoo saas~12.3 | |red| | N/A | N/A | August 2019 | | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| **Odoo 12.0** | |red| | |red| | |red| | October 2018 | October 2021 | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| Odoo saas~11.3 | |red| | N/A | N/A | April 2018 | | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| **Odoo 11.0** | |red| | |red| | |red| | October 2017 | October 2020 | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| Odoo 10.saas~15 | |red| | N/A | N/A | March 2017 | | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| Odoo 10.saas~14 | |red| | N/A | N/A | January 2017 | | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| **Odoo 10.0** | |red| | |red| | |red| | October 2016 | October 2019 | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| Odoo 9.saas~11 | |red| | N/A | N/A | May 2016 | | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| **Odoo 9.0** | |red| | N/A | |red| | October 2015 | October 2018 | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| Odoo 8.saas~6 | |red| | N/A | N/A | February 2015 | | -+-----------------+-------------+----------+-------------+----------------+------------------------+ -| **Odoo 8.0** | |red| | N/A | |red| | September 2014 | October 2017 | -+-----------------+-------------+----------+-------------+----------------+------------------------+ +.. list-table:: + :header-rows: 1 + :widths: auto + + * - + - Odoo Online + - Odoo.sh + - On-Premise + - Release date + - End of support + * - Odoo saas~16.4 + - |green| + - N/A + - N/A + - August 2023 + - + * - Odoo saas~16.3 + - |red| + - N/A + - N/A + - June 2023 + - + * - Odoo saas~16.2 + - |red| + - N/A + - N/A + - March 2023 + - + * - Odoo saas~16.1 + - |red| + - N/A + - N/A + - February 2023 + - + * - **Odoo 16.0** + - |green| + - |green| + - |green| + - October 2022 + - October 2025 (planned) + * - Odoo saas~15.2 + - |red| + - N/A + - N/A + - March 2022 + - January 2023 + * - Odoo saas~15.1 + - |red| + - N/A + - N/A + - February 2022 + - July 2022 + * - **Odoo 15.0** + - |green| + - |green| + - |green| + - October 2021 + - October 2024 (planned) + * - **Odoo 14.0** + - |green| + - |green| + - |green| + - October 2020 + - November 2023 (planned) + * - **Odoo 13.0** + - |red| + - |red| + - |red| + - October 2019 + - October 2022 .. note:: @@ -86,8 +115,10 @@ This matrix shows the support status of every version. I run an older version of Odoo/OpenERP/TinyERP ============================================== -OpenERP 7.0, 6.1, 6.0 and 5.0 is not supported anymore, on any platform. +Odoo 12.0, 11.0, 10.0, 9.0, and 8.0 are not supported anymore, on any platform. -TinyERP 4.0, 3.0, 2.0 and 1.0 is not supported anymore, on any platform. +OpenERP 7.0, 6.1, 6.0 and 5.0 are not supported anymore, on any platform. + +TinyERP 4.0, 3.0, 2.0 and 1.0 are not supported anymore, on any platform. Even though we don't support older versions, you can always `upgrade from any version `_. diff --git a/content/administration/odoo_sh/getting_started/settings.rst b/content/administration/odoo_sh/getting_started/settings.rst index baf91f5220..471ec16ff3 100644 --- a/content/administration/odoo_sh/getting_started/settings.rst +++ b/content/administration/odoo_sh/getting_started/settings.rst @@ -45,41 +45,101 @@ these databases if they have one, using their regular credentials. In addition, they cannot use the webshell nor have access to the server logs. -+---------------------+-----------------+-----------+-----------+ -| | | User | Admin | -+=====================+=================+===========+===========+ -|Development | History | X | X | -+---------------------+-----------------+-----------+-----------+ -| | 1-click connect | X | X | -+---------------------+-----------------+-----------+-----------+ -| | Logs | X | X | -+---------------------+-----------------+-----------+-----------+ -| | Shell/SSH | X | X | -+---------------------+-----------------+-----------+-----------+ -| | Mails | X | X | -+---------------------+-----------------+-----------+-----------+ -| | Settings | X | X | -+---------------------+-----------------+-----------+-----------+ -|Production & Staging | History | X | X | -+---------------------+-----------------+-----------+-----------+ -| | 1-click connect | | X | -+---------------------+-----------------+-----------+-----------+ -| | Logs | | X | -+---------------------+-----------------+-----------+-----------+ -| | Shell/SSH | | X | -+---------------------+-----------------+-----------+-----------+ -| | Mails | | X | -+---------------------+-----------------+-----------+-----------+ -| | Monitoring | | X | -+---------------------+-----------------+-----------+-----------+ -| | Backups | | X | -+---------------------+-----------------+-----------+-----------+ -| | Settings | X | X | -+---------------------+-----------------+-----------+-----------+ -|Status | | X | X | -+---------------------+-----------------+-----------+-----------+ -|Settings | | | X | -+---------------------+-----------------+-----------+-----------+ +.. list-table:: + :header-rows: 1 + :widths: auto + + * - + - + - User + - Admin + * - Development + - History + - |green| + - |green| + * - + - 1-click connect + - |green| + - |green| + * - + - Logs + - |green| + - |green| + * - + - Shell/SSH + - |green| + - |green| + * - + - Mails + - |green| + - |green| + * - + - Upgrade + - |green| + - |green| + * - + - Settings + - |green| + - |green| + * - Production & Staging + - History + - |green| + - |green| + * - + - 1-click connect + - + - |green| + * - + - Logs + - + - |green| + * - + - Shell/SSH + - + - |green| + * - + - Mails + - + - |green| + * - + - Monitoring + - + - |green| + * - + - Backups + - + - |green| + * - + - Upgrade + - + - |green| + * - + - Settings + - |green|\* + - |green| + * - Status + - + - |green| + - |green| + * - Settings + - + - + - |green| + +.. note:: + \* Only in staging branches + +.. |green| raw:: html + + + +.. |orange| raw:: html + + + +.. |red| raw:: html + + Public Access ============= diff --git a/content/administration/upgrade/odoo_online.rst b/content/administration/upgrade/odoo_online.rst index 0576eb214e..383c4175d9 100644 --- a/content/administration/upgrade/odoo_online.rst +++ b/content/administration/upgrade/odoo_online.rst @@ -2,29 +2,91 @@ Odoo Online =========== -Requesting a test upgrade -========================= +Odoo databases can be manually upgraded directly from the main Odoo website. To upgrade an Odoo +database, navigate to the `database manager `_ page and sign in. -#. Go to your `database manager `_ -#. Click on your profile icon and select *My Databases*. +The database manager page displays all of the Odoo databases associated with the user's account. Any +databases that are not already on the most recent version of Odoo display an **arrow in a circle** +icon next to the database name, indicating that the database can be upgraded. - .. image:: odoo_online/accessing-my-databases.png - :alt: Selecting My Databases under my profile +.. image:: odoo_online/databases-page.png + :align: center + :alt: The database manager page with an upgrade button next to the name of a database. -#. Click on the up arrow button next to your main database name to proceed to the test upgrade. +.. important:: + - If the database's version is **lower** than the latest major release: the database must be + upgraded within two months. After these two months, an automatic upgrade is initiated. + - If the database's version is **equal** to or **higher** than the latest major release: + you can disregard the invitation to upgrade, as the database probably would not benefit from + new features every two months. - .. image:: odoo_online/upgrade-option.png - :alt: Selecting the action settings icon +If a database is *not* on the latest online version, its administrator should receive an invitation +to upgrade on the database's dashboard, displayed as an **arrow in a circle**. -#. In the pop-up message that appears, select the target version and then :guilabel:`Test` as - purpose. +.. image:: odoo_online/database-notification.png + :alt: Invitation to upgrade on the database dashboard. - .. note:: - The :guilabel:`Production` purpose doesn't appear if you didn't test your upgraded database at - least once. +.. note:: + Versions that are not supported anymore become deprecated and must be updated to avoid + security issues. It is recommended to initiate the upgrade yourself and not wait for the + automatic upgrade, as the former method allows you to request a test upgrade of the database to + check for any discrepancies. -#. This triggers the automated upgrade process. A confirmation email is then sent to you with the - the link to the upgraded database or to provide information if the upgrade failed. +Test database +============= - .. note:: - You can also see and access your test database from your *My Databases* page. +Click on the **arrow in a circle** icon to start the upgrade process. On the :guilabel:`Upgrade your +database` pop-up, select the version of Odoo that the platform will be upgraded to. In the +:guilabel:`Email to notify` field, enter an email address that will receive email notifications +about the database upgrade. + +There is also a :guilabel:`Purpose` section on the pop-up that is used to specify the reason for the +upgrade. However, at this stage of the process, the only selectable option is :guilabel:`Test`, as +Odoo requires users to create a test copy of the upgraded database before converting the actual +database. + +.. image:: odoo_online/upgrade-pop-up.png + :align: center + :alt: The "Upgrade your database" pop-up. + +After filling out the form, click the :guilabel:`Upgrade` button. The pop-up disappears and the +database being upgraded shows a red :guilabel:`Upgrade in progress` tag next to its name. An email +confirming that the upgrade is in progress is also sent to the email address specified on the +pop-up. + +.. image:: odoo_online/upgrade-in-progress.png + :align: center + :alt: The "Upgrade in progress" tag next to the database name. + +Once the upgrade is complete, a new test database appears on the `database manager +`_ page. To access the test database, click the drop-down arrow +(:guilabel:`⯆`) to the left of the main database's name. Doing so makes the test version appear +below it. Finally, click the green :guilabel:`Connect` button on the right side of the test +version's row to go to the database. + +.. image:: odoo_online/test-database.png + :align: center + :alt: A test database on the database manager page. + +Except for being on the newer version of Odoo, the test database is an exact copy of the one being +upgraded. It is important to do extensive testing in this database to ensure that the upgrade has +not altered or corrupted any data, and that all workflows still proceed as expected. + +Production database +=================== + +After confirming the integrity of the new version, return to the `database manager +`_ page. Once again, click on the **arrow in a circle** icon next +to the database being upgraded. The :guilabel:`Upgrade your database` pop-up appears as before, +except that there is now a :guilabel:`Production` option under the :guilabel:`Purpose` section. + +Select the :guilabel:`Production` option and then click :guilabel:`Upgrade` to begin the upgrade +process. As before, a notification email is sent to the email address provided and a red +:guilabel:`Upgrade in progress` tag appears next to the name of the database. + +The production database is then taken offline and will be upgraded automatically. The time it takes +to upgrade the production database should be similar to the time that was necessary to upgrade the +test database. Make sure to inform database users of the scheduled downtime. + +After the upgrade is finished, the :guilabel:`Upgrade in progress` tag disappears and the database +is upgraded to the version specified. diff --git a/content/administration/upgrade/odoo_online/accessing-my-databases.png b/content/administration/upgrade/odoo_online/accessing-my-databases.png deleted file mode 100644 index 5d2a7e4bee..0000000000 Binary files a/content/administration/upgrade/odoo_online/accessing-my-databases.png and /dev/null differ diff --git a/content/administration/upgrade/odoo_online/database-notification.png b/content/administration/upgrade/odoo_online/database-notification.png new file mode 100644 index 0000000000..ab63c66133 Binary files /dev/null and b/content/administration/upgrade/odoo_online/database-notification.png differ diff --git a/content/administration/upgrade/odoo_online/databases-page.png b/content/administration/upgrade/odoo_online/databases-page.png new file mode 100644 index 0000000000..590e8c57d0 Binary files /dev/null and b/content/administration/upgrade/odoo_online/databases-page.png differ diff --git a/content/administration/upgrade/odoo_online/test-database.png b/content/administration/upgrade/odoo_online/test-database.png new file mode 100644 index 0000000000..a9ce2bf83e Binary files /dev/null and b/content/administration/upgrade/odoo_online/test-database.png differ diff --git a/content/administration/upgrade/odoo_online/upgrade-in-progress.png b/content/administration/upgrade/odoo_online/upgrade-in-progress.png new file mode 100644 index 0000000000..6835d15e05 Binary files /dev/null and b/content/administration/upgrade/odoo_online/upgrade-in-progress.png differ diff --git a/content/administration/upgrade/odoo_online/upgrade-option.png b/content/administration/upgrade/odoo_online/upgrade-option.png deleted file mode 100644 index 88e50d754a..0000000000 Binary files a/content/administration/upgrade/odoo_online/upgrade-option.png and /dev/null differ diff --git a/content/administration/upgrade/odoo_online/upgrade-pop-up.png b/content/administration/upgrade/odoo_online/upgrade-pop-up.png new file mode 100644 index 0000000000..5ce6544224 Binary files /dev/null and b/content/administration/upgrade/odoo_online/upgrade-pop-up.png differ diff --git a/content/applications/finance/accounting.rst b/content/applications/finance/accounting.rst index 40c2691c14..a6b2521671 100644 --- a/content/applications/finance/accounting.rst +++ b/content/applications/finance/accounting.rst @@ -1,7 +1,4 @@ -:nosearch: :show-content: -:hide-page-toc: -:show-toc: ======================== Accounting and Invoicing @@ -15,17 +12,229 @@ development with features such as AI-powered invoice recognition, synchronizatio accounts, smart matching suggestions, etc. .. seealso:: - - `Odoo Tutorials: Accounting `_ - - :doc:`Accounting Cheat Sheet ` + `Odoo Tutorials: Accounting `_ +.. cards:: + + .. card:: Get started + :target: accounting/get_started + :large: + + Basic concepts of accounting and initial setup of your accounting + + .. card:: Taxes + :target: accounting/taxes + + Taxes, fiscal positions, and integrations + + .. card:: Customer invoices + :target: accounting/customer_invoices + + Customer invoices, payment terms, and electronic invoicing + + .. card:: Vendor bills + :target: accounting/vendor_bills + + Vendor bills, assets, and invoice digitization (OCR) + + .. card:: Payments + :target: accounting/payments + + Invoices and bills payments (online, checks, batches) and follow-up on invoices + + .. card:: Bank and cash accounts + :target: accounting/bank + + Bank synchronization, reconciliation, and cash registers + + .. card:: Reporting + :target: accounting/reporting + + Reporting, declarations, and analytic accounting + +Double-entry bookkeeping +======================== + +Odoo automatically creates all the underlying journal entries for all accounting transactions (e.g., +customer invoices, vendor bills, point-of-sales orders, expenses, inventory valuations, etc.). + +Odoo uses the double-entry bookkeeping system, whereby every entry needs a corresponding and +opposite counterpart in a different account, with one account debited and the other credited. +It ensures that all transactions are recorded accurately and consistently and that the accounts +always balance. + +.. seealso:: + :doc:`Accounting Cheat Sheet ` + +Accrual and cash basis +====================== + +Both accrual and cash basis accounting are supported in Odoo. This allows reporting income and +expense either when the transaction occurs (accrual basis) or when the payment is made or received +(cash basis). + +.. seealso:: + :doc:`Cash basis ` + +Multi-company +============= + +Several companies can be managed within the same database. Each company has its :doc:`chart of +accounts `, which is also useful to generate consolidation +reports. Users can access several companies but can only work on a single company's accounting at a +time. + +Multi-currency environment +========================== + +A :doc:`multi-currency ` environment with an automated +exchange rate to ease international transactions is available in Odoo. Every transaction is recorded +in the company's default currency; for transactions occurring in another currency, Odoo stores both +the value in the company's currency and the transactions' currency value. Odoo generates currency +gains and losses after reconciling the journal items. + +.. seealso:: + :doc:`Manage a bank in a foreign currency ` + +International standards +======================= + +Odoo Accounting supports more than 70 countries. It provides the central standards and mechanisms +common to all nations, and thanks to country-specific modules, local requirements are fulfilled. +Fiscal positions exist to address regional specificities like the chart of accounts, taxes, or any +other requirements. + +.. seealso:: + :doc:`Fiscal localization packages ` + +Accounts receivable and payable +=============================== + +By default, there is a single account for the account receivable entries and one for the account +payable entries. As transactions are linked to your **contacts**, you can run a report per customer, +vendor, or supplier. + +The **Partner Ledger** report displays the balance of your customers and suppliers. It is available +by going to :menuselection:`Accounting --> Reporting --> Partner Ledger`. + +Reporting +========= + +The following financial :doc:`reports ` are available and updated in +real-time: + ++-----------------------------------------------+ +| Financial reports | ++============+==================================+ +| Statement | Balance sheet | +| +----------------------------------+ +| | Profit and loss | +| +----------------------------------+ +| | Cash flow statement | +| +----------------------------------+ +| | Tax report | +| +----------------------------------+ +| | ES sales list | ++------------+----------------------------------+ +| Audit | General ledger | +| +----------------------------------+ +| | Trial balance | +| +----------------------------------+ +| | Journal report | +| +----------------------------------+ +| | Intrastat report | +| +----------------------------------+ +| | Check register | ++------------+----------------------------------+ +| Partner | Partner ledger | +| +----------------------------------+ +| | Aged receivable | +| +----------------------------------+ +| | Aged payable | ++------------+----------------------------------+ +| Management | Invoice analysis | +| +----------------------------------+ +| | Unrealized currency gains/losses | +| +----------------------------------+ +| | Depreciation schedule | +| +----------------------------------+ +| | Disallowed expenses | +| +----------------------------------+ +| | Budget analysis | +| +----------------------------------+ +| | Product margins | +| +----------------------------------+ +| | 1099 report | ++------------+----------------------------------+ + +.. tip:: + :doc:`Create and customize reports ` with Odoo's report engine. + +Tax report +---------- + +Odoo computes all accounting transactions for the specific tax period and uses these totals to +calculate the tax obligation. + +.. important:: + Once the tax report has been generated for a period, Odoo locks it and prevents the creation of + new journal entries involving VAT. Any correction to customer invoices or vendor bills has to + be recorded in the next period. + +.. note:: + Depending on the country's localization, an XML version of the tax report can be generated to be + uploaded to the VAT platform of the relevant taxation authority. + +Bank synchronization +==================== + +The bank synchronization system directly connects with your bank institution to automatically +import all transactions into your database. It gives an overview of your cash flow without logging +into an online banking system or waiting for paper bank statements. + +.. seealso:: + :doc:`Bank synchronization ` + +Inventory valuation +=================== + +Both periodic (manual) and perpetual (automated) inventory valuations are supported in Odoo. The +available methods are standard price, average price, :abbr:`LIFO (Last-In, First-Out)` and +:abbr:`FIFO (First-In, First-Out).` + +.. seealso:: + :doc:`View the impact of the valuation methods on transactions + <../inventory_and_mrp/inventory/management/reporting/inventory_valuation_config>` + +Retained earnings +================= + +Retained earnings are the portion of income retained by a business. Odoo calculates current year +earnings in real-time, so no year-end journal or rollover is required. The profit +and loss balance is automatically reported on the balance sheet report. + +.. seealso:: + :doc:`Accounting Cheat Sheet ` + +Fiduciaries +=========== + +The :guilabel:`Accounting Firms` mode can be activated by going to :menuselection:`Accounting --> +Configuration --> Settings --> Accounting Firms mode`. When enabled: + +- The document's sequence becomes editable on all documents; +- The :guilabel:`Total (tax incl.)` field appears to speed up and control the encoding by automating + line creation with the right account and tax; +- :guilabel:`Invoice Date` and :guilabel:`Bill Date` are pre-filled when encoding a transaction. +- A :guilabel:`Quick encoding` option is available for customer invoices and vendor bills. .. toctree:: :titlesonly: - accounting/getting_started - accounting/receivables - accounting/payables + accounting/get_started + accounting/taxes + accounting/customer_invoices + accounting/vendor_bills + accounting/payments accounting/bank - accounting/taxation accounting/reporting - accounting/others diff --git a/content/applications/finance/accounting/bank.rst b/content/applications/finance/accounting/bank.rst index e46941a29e..c23f7fdb4b 100644 --- a/content/applications/finance/accounting/bank.rst +++ b/content/applications/finance/accounting/bank.rst @@ -1,14 +1,194 @@ -:nosearch: +:show-content: +====================== +Bank and cash accounts +====================== + +You can manage as many bank or cash accounts as needed on your database. Configuring them well +allows you to have all your banking data up-to-date and ready for :doc:`reconciliation +` with your journal entries. + +In Odoo Accounting, each bank account has a dedicated journal set to post all entries in a dedicated +account. Both the journal and the account are automatically created and configured whenever you add +a bank account. + +.. note:: + Cash journals and accounts must be configured manually. + +Bank journals are displayed by default on the :guilabel:`Accounting Dashboard` in the form of cards +which include action buttons. + +.. image:: bank/card.png + :alt: Bank journals are displayed on the Accounting Dashboard and contain action buttons + +.. _bank_accounts/manage: + +Manage your bank and cash accounts +================================== + +Connect your bank for automatic synchronization +----------------------------------------------- + +To connect your bank account to your database, go to :menuselection:`Accounting --> Configuration +--> Banks: Add a Bank Account`, select your bank in the list, click on :guilabel:`Connect`, and +follow the instructions. + +.. seealso:: + :doc:`bank/bank_synchronization` + +Create a bank account +--------------------- + +If your banking institution is not available in Odoo, or if you don't want to connect your bank +account to your database, you can configure your bank account manually. + +To manually add a bank account, go to :menuselection:`Accounting --> Configuration --> Banks: +Add a Bank Account`, click on :guilabel:`Create it` (at the bottom right), and fill out the form. + +.. note:: + - Odoo automatically detects the bank account type (e.g., IBAN) and enables some features + accordingly. + - A default bank journal is available and can be used to configure your bank account by going to + :menuselection:`Accounting --> Configuration --> Accounting: Journals --> Bank`. Open it and + edit the different fields to match your bank account information. + +Create a cash journal +--------------------- + +To create a new cash journal, go to :menuselection:`Accounting --> Configuration --> Accounting: +Journals`, click on :guilabel:`Create` and select :guilabel:`Cash` in the :guilabel:`Type` field. + +For more information on the accounting information fields, read the +:ref:`bank_accounts/configuration` section of this page. + +.. note:: + A default cash journal is available and can be used straight away. You can review it by going to + :menuselection:`Accounting --> Configuration --> Accounting: Journals --> Cash`. + +Edit an existing bank or cash journal +------------------------------------- + +To edit an existing bank journal, go to :menuselection:`Accounting --> Configuration --> Accounting: +Journals` and select the journal you want to modify. + +.. _bank_accounts/configuration: + +Configuration ============= -Bank and cash -============= + +You can edit the accounting information and bank account number according to your needs. + +.. image:: bank/bank-journal-config.png + :alt: Manually configure your bank information + +.. seealso:: + - :doc:`get_started/multi_currency` + - :doc:`bank/transactions` + +.. _bank_accounts/suspense: + +Suspense account +---------------- + +Bank statement transactions are posted on the :guilabel:`Suspense Account` until the final +reconciliation allows finding the right account. + +Profit and loss accounts +------------------------ + +The :guilabel:`Profit Account` is used to register a profit when the ending balance of a cash +register differs from what the system computes, while the :guilabel:`Loss Account` is used to +register a loss when the ending balance of a cash register differs from what the system computes. + +Currency +-------- + +You can edit the currency used to enter the statements. + +.. seealso:: + :doc:`get_started/multi_currency` + +Account number +-------------- + +If you need to **edit your bank account details**, click on the external link arrow next to your +:guilabel:`Account Number`. On the new page, click on the external link arrow next to your +:guilabel:`Bank` and update your bank information accordingly. These details are used when +registering payments. + +.. image:: bank/bank-account-number.png + :alt: Edit your bank information + +Bank feeds +---------- + +:guilabel:`Bank Feeds` defines how the bank statements are registered. Three options are available: + +- :guilabel:`Undefined yet`, which should be selected when you don’t know yet if you will + synchronize your bank account with your database or not. +- :guilabel:`Import (CAMT, CODA, CSV, OFX, QIF)`, which should be selected if you want to import + your bank statement using a different format. +- :guilabel:`Automated Bank Synchronization`, which should be selected if your bank is synchronized + with your database. + +.. seealso:: + - :doc:`bank/bank_synchronization` + - :doc:`bank/transactions` + +.. _bank/outstanding-accounts: + +Outstanding accounts +==================== + +By default, payments are registered through transitory accounts named **outstanding accounts**, +before being recorded in your bank account. + +- An **outstanding payments account** is where outgoing payments are posted until they are linked + with a withdrawal from your bank statement. +- An **outstanding receipts account** is where incoming payments are posted until they are linked + with a deposit from your bank statement. + +These accounts should be of :ref:`type ` :guilabel:`Current Assets`. + +.. note:: + The movement from an outstanding account to a bank account is done automatically when you + reconcile the bank account with a bank statement. + +Default accounts configuration +------------------------------ + +The outstanding accounts are defined by default. If necessary, you can update them by going to +:menuselection:`Accounting --> Configuration --> Settings --> Default Accounts` and update your +:guilabel:`Outstanding Receipts Account` and :guilabel:`Outstanding Payments Account`. + +Bank and cash journals configuration +------------------------------------ + +You can also set specific outstanding accounts for any journal with the :ref:`type +` :guilabel:`Bank` or :guilabel:`Cash`. + +From your :guilabel:`Accounting Dashboard`, click on the menu selection ⋮ of the journal you want to +configure, and click on :guilabel:`Configuration`, then open the :guilabel:`Incoming/Outgoing +Payments` tab. To display the outstanding accounts column, click on the toggle button and check the +:guilabel:`Outstanding Receipts/Payments accounts`, then update the account. + +.. image:: bank/toggle-button.png + :align: center + :alt: Select the toggle button and click on outstanding Accounts + +.. note:: + - If you do not specify an outstanding payments account or an outstanding receipts account for a + specific journal, Odoo uses the default outstanding accounts. + - If your main bank account is added as an outstanding receipts account or outstanding payments + account, when a payment is registered, the invoice or bill's status is directly set to + :guilabel:`Paid`. .. toctree:: :titlesonly: - bank/setup bank/bank_synchronization bank/transactions bank/reconciliation - bank/interbank + bank/reconciliation_models + bank/foreign_currency + bank/cash_register diff --git a/content/applications/finance/accounting/bank/setup/bank_accounts/bank-account-number.png b/content/applications/finance/accounting/bank/bank-account-number.png similarity index 100% rename from content/applications/finance/accounting/bank/setup/bank_accounts/bank-account-number.png rename to content/applications/finance/accounting/bank/bank-account-number.png diff --git a/content/applications/finance/accounting/bank/setup/bank_accounts/bank-journal-config.png b/content/applications/finance/accounting/bank/bank-journal-config.png similarity index 100% rename from content/applications/finance/accounting/bank/setup/bank_accounts/bank-journal-config.png rename to content/applications/finance/accounting/bank/bank-journal-config.png diff --git a/content/applications/finance/accounting/bank/setup/bank_accounts/card.png b/content/applications/finance/accounting/bank/card.png similarity index 100% rename from content/applications/finance/accounting/bank/setup/bank_accounts/card.png rename to content/applications/finance/accounting/bank/card.png diff --git a/content/applications/finance/accounting/bank/setup/manage_cash_register.rst b/content/applications/finance/accounting/bank/cash_register.rst similarity index 86% rename from content/applications/finance/accounting/bank/setup/manage_cash_register.rst rename to content/applications/finance/accounting/bank/cash_register.rst index 365ad2b132..8f73141c22 100644 --- a/content/applications/finance/accounting/bank/setup/manage_cash_register.rst +++ b/content/applications/finance/accounting/bank/cash_register.rst @@ -1,6 +1,6 @@ -====================== -Manage a cash register -====================== +============= +Cash register +============= The cash register is a journal to register receivings and payments transactions. It calculates the total money in and out, computing the total balance. @@ -8,7 +8,7 @@ It calculates the total money in and out, computing the total balance. Configuration ============= -.. image:: manage_cash_register/journal.png +.. image:: cash_register/journal.png :align: center 1. Configure the Cash journal in :menuselection:`Accounting --> Configuration --> @@ -40,7 +40,7 @@ Put money in is used to placed your cash manually before starting your transactions. From the Register Transactions window, go to :menuselection:`More --> Put money in` -.. image:: manage_cash_register/put-money-in.png +.. image:: cash_register/put-money-in.png :align: center Take money out @@ -50,7 +50,7 @@ Take money out is used to collect/get yor your cash manually after ending all your transactions. From the Register Transaction windows, go to :menuselection:`More --> Take money out` -.. image:: manage_cash_register/put-money-out.png +.. image:: cash_register/put-money-out.png :align: center The transactions will be added to the current cash payment registration. diff --git a/content/applications/finance/accounting/bank/setup/manage_cash_register/journal.png b/content/applications/finance/accounting/bank/cash_register/journal.png similarity index 100% rename from content/applications/finance/accounting/bank/setup/manage_cash_register/journal.png rename to content/applications/finance/accounting/bank/cash_register/journal.png diff --git a/content/applications/finance/accounting/bank/setup/manage_cash_register/put-money-in.png b/content/applications/finance/accounting/bank/cash_register/put-money-in.png similarity index 100% rename from content/applications/finance/accounting/bank/setup/manage_cash_register/put-money-in.png rename to content/applications/finance/accounting/bank/cash_register/put-money-in.png diff --git a/content/applications/finance/accounting/bank/setup/manage_cash_register/put-money-out.png b/content/applications/finance/accounting/bank/cash_register/put-money-out.png similarity index 100% rename from content/applications/finance/accounting/bank/setup/manage_cash_register/put-money-out.png rename to content/applications/finance/accounting/bank/cash_register/put-money-out.png diff --git a/content/applications/finance/accounting/bank/setup/foreign_currency.rst b/content/applications/finance/accounting/bank/foreign_currency.rst similarity index 100% rename from content/applications/finance/accounting/bank/setup/foreign_currency.rst rename to content/applications/finance/accounting/bank/foreign_currency.rst diff --git a/content/applications/finance/accounting/bank/setup/foreign_currency/foreign-adjustment.png b/content/applications/finance/accounting/bank/foreign_currency/foreign-adjustment.png similarity index 100% rename from content/applications/finance/accounting/bank/setup/foreign_currency/foreign-adjustment.png rename to content/applications/finance/accounting/bank/foreign_currency/foreign-adjustment.png diff --git a/content/applications/finance/accounting/bank/setup/foreign_currency/foreign-bill-currency.png b/content/applications/finance/accounting/bank/foreign_currency/foreign-bill-currency.png similarity index 100% rename from content/applications/finance/accounting/bank/setup/foreign_currency/foreign-bill-currency.png rename to content/applications/finance/accounting/bank/foreign_currency/foreign-bill-currency.png diff --git a/content/applications/finance/accounting/bank/setup/foreign_currency/foreign-exchange-rates.png b/content/applications/finance/accounting/bank/foreign_currency/foreign-exchange-rates.png similarity index 100% rename from content/applications/finance/accounting/bank/setup/foreign_currency/foreign-exchange-rates.png rename to content/applications/finance/accounting/bank/foreign_currency/foreign-exchange-rates.png diff --git a/content/applications/finance/accounting/bank/setup/foreign_currency/foreign-gains-losses.png b/content/applications/finance/accounting/bank/foreign_currency/foreign-gains-losses.png similarity index 100% rename from content/applications/finance/accounting/bank/setup/foreign_currency/foreign-gains-losses.png rename to content/applications/finance/accounting/bank/foreign_currency/foreign-gains-losses.png diff --git a/content/applications/finance/accounting/bank/setup/foreign_currency/foreign-journal.png b/content/applications/finance/accounting/bank/foreign_currency/foreign-journal.png similarity index 100% rename from content/applications/finance/accounting/bank/setup/foreign_currency/foreign-journal.png rename to content/applications/finance/accounting/bank/foreign_currency/foreign-journal.png diff --git a/content/applications/finance/accounting/bank/setup/foreign_currency/foreign-reset-rates.png b/content/applications/finance/accounting/bank/foreign_currency/foreign-reset-rates.png similarity index 100% rename from content/applications/finance/accounting/bank/setup/foreign_currency/foreign-reset-rates.png rename to content/applications/finance/accounting/bank/foreign_currency/foreign-reset-rates.png diff --git a/content/applications/finance/accounting/bank/reconciliation.rst b/content/applications/finance/accounting/bank/reconciliation.rst index 5d23402ea9..7a942425fa 100644 --- a/content/applications/finance/accounting/bank/reconciliation.rst +++ b/content/applications/finance/accounting/bank/reconciliation.rst @@ -1,11 +1,95 @@ -:nosearch: - =================== Bank reconciliation =================== -.. toctree:: - :titlesonly: +Overview +======== + +Matching your bank statements with your accounting records can be a tedious task. You need to find the corresponding invoices, compare the amounts and partners' details with those in the bank statement. These steps can take a lot of time. Luckily, with Odoo you can very easily match your invoices or any other payment document with your bank statements. + +Two options of the reconciliation process exist in Odoo. + +1. We can directly specify the payment on the invoice +2. We can reconcile open invoices with bank statements + +Configuration +============= + +No special configuration is necessary to record invoices. All we need +to do is to install the accounting app. + +.. image:: reconciliation/use01.png + +Use cases +========= + +Case 1: Payments registration +----------------------------- + +We received the proof of payment of our invoice in the amount of 2100 euros issued to +Smith & Co. + +We start at our issued Invoice of 2100 euros for Smith & Co. Because the +sold product is a service we demand an immediate payment. Our accountant +only handles bank statements at the end of week, so we have to mark +this invoice as paid immediately in order to indicate that we can start rendering services to our +customer. + +Our customer send us a payment confirmation. We can thus register a +payment and mark the invoice as paid. + +.. image:: reconciliation/use02.png + +By clicking on **register payment,** we are telling Odoo that our +customer has paid the Invoice. We thus have to specify the amount and the +payment method. + +.. image:: reconciliation/use03.png + +Now we can always find the payment details in the Invoice by clicking on the +:menuselection:`Info --> Open Payment`. + +.. image:: reconciliation/use04.png + +The invoice has been paid and **the reconciliation has been done +automatically.** + +Case 2: Bank statements reconciliations +--------------------------------------- + +We start at our issued Invoice of 3000 euros for Smith & Co. Let's also +assume that other Invoices are open for different customers. + +.. image:: reconciliation/use05.png + +We receive our bank statement and find that not only the invoice issued to Smith & Co has +been paid, but the one to Buzz of 92 euros as well. + +**Import** or **Create** the bank statements. Please refer to the +documents from the Bank Feeds section. + +.. image:: reconciliation/use06.png + +On the dashboard, click on **Reconcile # Items** + +.. image:: reconciliation/use07.png + +If everything was right (correct partner name, right amount) odoo will +do the reconciliations **automatically**. + +.. image:: reconciliation/use08.png + +If some issues are found, you will need to take **manual actions**. + +For example, if the partner is missing from your bank statement, just +fill it in : + +.. image:: reconciliation/use09.png + +If the payment is done with a down payment, just check if it is all +right and validate all related payments : + +.. image:: reconciliation/use10.png - reconciliation/use_cases - reconciliation/reconciliation_models +.. seealso:: + :doc:`bank_synchronization` diff --git a/content/applications/finance/accounting/bank/reconciliation/use_cases/use01.png b/content/applications/finance/accounting/bank/reconciliation/use01.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/use_cases/use01.png rename to content/applications/finance/accounting/bank/reconciliation/use01.png diff --git a/content/applications/finance/accounting/bank/reconciliation/use_cases/use02.png b/content/applications/finance/accounting/bank/reconciliation/use02.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/use_cases/use02.png rename to content/applications/finance/accounting/bank/reconciliation/use02.png diff --git a/content/applications/finance/accounting/bank/reconciliation/use_cases/use03.png b/content/applications/finance/accounting/bank/reconciliation/use03.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/use_cases/use03.png rename to content/applications/finance/accounting/bank/reconciliation/use03.png diff --git a/content/applications/finance/accounting/bank/reconciliation/use_cases/use04.png b/content/applications/finance/accounting/bank/reconciliation/use04.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/use_cases/use04.png rename to content/applications/finance/accounting/bank/reconciliation/use04.png diff --git a/content/applications/finance/accounting/bank/reconciliation/use_cases/use05.png b/content/applications/finance/accounting/bank/reconciliation/use05.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/use_cases/use05.png rename to content/applications/finance/accounting/bank/reconciliation/use05.png diff --git a/content/applications/finance/accounting/bank/reconciliation/use_cases/use06.png b/content/applications/finance/accounting/bank/reconciliation/use06.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/use_cases/use06.png rename to content/applications/finance/accounting/bank/reconciliation/use06.png diff --git a/content/applications/finance/accounting/bank/reconciliation/use_cases/use07.png b/content/applications/finance/accounting/bank/reconciliation/use07.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/use_cases/use07.png rename to content/applications/finance/accounting/bank/reconciliation/use07.png diff --git a/content/applications/finance/accounting/bank/reconciliation/use_cases/use08.png b/content/applications/finance/accounting/bank/reconciliation/use08.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/use_cases/use08.png rename to content/applications/finance/accounting/bank/reconciliation/use08.png diff --git a/content/applications/finance/accounting/bank/reconciliation/use_cases/use09.png b/content/applications/finance/accounting/bank/reconciliation/use09.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/use_cases/use09.png rename to content/applications/finance/accounting/bank/reconciliation/use09.png diff --git a/content/applications/finance/accounting/bank/reconciliation/use_cases/use10.png b/content/applications/finance/accounting/bank/reconciliation/use10.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/use_cases/use10.png rename to content/applications/finance/accounting/bank/reconciliation/use10.png diff --git a/content/applications/finance/accounting/bank/reconciliation/use_cases.rst b/content/applications/finance/accounting/bank/reconciliation/use_cases.rst deleted file mode 100644 index 9bc891cb7c..0000000000 --- a/content/applications/finance/accounting/bank/reconciliation/use_cases.rst +++ /dev/null @@ -1,105 +0,0 @@ -======================================= -Bank reconciliation process - use cases -======================================= - -Overview -======== - -Matching your bank statements with your accounting records can be a tedious task. You need to find the corresponding invoices, compare the amounts and partners' details with those in the bank statement. These steps can take a lot of time. Luckily, with Odoo you can very easily match your invoices or any other payment document with your bank statements. - -Two options of the reconciliation process exist in Odoo. - -1. We can directly specify the payment on the invoice -2. We can reconcile open invoices with bank statements - -Configuration -============= - -No special configuration is necessary to record invoices. All we need -to do is to install the accounting app. - -.. image:: use_cases/use01.png - :align: center - -Use cases -========= - -Case 1: Payments registration ------------------------------ - -We received the proof of payment of our invoice in the amount of 2100 euros issued to -Smith & Co. - -We start at our issued Invoice of 2100 euros for Smith & Co. Because the -sold product is a service we demand an immediate payment. Our accountant -only handles bank statements at the end of week, so we have to mark -this invoice as paid immediately in order to indicate that we can start rendering services to our -customer. - -Our customer send us a payment confirmation. We can thus register a -payment and mark the invoice as paid. - -.. image:: use_cases/use02.png - :align: center - -By clicking on **register payment,** we are telling Odoo that our -customer has paid the Invoice. We thus have to specify the amount and the -payment method. - -.. image:: use_cases/use03.png - :align: center - -Now we can always find the payment details in the Invoice by clicking on the -:menuselection:`Info --> Open Payment`. - -.. image:: use_cases/use04.png - :align: center - -The invoice has been paid and **the reconciliation has been done -automatically.** - -Case 2: Bank statements reconciliations ---------------------------------------- - -We start at our issued Invoice of 3000 euros for Smith & Co. Let's also -assume that other Invoices are open for different customers. - -.. image:: use_cases/use05.png - :align: center - -We receive our bank statement and find that not only the invoice issued to Smith & Co has -been paid, but the one to Buzz of 92 euros as well. - -**Import** or **Create** the bank statements. Please refer to the -documents from the Bank Feeds section. - -.. image:: use_cases/use06.png - :align: center - -On the dashboard, click on **Reconcile # Items** - -.. image:: use_cases/use07.png - :align: center - -If everything was right (correct partner name, right amount) odoo will -do the reconciliations **automatically**. - -.. image:: use_cases/use08.png - :align: center - -If some issues are found, you will need to take **manual actions**. - -For example, if the partner is missing from your bank statement, just -fill it in : - -.. image:: use_cases/use09.png - :align: center - -If the payment is done with a down payment, just check if it is all -right and validate all related payments : - -.. image:: use_cases/use10.png - :align: center - -.. seealso:: - :doc:`../bank_synchronization` diff --git a/content/applications/finance/accounting/bank/reconciliation/reconciliation_models.rst b/content/applications/finance/accounting/bank/reconciliation_models.rst similarity index 95% rename from content/applications/finance/accounting/bank/reconciliation/reconciliation_models.rst rename to content/applications/finance/accounting/bank/reconciliation_models.rst index e622eb9e75..91c70d5bb1 100644 --- a/content/applications/finance/accounting/bank/reconciliation/reconciliation_models.rst +++ b/content/applications/finance/accounting/bank/reconciliation_models.rst @@ -12,7 +12,7 @@ with recurrent entries such as bank fees. .. note:: Reconciliation Models are also useful to handle *Cash Discounts*. Please refer to - :doc:`this documentation <../../receivables/customer_invoices/cash_discounts>` for more + :doc:`this documentation <../customer_invoices/cash_discounts>` for more information. .. _reconciliation_models_types: @@ -124,6 +124,6 @@ line*. .. seealso:: - - :doc:`use_cases` - - :doc:`../bank_synchronization` - - :doc:`../../receivables/customer_invoices/cash_discounts` + - :doc:`reconciliation` + - :doc:`bank_synchronization` + - :doc:`../customer_invoices/cash_discounts` diff --git a/content/applications/finance/accounting/bank/reconciliation/reconciliation_models/reconciliation_models_button.png b/content/applications/finance/accounting/bank/reconciliation_models/reconciliation_models_button.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/reconciliation_models/reconciliation_models_button.png rename to content/applications/finance/accounting/bank/reconciliation_models/reconciliation_models_button.png diff --git a/content/applications/finance/accounting/bank/reconciliation/reconciliation_models/reconciliation_models_conditions.png b/content/applications/finance/accounting/bank/reconciliation_models/reconciliation_models_conditions.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/reconciliation_models/reconciliation_models_conditions.png rename to content/applications/finance/accounting/bank/reconciliation_models/reconciliation_models_conditions.png diff --git a/content/applications/finance/accounting/bank/reconciliation/reconciliation_models/reconciliation_models_counterparts.png b/content/applications/finance/accounting/bank/reconciliation_models/reconciliation_models_counterparts.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/reconciliation_models/reconciliation_models_counterparts.png rename to content/applications/finance/accounting/bank/reconciliation_models/reconciliation_models_counterparts.png diff --git a/content/applications/finance/accounting/bank/reconciliation/reconciliation_models/reconciliation_models_match.png b/content/applications/finance/accounting/bank/reconciliation_models/reconciliation_models_match.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/reconciliation_models/reconciliation_models_match.png rename to content/applications/finance/accounting/bank/reconciliation_models/reconciliation_models_match.png diff --git a/content/applications/finance/accounting/bank/reconciliation/reconciliation_models/reconciliation_models_overview.png b/content/applications/finance/accounting/bank/reconciliation_models/reconciliation_models_overview.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/reconciliation_models/reconciliation_models_overview.png rename to content/applications/finance/accounting/bank/reconciliation_models/reconciliation_models_overview.png diff --git a/content/applications/finance/accounting/bank/reconciliation/reconciliation_models/reconciliation_models_suggestion.png b/content/applications/finance/accounting/bank/reconciliation_models/reconciliation_models_suggestion.png similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation/reconciliation_models/reconciliation_models_suggestion.png rename to content/applications/finance/accounting/bank/reconciliation_models/reconciliation_models_suggestion.png diff --git a/content/applications/finance/accounting/bank/setup.rst b/content/applications/finance/accounting/bank/setup.rst deleted file mode 100644 index bc46505b89..0000000000 --- a/content/applications/finance/accounting/bank/setup.rst +++ /dev/null @@ -1,13 +0,0 @@ -:nosearch: - -===== -Setup -===== - -.. toctree:: - :titlesonly: - - setup/bank_accounts - setup/outstanding_accounts - setup/manage_cash_register - setup/foreign_currency diff --git a/content/applications/finance/accounting/bank/setup/bank_accounts.rst b/content/applications/finance/accounting/bank/setup/bank_accounts.rst deleted file mode 100644 index 9dade24943..0000000000 --- a/content/applications/finance/accounting/bank/setup/bank_accounts.rst +++ /dev/null @@ -1,136 +0,0 @@ -====================== -Bank and cash accounts -====================== - -You can manage as many bank or cash accounts as needed on your database. Configuring them well -allows you to have all your banking data up-to-date and ready for :doc:`reconciliation -<../reconciliation/use_cases>` with your journal entries. - -In Odoo Accounting, each bank account has a dedicated journal set to post all entries in a dedicated -account. Both the journal and the account are automatically created and configured whenever you add -a bank account. - -.. note:: - Cash journals and accounts must be configured manually. - -Bank journals are displayed by default on the :guilabel:`Accounting Dashboard` in the form of cards -which include action buttons. - -.. image:: bank_accounts/card.png - :align: center - :alt: Bank journals are displayed on the Accounting Dashboard and contain action buttons - -.. _bank_accounts/manage: - -Manage your bank and cash accounts -================================== - -Connect your bank for automatic synchronization ------------------------------------------------ - -To connect your bank account to your database, go to :menuselection:`Accounting --> Configuration ---> Banks: Add a Bank Account`, select your bank in the list, click on :guilabel:`Connect`, and -follow the instructions. - -.. seealso:: - :doc:`../bank_synchronization` - -Create a bank account ---------------------- - -If your banking institution is not available in Odoo, or if you don't want to connect your bank -account to your database, you can configure your bank account manually. - -To manually add a bank account, go to :menuselection:`Accounting --> Configuration --> Banks: -Add a Bank Account`, click on :guilabel:`Create it` (at the bottom right), and fill out the form. - -.. note:: - - Odoo automatically detects the bank account type (e.g., IBAN) and enables some features - accordingly. - - A default bank journal is available and can be used to configure your bank account by going to - :menuselection:`Accounting --> Configuration --> Accounting: Journals --> Bank`. Open it and - edit the different fields to match your bank account information. - -Create a cash journal ---------------------- - -To create a new cash journal, go to :menuselection:`Accounting --> Configuration --> Accounting: -Journals`, click on :guilabel:`Create` and select :guilabel:`Cash` in the :guilabel:`Type` field. - -For more information on the accounting information fields, read the -:ref:`bank_accounts/configuration` section of this page. - -.. note:: - A default cash journal is available and can be used straight away. You can review it by going to - :menuselection:`Accounting --> Configuration --> Accounting: Journals --> Cash`. - -Edit an existing bank or cash journal -------------------------------------- - -To edit an existing bank journal, go to :menuselection:`Accounting --> Configuration --> Accounting: -Journals` and select the journal you want to modify. - -.. _bank_accounts/configuration: - -Configuration -============= - -You can edit the accounting information and bank account number according to your needs. - -.. image:: bank_accounts/bank-journal-config.png - :align: center - :alt: Manually configure your bank information - -.. seealso:: - - :doc:`../../others/multi_currency` - - :doc:`../transactions` - - :doc:`../../bank/setup/outstanding_accounts` - -Suspense account ----------------- - -Bank statement transactions are posted on the :guilabel:`Suspense Account` until the final -reconciliation allows finding the right account. - -Profit and loss accounts ------------------------- - -The :guilabel:`Profit Account` is used to register a profit when the ending balance of a cash -register differs from what the system computes, while the :guilabel:`Loss Account` is used to -register a loss when the ending balance of a cash register differs from what the system computes. - -Currency --------- - -You can edit the currency used to enter the statements. - -.. seealso:: - :doc:`../../others/multi_currency` - -Account number --------------- - -If you need to **edit your bank account details**, click on the external link arrow next to your -:guilabel:`Account Number`. On the new page, click on the external link arrow next to your -:guilabel:`Bank` and update your bank information accordingly. These details are used when -registering payments. - -.. image:: bank_accounts/bank-account-number.png - :align: center - :alt: Edit your bank information - -Bank feeds ----------- - -:guilabel:`Bank Feeds` defines how the bank statements are registered. Three options are available: - -- :guilabel:`Undefined yet`, which should be selected when you don’t know yet if you will - synchronize your bank account with your database or not. -- :guilabel:`Import (CAMT, CODA, CSV, OFX, QIF)`, which should be selected if you want to import - your bank statement using a different format. -- :guilabel:`Automated Bank Synchronization`, which should be selected if your bank is synchronized - with your database. - -.. seealso:: - - :doc:`../bank_synchronization` - - :doc:`../transactions` diff --git a/content/applications/finance/accounting/bank/setup/outstanding_accounts.rst b/content/applications/finance/accounting/bank/setup/outstanding_accounts.rst deleted file mode 100644 index 9d4903909d..0000000000 --- a/content/applications/finance/accounting/bank/setup/outstanding_accounts.rst +++ /dev/null @@ -1,49 +0,0 @@ -==================== -Outstanding accounts -==================== - -By default, payments are registered through transitory accounts named **outstanding accounts**, -before being recorded in your bank account. - -- An **outstanding payments account** is where outgoing payments are posted until they are linked - with a withdrawal from your bank statement. -- An **outstanding receipts account** is where incoming payments are posted until they are linked - with a deposit from your bank statement. - -These accounts should be of :ref:`type ` :guilabel:`Current Assets`. - -.. note:: - The movement from an outstanding account to a bank account is done automatically when you - reconcile the bank account with a bank statement. - -Configuration -============= - -Default accounts configuration ------------------------------- - -The outstanding accounts are defined by default. If necessary, you can update them by going to -:menuselection:`Accounting --> Configuration --> Settings --> Default Accounts` and update your -:guilabel:`Outstanding Receipts Account` and :guilabel:`Outstanding Payments Account`. - -Bank and cash journals configuration ------------------------------------- - -You can also set specific outstanding accounts for any journal with the :ref:`type -` :guilabel:`Bank` or :guilabel:`Cash`. - -From your :guilabel:`Accounting Dashboard`, click on the menu selection ⋮ of the journal you want to -configure, and click on :guilabel:`Configuration`, then open the :guilabel:`Incoming/Outgoing -Payments` tab. To display the outstanding accounts column, click on the toggle button and check the -:guilabel:`Outstanding Receipts/Payments accounts`, then update the account. - -.. image:: outstanding_accounts/toggle-button.png - :align: center - :alt: Select the toggle button and click on outstanding Accounts - -.. note:: - - If you do not specify an outstanding payments account or an outstanding receipts account for a - specific journal, Odoo uses the default outstanding accounts. - - If your main bank account is added as an outstanding receipts account or outstanding payments - account, when a payment is registered, the invoice or bill's status is directly set to - :guilabel:`Paid`. diff --git a/content/applications/finance/accounting/bank/setup/outstanding_accounts/toggle-button.png b/content/applications/finance/accounting/bank/toggle-button.png similarity index 100% rename from content/applications/finance/accounting/bank/setup/outstanding_accounts/toggle-button.png rename to content/applications/finance/accounting/bank/toggle-button.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice.rst b/content/applications/finance/accounting/customer_invoices.rst similarity index 82% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice.rst rename to content/applications/finance/accounting/customer_invoices.rst index 2fcaf854e0..331590aae1 100644 --- a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice.rst +++ b/content/applications/finance/accounting/customer_invoices.rst @@ -1,4 +1,9 @@ -============================================ +:show-content: + +================= +Customer invoices +================= + From Customer Invoice to Payments Collection ============================================ @@ -9,7 +14,7 @@ spanning multiple invoices and taking discounts for early payments, you can do so efficiently and accurately. From Draft Invoice to Profit and Loss -===================================== +------------------------------------- If we pick up at the end of a typical 'order to cash' scenario, after the goods have been shipped, you will: issue an invoice; receive @@ -27,7 +32,7 @@ point, Odoo supports the creation of what is called a Draft Invoice by Warehouse staff. Invoice creation -================ +---------------- Draft invoices can be manually generated from other documents such as Sales Orders, Purchase Orders,etc. Although you can create a draft @@ -39,7 +44,7 @@ and delivered. It must also include other information needed to pay the invoice in a timely and precise manner. Draft invoices -============== +-------------- The system generates invoice which are initially set to the Draft state. While these invoices @@ -55,11 +60,9 @@ Let's create a customer invoice with following information: - Unit Price: 100 - Taxes: Tax 15% -.. image:: customer_invoice/invoice01.png - :align: center +.. image:: customer_invoices/invoice01.png -.. image:: customer_invoice/invoice02.png - :align: center +.. image:: customer_invoices/invoice02.png The document is composed of three parts: @@ -68,7 +71,7 @@ The document is composed of three parts: - the bottom of the page, with detail about the taxes, and the totals. Open or Pro-forma invoices -========================== +-------------------------- An invoice will usually include the quantity and the price of goods and/or services, the date, any parties involved, the unique invoice @@ -80,25 +83,22 @@ then moves from the Draft state to the Open state. When you have validated an invoice, Odoo gives it a unique number from a defined, and modifiable, sequence. -.. image:: customer_invoice/invoice03.png - :align: center +.. image:: customer_invoices/invoice03.png Accounting entries corresponding to this invoice are automatically generated when you validate the invoice. You can see the details by clicking on the entry in the Journal Entry field in the "Other Info" tab. -.. image:: customer_invoice/invoice04.png - :align: center +.. image:: customer_invoices/invoice04.png Send the invoice to customer -============================ +---------------------------- After validating the customer invoice, you can directly send it to the customer via the 'Send by email' functionality. -.. image:: customer_invoice/invoice05.png - :align: center +.. image:: customer_invoices/invoice05.png A typical journal entry generated from a validated invoice will look like as follows: @@ -114,7 +114,7 @@ like as follows: +-----------------------+---------------+----------------+-------------+--------------+ Payment -======= +------- In Odoo, an invoice is considered to be paid when the associated accounting entry has been reconciled with the payment entries. If there @@ -133,7 +133,7 @@ follows: +-----------------------+---------------+----------------+-------------+--------------+ Receive a partial payment through the bank statement -==================================================== +---------------------------------------------------- You can manually enter your bank statements in Odoo, or you can import them in from a csv file or from several other predefined formats @@ -142,16 +142,14 @@ according to your accounting localisation. Create a bank statement from the accounting dashboard with the related journal and enter an amount of $100 . -.. image:: customer_invoice/invoice06.png - :align: center +.. image:: customer_invoices/invoice06.png Reconcile -========= +--------- Now let's reconcile! -.. image:: customer_invoice/invoice07.png - :align: center +.. image:: customer_invoices/invoice07.png You can now go through every transaction and reconcile them or you can mass reconcile with instructions at the bottom. @@ -159,20 +157,17 @@ After reconciling the items in the sheet, the related invoice will now display "You have outstanding payments for this customer. You can reconcile them to pay this invoice. " -.. image:: customer_invoice/invoice08.png - :align: center +.. image:: customer_invoices/invoice08.png -.. image:: customer_invoice/invoice09.png - :align: center +.. image:: customer_invoices/invoice09.png Apply the payment. Below, you can see that the payment has been added to the invoice. -.. image:: customer_invoice/invoice10.png - :align: center +.. image:: customer_invoices/invoice10.png Payment Followup -================ +---------------- There's a growing trend of customers paying bills later and later. Therefore, collectors must make every effort to collect money and @@ -189,14 +184,14 @@ will be executed. By going to the customer record and diving into the "Overdue Payments" you will see the follow-up message and all overdue invoices. -.. image:: customer_invoice/invoice11.png - :align: center +.. image:: customer_invoices/invoice11.png -.. image:: customer_invoice/invoice12.png - :align: center +.. image:: customer_invoices/invoice12.png + +.. _customer-invoices/aging-report: Customer aging report: ----------------------- +~~~~~~~~~~~~~~~~~~~~~~ The customer aging report will be an additional key tool for the collector to understand the customer credit issues, and to prioritize @@ -205,32 +200,44 @@ their work. Use the aging report to determine which customers are overdue and begin your collection efforts. -.. image:: customer_invoice/invoice13.png - :align: center +.. image:: customer_invoices/invoice13.png Profit and loss -=============== +--------------- The Profit and Loss statement displays your revenue and expense details. Ultimately, this gives you a clear image of your Net Profit and Loss. It is sometimes referred to as the "Income Statement" or "Statement of Revenues and Expenses." -.. image:: customer_invoice/invoice14.png - :align: center +.. image:: customer_invoices/invoice14.png Balance sheet -============= +------------- The balance sheet summarizes your company's liabilities, assets and equity at a specific moment in time. -.. image:: customer_invoice/invoice15.png - :align: center +.. image:: customer_invoices/invoice15.png -.. image:: customer_invoice/invoice16.png - :align: center +.. image:: customer_invoices/invoice16.png For example, if you manage your inventory using the perpetual accounting method, you should expect a decrease in account "Current Assets" once the material has been shipped to the customer. + +.. toctree:: + :titlesonly: + + customer_invoices/overview + customer_invoices/customer_addresses + customer_invoices/payment_terms + customer_invoices/terms_conditions + customer_invoices/cash_discounts + customer_invoices/credit_notes + customer_invoices/cash_rounding + customer_invoices/deferred_revenues + customer_invoices/electronic_invoicing + customer_invoices/snailmail + customer_invoices/epc_qr_code + customer_invoices/incoterms diff --git a/content/applications/finance/accounting/receivables/customer_invoices/cash_discounts.rst b/content/applications/finance/accounting/customer_invoices/cash_discounts.rst similarity index 64% rename from content/applications/finance/accounting/receivables/customer_invoices/cash_discounts.rst rename to content/applications/finance/accounting/customer_invoices/cash_discounts.rst index a1e8c08222..381de322c8 100644 --- a/content/applications/finance/accounting/receivables/customer_invoices/cash_discounts.rst +++ b/content/applications/finance/accounting/customer_invoices/cash_discounts.rst @@ -5,7 +5,7 @@ Cash discounts and tax reduction **Cash discounts** are reductions in the amount a customer must pay for goods or services offered as an incentive for paying their invoice promptly. These discounts are typically a percentage of the total invoice amount and are applied if the customer pays within a specified time. Cash discounts -can help the company maintain a steady cash flow. +can help a company maintain a steady cash flow. .. example:: You issue a €100 invoice on the 1st of January. The full payment is due within 30 days, and you @@ -17,15 +17,46 @@ can help the company maintain a steady cash flow. A :ref:`tax reduction ` can also be applied depending on the country or region. +.. seealso:: + - :doc:`payment_terms` + - :doc:`../payments` + .. _cash-discounts/configuration: Configuration ============= -To grant cash discounts to customers, you must first set up the :ref:`type of tax reduction -`, verify the :ref:`gain and loss accounts -`, and configure new :ref:`payment terms -`. +To grant cash discounts to customers, you must first verify the :ref:`gain and loss accounts +`. Then, configure :ref:`payment terms +` and add a cash discount by checking the :guilabel:`Early Discount` +checkbox and filling in the discount percentage, discount days, and :ref:`tax +reduction ` fields. + +.. _cash-discounts/gain-loss-accounts: + +Cash discount gain/loss accounts +-------------------------------- + +With a cash discount, the amount you earn depends on whether the customer benefits from the cash +discount or not. This inevitably leads to gains and losses, which are recorded on default accounts. + +To modify these accounts, go to :menuselection:`Accounting --> Configuration --> Settings`, and, in +the :guilabel:`Default Accounts` section, select the accounts you want to use for the +:guilabel:`Cash Discount Gain account` and :guilabel:`Cash Discount Loss account`. + +.. _cash-discounts/payment-terms: + +Payment terms +------------- + +Cash discounts are defined on :doc:`payment terms `. Configure them to your liking by +going to :menuselection:`Accounting --> Configuration --> Payment Terms`, and make sure to fill out +the discount percentage, discount days, and :ref:`tax reduction ` +fields. + +.. image:: cash_discounts/payment-terms.png + :alt: Configuration of payment terms named "2/7 Net 30". The field "Description on Invoices" + reads: "Payment terms: 30 Days, 2% Early Payment Discount under 7 days". .. _cash-discounts/tax-reductions: @@ -33,24 +64,24 @@ Tax reductions -------------- Depending on the country or region, the base amount used to compute the tax can vary, which can lead -to a **tax reduction**. +to a **tax reduction**. Since tax reductions are set on individual payment terms, each term can use +a specific tax reduction. -To configure how the tax reduction is applied, go to :menuselection:`Accounting --> Configuration ---> Settings`, and in the :guilabel:`Taxes` section, in the :guilabel:`Cash Discount Tax Reduction` -feature, select one of the three following options: +To configure how the tax reduction is applied, go to a payment term with the :guilabel:`Early +Discount` checkbox enabled, and select one of the three following options: -Always (upon invoice) - The tax is always reduced. The base amount used to compute the tax is the discounted amount, - whether the customer benefits from the discount or not. +- Always (upon invoice) + The tax is always reduced. The base amount used to compute the tax is the discounted amount, + whether the customer benefits from the discount or not. -On early payment - The tax is reduced only if the customer pays early. The base amount used to compute the tax is the - same as the sale: if the customer benefits from the reduction, then the tax is reduced. This means - that, depending on the customer, the tax amount can vary after the invoice is issued. +- On early payment + The tax is reduced only if the customer pays early. The base amount used to compute the tax is the + same as the sale: if the customer benefits from the reduction, then the tax is reduced. This means + that, depending on the customer, the tax amount can vary after the invoice is issued. -Never - The tax is never reduced. The base amount used to compute the tax is the full amount, whether the - customer benefits from the discount or not. +- Never + The tax is never reduced. The base amount used to compute the tax is the full amount, whether the + customer benefits from the discount or not. .. example:: @@ -70,10 +101,10 @@ Never - Computation * - 8th of January - €118.58 - - (€98 + (21% of €98)) + - €98 + (21% of €98) * - 31st of January - €120.58 - - (€100 + (21% of €98)) + - €100 + (21% of €98) .. tab:: On early payment @@ -85,10 +116,10 @@ Never - Computation * - 8th of January - €118.58 - - (€98 + (21% of €98)) + - €98 + (21% of €98) * - 31st of January - €121.00 - - (€100 + (21% of €100)) + - €100 + (21% of €100) .. tab:: Never @@ -100,10 +131,10 @@ Never - Computation * - 8th of January - €119.00 - - (€98 + (21% of €100)) + - €98 + (21% of €100) * - 31st of January - €121.00 - - (€100 + (21% of €100)) + - €100 + (21% of €100) .. note:: - :ref:`Tax grids `, which are used for the tax report, are correctly @@ -112,41 +143,12 @@ Never - The **type of cash discount tax reduction** may be correctly pre-configured, depending on your :ref:`fiscal localization package `. -.. _cash-discounts/gain-loss-accounts: - -Cash discount gain/loss accounts --------------------------------- - -With a cash discount, the amount you earn depends on whether the customer benefits from the cash -discount or not. This inevitably leads to gains and losses, which are recorded on default accounts. - -To modify these accounts, go to :menuselection:`Accounting --> Configuration --> Settings`, and in -the :guilabel:`Default Accounts` section, select the accounts you want to use for the -:guilabel:`Cash Discount Gain account` and :guilabel:`Cash Discount Loss account`. - -.. _cash-discounts/payment-terms: - -Payment terms -------------- - -Cash discounts are defined on :doc:`payment terms `. Configure them to your liking by -going to :menuselection:`Accounting --> Configuration --> Payment Terms`, and make sure to fill out -the fields :guilabel:`Discount %` and :guilabel:`Discount Days`. - -.. image:: cash_discounts/payment-terms.png - :align: center - :alt: Configuration of payment terms named "2/7 Net 30". The field "Description on Invoices" - reads: "Payment terms: 30 Days, 2% Early Payment Discount under 7 days". - -.. seealso:: - :doc:`payment_terms` - .. _cash-discounts/customer-invoice: Apply a cash discount to a customer invoice =========================================== -Apply a cash discount to a customer invoice by selecting the :ref:`payment terms you created +On a customer invoice, apply a cash discount by selecting the :ref:`payment terms you created `. Odoo automatically computes the correct amounts, tax amounts, due dates, and accounting records. @@ -154,26 +156,23 @@ Under the :guilabel:`Journal Items` tab, you can display the discount details by "toggle" button and adding the :guilabel:`Discount Date` and :guilabel:`Discount Amount` columns. .. image:: cash_discounts/invoice-journal-entry.png - :align: center :alt: An invoice of €100.00 with "2/7 Net 30" selected as payment terms. The "Journal Items" tab is open, and the "Discount Date" and "Discount Amount" columns are displayed. -The discount amount and due date are also displayed on the generated invoice sent to the customer. +The discount amount and due date are also displayed on the generated invoice report sent to the +customer if the :guilabel:`Show installment dates` option is checked on the payment terms. .. image:: cash_discounts/invoice-print.png - :align: center - :alt: An invoice of €100.00 with the following text added to the terms and conditions: "30 Days, - 2% Early Payment Discount under 7 days. 118.58 € due if paid before 01/08/2023." + :alt: An invoice of €100.00 with the following text added to the terms and conditions: "30 + Days, 2% Early Payment Discount under 7 days. 118.58 € due if paid before 01/08/2023." Payment reconciliation ---------------------- -When you record a payment or reconcile your bank statements, Odoo takes the customer payment's date -into account to define if they can benefit from the cash discount or not. +When you record a :doc:`payment <../payments>` or :doc:`reconcile your bank transactions +<../bank/reconciliation>`, Odoo takes the customer payment's date into account to determine if the +customer can benefit from the cash discount or not. .. note:: - If your customer pays the discount amount *after* the discount date, you can always decide - whether to mark the invoice as fully paid with a write-off or as partially paid. - -.. seealso:: - :doc:`../customer_payments/recording` + If your customer pays the discount amount *after* the discount date, you can always decide to + mark the invoice as fully paid with a write-off or as partially paid. diff --git a/content/applications/finance/accounting/receivables/customer_invoices/cash_discounts/invoice-journal-entry.png b/content/applications/finance/accounting/customer_invoices/cash_discounts/invoice-journal-entry.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/cash_discounts/invoice-journal-entry.png rename to content/applications/finance/accounting/customer_invoices/cash_discounts/invoice-journal-entry.png diff --git a/content/applications/finance/accounting/receivables/customer_invoices/cash_discounts/invoice-print.png b/content/applications/finance/accounting/customer_invoices/cash_discounts/invoice-print.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/cash_discounts/invoice-print.png rename to content/applications/finance/accounting/customer_invoices/cash_discounts/invoice-print.png diff --git a/content/applications/finance/accounting/customer_invoices/cash_discounts/payment-terms.png b/content/applications/finance/accounting/customer_invoices/cash_discounts/payment-terms.png new file mode 100644 index 0000000000..1931f6ce85 Binary files /dev/null and b/content/applications/finance/accounting/customer_invoices/cash_discounts/payment-terms.png differ diff --git a/content/applications/finance/accounting/receivables/customer_invoices/cash_rounding.rst b/content/applications/finance/accounting/customer_invoices/cash_rounding.rst similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/cash_rounding.rst rename to content/applications/finance/accounting/customer_invoices/cash_rounding.rst diff --git a/content/applications/finance/accounting/receivables/customer_invoices/cash_rounding/cash_rounding01.png b/content/applications/finance/accounting/customer_invoices/cash_rounding/cash_rounding01.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/cash_rounding/cash_rounding01.png rename to content/applications/finance/accounting/customer_invoices/cash_rounding/cash_rounding01.png diff --git a/content/applications/finance/accounting/customer_invoices/credit_notes.rst b/content/applications/finance/accounting/customer_invoices/credit_notes.rst new file mode 100644 index 0000000000..b0dc53cf77 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/credit_notes.rst @@ -0,0 +1,118 @@ +======================== +Credit notes and refunds +======================== + +A **credit/debit note**, or **credit/debit memo**, is a document issued to a customer that notifies +them that they have been *credited/debited* a certain amount. + +Several use cases can lead to a credit note, such as: + + - a mistake in the invoice + - a return of the goods, or a rejection of the services + - the goods delivered are damaged + +Debit notes are less common but are most frequently used to track debts owed by customers or to +vendors because of modifications to confirmed customer invoices or vendor bills. + +.. note:: + Issuing a credit/debit note is the only legal way to cancel, refund, or modify a validated + invoice. Do not forget to **register the payment** afterward if you need to send money back to + your customer and/or validate the + :doc:`return ` if a storable product is + returned. + +Issue a credit note +=================== + +You can create a credit note from scratch by going to :menuselection:`Accounting --> Customers --> +Credit Notes`, and by clicking on :guilabel:`Create`. Filling out a credit note form works the same +way as an invoice form. + +However, most of the time, credit notes are generated directly from the related invoices. To do so, +go to :menuselection:`Accounting --> Customers --> Invoices`, open the related **customer invoice**, +and click on :guilabel:`Credit Note`. + +You can choose between three options: + + - :guilabel:`Partial Refund` + - :guilabel:`Full Refund` + - :guilabel:`Full refund and new draft invoice` + +.. note:: + A credit note sequence starts with `R` and is followed by the number of the related document + (e.g., RINV/2019/0004 is related to the invoice INV/2019/0004). + +Partial refund +-------------- + +When selecting the :guilabel:`Partial Refund` option, Odoo creates a draft credit note already +prefilled with all the necessary information from the original invoice. This is the option to choose +if you wish to do a partial refund or if you want to modify any detail of the credit note. + +.. note:: + This is the only option for invoices marked as *in payment* or *paid*. + +Full refund +----------- + +When selecting the :guilabel:`Full Refund` option, Odoo creates a credit note, automatically +validates it, and reconciles it with the related invoice. + +.. image:: credit_notes/credit_notes02.png + :alt: Full refund credit note. + +This is the option to choose for a full refund or to **cancel** a *validated* invoice. + +Full refund and new draft invoice +--------------------------------- + +When selecting the :guilabel:`Full refund and new draft invoice` option, Odoo creates a credit note, +automatically validates it, reconciles it with the related invoice, and opens a new draft invoice +prefilled with the same details from the original invoice. + +This is the option to **modify** the content of a *validated* invoice. + +Issue a debit note +================== + +You can create a debit note from scratch by going to :menuselection:`Accounting --> Customers --> +Invoices` or by clicking on the related invoice you wish to issue a debit note for. On the invoice +form view, click :guilabel:`Cog icon (⚙) --> Debit Note`, fill in the information, and click +:guilabel:`Create Debit Note`. + +Record a vendor refund +====================== + +**Vendor refunds** are recorded the same way as credit notes: + +You can either create a credit note from scratch by going to :menuselection:`Accounting --> Vendors +--> Refund`, and by clicking on :guilabel:`Create`; or by opening the related **vendor bill**, and +clicking on :guilabel:`Credit Note`. + +Record a debit note +=================== + +**Debit notes** from vendors are recorded in a similar way to how they are issued to customers: + +Go to :menuselection:`Accounting --> Vendors --> Bills`, open the related bill you wish to record a +debit note for, and click :guilabel:`Cog icon (⚙) --> Debit Note`. Fill in the information, and click +:guilabel:`Create Debit Note`. + +Journal entries +=============== + +Issuing a credit/debit note from an invoice/bill creates a **reverse entry** that zeroes out the +journal items generated by the original invoice. + + +.. example:: + The journal invoice of an entry: + + .. image:: credit_notes/credit_notes03.png + :alt: Invoice journal entry. + + And here is the credit note’s journal entry generated to reverse + the original invoice above: + + .. image:: credit_notes/credit_notes04.png + :alt: Credit note journal entry reverses the invoice journal entry. diff --git a/content/applications/finance/accounting/receivables/customer_invoices/credit_notes/credit_notes02.png b/content/applications/finance/accounting/customer_invoices/credit_notes/credit_notes02.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/credit_notes/credit_notes02.png rename to content/applications/finance/accounting/customer_invoices/credit_notes/credit_notes02.png diff --git a/content/applications/finance/accounting/receivables/customer_invoices/credit_notes/credit_notes03.png b/content/applications/finance/accounting/customer_invoices/credit_notes/credit_notes03.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/credit_notes/credit_notes03.png rename to content/applications/finance/accounting/customer_invoices/credit_notes/credit_notes03.png diff --git a/content/applications/finance/accounting/receivables/customer_invoices/credit_notes/credit_notes04.png b/content/applications/finance/accounting/customer_invoices/credit_notes/credit_notes04.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/credit_notes/credit_notes04.png rename to content/applications/finance/accounting/customer_invoices/credit_notes/credit_notes04.png diff --git a/content/applications/finance/accounting/customer_invoices/customer_addresses.rst b/content/applications/finance/accounting/customer_invoices/customer_addresses.rst new file mode 100644 index 0000000000..3443229d8f --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/customer_addresses.rst @@ -0,0 +1,39 @@ +============================== +Delivery and invoice addresses +============================== + +Companies often have multiple locations, and it is common that a customer invoice should be sent to +one address and the delivery should be sent to another. Odoo's **Customer Addresses** feature is +designed to handle this scenario by making it easy to specify which address to use for each case. + +.. seealso:: + :doc:`overview` + +Configuration +============= + +To specify a sales order's invoice and delivery addresses, first go to :menuselection:`Accounting +--> Configuration --> Settings`. In the :guilabel:`Customer Invoices` section, enable +:guilabel:`Customer Addresses` and click :guilabel:`Save`. + +On quotations and sales orders, there are now fields for :guilabel:`Invoice Address` and +:guilabel:`Delivery Address`. If the customer has an invoice or delivery address listed on their +contact record, the corresponding field will use that address by default, but any contact's address +can be used instead. + +Invoice and deliver to different addresses +========================================== + +Delivery orders and their delivery slip reports use the address set as the :guilabel:`Delivery +Address` on the sales order. By default, invoice reports show both the shipping address and the +invoice address to assure the customer that the delivery is going to the correct location. + +Emails also go to different addresses. The quotation and sales order are sent to the main contact's +email, as usual, but the invoice is sent to the email of the address set as the +:guilabel:`Invoice Address` on the sales order. + +.. note:: + - Reports, such as the delivery slip and invoice report, can be :doc:`customized using Studio + `. + - If :doc:`Send by Post ` is checked when you click :guilabel:`Send & Print`, the + invoice will be mailed to the invoice address. diff --git a/content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues.rst b/content/applications/finance/accounting/customer_invoices/deferred_revenues.rst similarity index 99% rename from content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues.rst rename to content/applications/finance/accounting/customer_invoices/deferred_revenues.rst index 0af63f5002..d491fdb68e 100644 --- a/content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues.rst +++ b/content/applications/finance/accounting/customer_invoices/deferred_revenues.rst @@ -191,5 +191,5 @@ You have three choices for the **Automate Deferred Revenue** field: automate its sale. (see: `Choose a different Income Account for specific products`_). .. seealso:: - * :doc:`../../getting_started/initial_configuration/chart_of_accounts` + * :doc:`../get_started/chart_of_accounts` * `Odoo Academy: Deferred Revenues (Recognition) `_ diff --git a/content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues01.png b/content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues01.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues01.png rename to content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues01.png diff --git a/content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues02.png b/content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues02.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues02.png rename to content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues02.png diff --git a/content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues03.png b/content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues03.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues03.png rename to content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues03.png diff --git a/content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues04.png b/content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues04.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues04.png rename to content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues04.png diff --git a/content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues05.png b/content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues05.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues05.png rename to content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues05.png diff --git a/content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues06.png b/content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues06.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues06.png rename to content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues06.png diff --git a/content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues07.png b/content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues07.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues07.png rename to content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues07.png diff --git a/content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues08.png b/content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues08.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues08.png rename to content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues08.png diff --git a/content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues09.png b/content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues09.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/deferred_revenues/deferred_revenues09.png rename to content/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenues09.png diff --git a/content/applications/finance/accounting/receivables/customer_invoices/electronic_invoicing.rst b/content/applications/finance/accounting/customer_invoices/electronic_invoicing.rst similarity index 92% rename from content/applications/finance/accounting/receivables/customer_invoices/electronic_invoicing.rst rename to content/applications/finance/accounting/customer_invoices/electronic_invoicing.rst index 568df08fb7..05dafa4ddf 100644 --- a/content/applications/finance/accounting/receivables/customer_invoices/electronic_invoicing.rst +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing.rst @@ -55,7 +55,7 @@ Odoo supports, among others, the following formats. - Every PDF generated by Odoo includes an integrated **Factur-X** XML file. .. seealso:: - :doc:`../../../fiscal_localizations` + :doc:`../../fiscal_localizations` .. _e-invoicing/configuration: @@ -102,9 +102,9 @@ recipient in the Peppol Network. National electronic invoicing ----------------------------- -Depending on your company's country (e.g., :doc:`Italy <../../../fiscal_localizations/italy>`, -:doc:`Spain <../../../fiscal_localizations/spain>`, :doc:`Mexico -<../../../fiscal_localizations/mexico>`, etc.), you may be required to issue e-invoicing documents in +Depending on your company's country (e.g., :doc:`Italy <../../fiscal_localizations/italy>`, +:doc:`Spain <../../fiscal_localizations/spain>`, :doc:`Mexico +<../../fiscal_localizations/mexico>`, etc.), you may be required to issue e-invoicing documents in a specific format for all your invoices. In this case, you can define a default e-invoicing format for your sales journal. diff --git a/content/applications/finance/accounting/receivables/customer_invoices/electronic_invoicing/customer-form.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/customer-form.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/electronic_invoicing/customer-form.png rename to content/applications/finance/accounting/customer_invoices/electronic_invoicing/customer-form.png diff --git a/content/applications/finance/accounting/receivables/customer_invoices/electronic_invoicing/send-window.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/send-window.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/electronic_invoicing/send-window.png rename to content/applications/finance/accounting/customer_invoices/electronic_invoicing/send-window.png diff --git a/content/applications/finance/accounting/customer_invoices/epc_qr_code.rst b/content/applications/finance/accounting/customer_invoices/epc_qr_code.rst new file mode 100644 index 0000000000..281d857490 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/epc_qr_code.rst @@ -0,0 +1,61 @@ +============ +EPC QR codes +============ + +European Payments Council quick response codes, or **EPC QR codes**, are two-dimensional barcodes +that customers can scan with their **mobile banking applications** to initiate a **SEPA credit +transfer (SCT)** and pay their invoices instantly. + +In addition to bringing ease of use and speed, it greatly reduces typing errors that would +potentially make for payment issues. + +.. note:: + This feature is only available for companies in several European countries such as Austria, + Belgium, Finland, Germany, and the Netherlands. + +.. seealso:: + - :doc:`../bank` + - `Odoo Academy: QR Code on Invoices for European Customers `_ + +Configuration +============= + +Go to :menuselection:`Accounting --> Configuration --> Settings` and activate the :guilabel:`QR +Codes` feature in the :guilabel:`Customer Payments` section. + +Configure your bank account's journal +------------------------------------- + +Make sure that your :guilabel:`Bank Account` is correctly configured in Odoo with your IBAN and BIC. + +To do so, go to :menuselection:`Accounting --> Configuration --> Journals`, open your bank journal, +then fill out the :guilabel:`Account Number` and :guilabel:`Bank` under the :guilabel:`Bank Account +Number` column. + +.. image:: epc_qr_code/bank-journal.png + :alt: Bank account number column in the bank journal + +Issue invoices with EPC QR codes +================================ + +EPC QR codes are added automatically to your invoices. Customers whose bank supports making payments +via EPC QR codes will be able to scan the code and pay the invoice. + +Go to :menuselection:`Accounting --> Customers --> Invoices`, and create a new invoice. + +Before posting it, open the :guilabel:`Other Info` tab. Odoo automatically fills out the +:guilabel:`Recipient Bank` field with your IBAN. + +.. note:: + In the :guilabel:`Other Info` tab, the account indicated in the :guilabel:`Recipient Bank` field + is used to receive your customer's payment. Odoo automatically populates this field with your + IBAN by default and uses it to generate the EPC QR code. + +When the invoice is printed or previewed, the QR code is included at the bottom. + +.. image:: epc_qr_code/invoice-qr-code.png + :alt: QR code on a customer invoice + +.. tip:: + If you want to issue an invoice without an EPC QR code, remove the IBAN indicated in the + :guilabel:`Recipient Bank` field, under the :guilabel:`Other Info` tab of the invoice. diff --git a/content/applications/finance/accounting/customer_invoices/epc_qr_code/bank-journal.png b/content/applications/finance/accounting/customer_invoices/epc_qr_code/bank-journal.png new file mode 100644 index 0000000000..d86dd6e547 Binary files /dev/null and b/content/applications/finance/accounting/customer_invoices/epc_qr_code/bank-journal.png differ diff --git a/content/applications/finance/accounting/customer_invoices/epc_qr_code/invoice-qr-code.png b/content/applications/finance/accounting/customer_invoices/epc_qr_code/invoice-qr-code.png new file mode 100644 index 0000000000..f2a402441b Binary files /dev/null and b/content/applications/finance/accounting/customer_invoices/epc_qr_code/invoice-qr-code.png differ diff --git a/content/applications/finance/accounting/customer_invoices/incoterms.rst b/content/applications/finance/accounting/customer_invoices/incoterms.rst new file mode 100644 index 0000000000..fd94f3c359 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/incoterms.rst @@ -0,0 +1,46 @@ +========= +Incoterms +========= + +:abbr:`Incoterms (International Commercial Terms)` are standardized trade terms used in +international transactions to define the rights and responsibilities of buyers and sellers. They +establish the obligations related to the delivery of goods, the transfer of risks, and the +distribution of costs between the parties involved. Incoterms specify important details, such as the +point at which the risk and costs transfer from the seller to the buyer, the responsibility for +transportation, insurance, customs clearance, and other relevant aspects of the transaction. + +.. note:: + By default, all 11 Incoterms are available in Odoo: + + - **EXW**: Ex works + - **FCA**: Free carrier + - **FAS**: Free alongside ship + - **FOB**: Free on board + - **CFR**: Cost and freight + - **CIF**: Cost, insurance and freight + - **CPT**: Carriage paid to + - **CIP**: Carriage and insurance paid to + - **DPU**: Delivered at place unloaded + - **DAP**: Delivered at place + - **DDP**: Delivered duty paid + +.. seealso:: + :doc:`../reporting/intrastat` + +.. _incoterms/invoices: + +Define an Incoterm +================== + +To define an Incoterm manually, create an invoice or bill, click the :guilabel:`Other Info` tab, and +select the :guilabel:`Incoterm`. + +.. _incoterms/default: + +Default Incoterm configuration +============================== + +You can set a default Incoterm rule to **automatically** populate the Incoterm field on all newly +created invoices and bills. Under :menuselection:`Accounting/Invoicing --> Configuration --> +Settings`, scroll down to the :guilabel:`Customer Invoices` section, and select an Incoterm in the +:guilabel:`Default Incoterm` field. diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice01.png b/content/applications/finance/accounting/customer_invoices/invoice01.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice01.png rename to content/applications/finance/accounting/customer_invoices/invoice01.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice02.png b/content/applications/finance/accounting/customer_invoices/invoice02.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice02.png rename to content/applications/finance/accounting/customer_invoices/invoice02.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice03.png b/content/applications/finance/accounting/customer_invoices/invoice03.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice03.png rename to content/applications/finance/accounting/customer_invoices/invoice03.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice04.png b/content/applications/finance/accounting/customer_invoices/invoice04.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice04.png rename to content/applications/finance/accounting/customer_invoices/invoice04.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice05.png b/content/applications/finance/accounting/customer_invoices/invoice05.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice05.png rename to content/applications/finance/accounting/customer_invoices/invoice05.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice06.png b/content/applications/finance/accounting/customer_invoices/invoice06.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice06.png rename to content/applications/finance/accounting/customer_invoices/invoice06.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice07.png b/content/applications/finance/accounting/customer_invoices/invoice07.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice07.png rename to content/applications/finance/accounting/customer_invoices/invoice07.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice08.png b/content/applications/finance/accounting/customer_invoices/invoice08.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice08.png rename to content/applications/finance/accounting/customer_invoices/invoice08.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice09.png b/content/applications/finance/accounting/customer_invoices/invoice09.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice09.png rename to content/applications/finance/accounting/customer_invoices/invoice09.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice10.png b/content/applications/finance/accounting/customer_invoices/invoice10.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice10.png rename to content/applications/finance/accounting/customer_invoices/invoice10.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice11.png b/content/applications/finance/accounting/customer_invoices/invoice11.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice11.png rename to content/applications/finance/accounting/customer_invoices/invoice11.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice12.png b/content/applications/finance/accounting/customer_invoices/invoice12.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice12.png rename to content/applications/finance/accounting/customer_invoices/invoice12.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice13.png b/content/applications/finance/accounting/customer_invoices/invoice13.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice13.png rename to content/applications/finance/accounting/customer_invoices/invoice13.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice14.png b/content/applications/finance/accounting/customer_invoices/invoice14.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice14.png rename to content/applications/finance/accounting/customer_invoices/invoice14.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice15.png b/content/applications/finance/accounting/customer_invoices/invoice15.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice15.png rename to content/applications/finance/accounting/customer_invoices/invoice15.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice16.png b/content/applications/finance/accounting/customer_invoices/invoice16.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/customer_invoice/invoice16.png rename to content/applications/finance/accounting/customer_invoices/invoice16.png diff --git a/content/applications/finance/accounting/receivables/customer_invoices/overview.rst b/content/applications/finance/accounting/customer_invoices/overview.rst similarity index 98% rename from content/applications/finance/accounting/receivables/customer_invoices/overview.rst rename to content/applications/finance/accounting/customer_invoices/overview.rst index e55a5ece63..d335bd9902 100644 --- a/content/applications/finance/accounting/receivables/customer_invoices/overview.rst +++ b/content/applications/finance/accounting/customer_invoices/overview.rst @@ -159,4 +159,4 @@ Vendor bills and customer invoices forms are automatically created and populated invoices. .. seealso:: - - :doc:`/applications/finance/accounting/payables/supplier_bills/invoice_digitization` + - :doc:`/applications/finance/accounting/vendor_bills/invoice_digitization` diff --git a/content/applications/finance/accounting/customer_invoices/payment_terms.rst b/content/applications/finance/accounting/customer_invoices/payment_terms.rst new file mode 100644 index 0000000000..1f999802a0 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/payment_terms.rst @@ -0,0 +1,140 @@ +=================================== +Payment terms and installment plans +=================================== + +**Payment terms** specify all the conditions of a sale's payment to help ensure customers pay their +invoices correctly and on time. + +Payment terms are generally defined on documents such as sales orders, customer invoices, and +vendor bills. Payment terms cover: + +- The due date(s) +- Early payment discounts +- Any other conditions on the payment + +An **installment plan** allows the customers to pay an invoice in parts, with the amounts and +payment dates defined beforehand by the seller. + +.. example:: + Immediate Payment + The full payment is due on the day of the invoice's issuance. + 15 Days (or Net 15) + The full payment is due 15 days after the invoice date. + 21 MFI + The full payment is due by the 21st of the month following the invoice date. + 30% Advance End of Following Month + 30% is due on the day of the invoice's issuance. The remaining balance is due at the end of the + following month. + 2% 10, Net 30 EOM + A 2% :doc:`cash discount ` if the payment is received within ten days. + Otherwise, the full payment is due at the end of the month following the invoice date. + +.. note:: + - Payment terms are not to be confused with :doc:`down payment invoices + `. If, for a specific order, you issue + multiple invoices to your customer, that is neither a payment term nor an installment plan but + an invoicing policy. + - This page is about the *payment terms* feature, not :doc:`terms & conditions + `, which can be used to declare contractual obligations regarding content + use, return policies, and other policies surrounding the sale of goods and services. + +.. seealso:: + - `Odoo Tutorials: payment terms `_ + - :doc:`cash_discounts` + +Configuration +============= + +To create new payment terms, follow these steps: + +#. Go to :menuselection:`Accounting --> Configuration --> Payment Terms` and click on + :guilabel:`New`. +#. Enter a name in the :guilabel:`Payment Terms` field. This field is the name displayed both + internally and on sales orders. +#. Tick the :guilabel:`Early Discount` checkbox and fill out the discount percentage, discount days, + and :ref:`tax reduction ` fields to add a :doc:`cash discount + `, if desired. +#. In the :guilabel:`Due Terms` section, add a set of rules (terms) to define what needs to be paid + and by which due date(s). Defining terms automatically calculates the payments' due date(s). This + is particularly helpful for managing **installment plans** (:dfn:`payment terms with multiple + terms`). + + To add a term, click on :guilabel:`Add a line`, define the discount's value and type in the + :guilabel:`Due` fields, then fill out the :guilabel:`After` fields to determine the due date. +#. Enter the text to be displayed on the document (sales order, invoice, etc.) in the gray textbox + in the :guilabel:`Preview` column. +#. Tick the :guilabel:`Show installment dates` checkbox to display a breakdown of each payment and + its due date on the invoice report, if desired. + +.. tip:: + To instead specify a number of days *before the end of the month*, use a negative value in the + :guilabel:`After` field. + +To test that your payment terms are configured correctly, enter an invoice date on the +:guilabel:`Example` line to generate the payments that would be due and their due dates +using these payment terms. + +.. important:: + Terms are computed in the order of their due dates. + +.. example:: + In the following example, 30% is due on the day of issuance, and the remaining 70% is due at the + end of the following month. + + .. image:: payment_terms/configuration.png + :alt: Example of Payment Terms. The first line is the 30% due immediately. The second line is + the remaining 70% due at the end of the following month. + +Using payment terms +=================== + +Payment terms can be defined using the :guilabel:`Payment Terms` field on: + +- **Contacts:** To automatically set default payment terms on a contact's new sales orders, + invoices, and bills. This can be modified in the contact form, under the :guilabel:`Sales & + Purchase` tab. +- **Quotations/Sales Orders:** To set specific payment terms automatically on all invoices generated + from a quotation or sales order. + +Payment terms can be defined using the :guilabel:`Due Date` field, with the :guilabel:`Terms` +drop-down list on: + +- **Customer invoices:** To set specific payment terms on an invoice. +- **Vendor bills:** To set specific payment terms on a bill. + +.. tip:: + Setting payment terms on a vendor bill is mostly useful for managing vendor terms with multiple + installments or cash discounts. Otherwise, manually setting the **due date** is enough. If + payment terms are already defined, empty the field to select a date. + +Journal entries +=============== + +Invoices with specific payment terms generate different *journal entries*, with one *journal item* +for every computed *due date*. + +This makes for easier :doc:`follow-ups ` and +:doc:`reconciliation ` since Odoo takes each +due date into account, rather than just the balance due date. It also helps to get an accurate +:ref:`aged receivable report `. + +.. example:: + .. image:: payment_terms/journal-entry.png + :alt: The amount debited to the account receivable is split into two journal items with + distinct due dates + + In this example, an invoice of $1000 has been issued with the following payment terms: *30% is + due on the day of issuance, and the remaining 70% is due at the end of the following month.* + + +----------------------+-------------+---------+---------+ + | Account | Due date | Debit | Credit | + +======================+=============+=========+=========+ + | Account Receivable | February 21 | 300 | | + +----------------------+-------------+---------+---------+ + | Account Receivable | March 31 | 700 | | + +----------------------+-------------+---------+---------+ + | Product Sales | | | 1000 | + +----------------------+-------------+---------+---------+ + + The $1000 debited to the account receivable is split into two distinct journal items. Both of + them have their own due date. diff --git a/content/applications/finance/accounting/customer_invoices/payment_terms/configuration.png b/content/applications/finance/accounting/customer_invoices/payment_terms/configuration.png new file mode 100644 index 0000000000..2381104a56 Binary files /dev/null and b/content/applications/finance/accounting/customer_invoices/payment_terms/configuration.png differ diff --git a/content/applications/finance/accounting/customer_invoices/payment_terms/journal-entry.png b/content/applications/finance/accounting/customer_invoices/payment_terms/journal-entry.png new file mode 100644 index 0000000000..cb510814a9 Binary files /dev/null and b/content/applications/finance/accounting/customer_invoices/payment_terms/journal-entry.png differ diff --git a/content/applications/finance/accounting/receivables/customer_invoices/snailmail.rst b/content/applications/finance/accounting/customer_invoices/snailmail.rst similarity index 96% rename from content/applications/finance/accounting/receivables/customer_invoices/snailmail.rst rename to content/applications/finance/accounting/customer_invoices/snailmail.rst index 2463c992a8..dfb0c32e51 100644 --- a/content/applications/finance/accounting/receivables/customer_invoices/snailmail.rst +++ b/content/applications/finance/accounting/customer_invoices/snailmail.rst @@ -44,7 +44,7 @@ your customer’s address is set correctly, including the country, before sendin Pricing ======= -Snailmail is an :doc:`../../../../general/in_app_purchase` service that requires prepaid stamps +Snailmail is an :doc:`/applications/general/in_app_purchase` service that requires prepaid stamps (=credits) to work. Sending one document consumes one stamp. To buy stamps, go to :menuselection:`Accounting --> Configuration --> Settings --> Customer diff --git a/content/applications/finance/accounting/receivables/customer_invoices/snailmail/setup-snailmail.png b/content/applications/finance/accounting/customer_invoices/snailmail/setup-snailmail.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/snailmail/setup-snailmail.png rename to content/applications/finance/accounting/customer_invoices/snailmail/setup-snailmail.png diff --git a/content/applications/finance/accounting/receivables/customer_invoices/snailmail/snailmail-template.pdf b/content/applications/finance/accounting/customer_invoices/snailmail/snailmail-template.pdf similarity index 100% rename from content/applications/finance/accounting/receivables/customer_invoices/snailmail/snailmail-template.pdf rename to content/applications/finance/accounting/customer_invoices/snailmail/snailmail-template.pdf diff --git a/content/applications/finance/accounting/customer_invoices/terms_conditions.rst b/content/applications/finance/accounting/customer_invoices/terms_conditions.rst new file mode 100644 index 0000000000..e3fa4d362b --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/terms_conditions.rst @@ -0,0 +1,39 @@ +================================== +Default terms and conditions (T&C) +================================== + +Specifying terms and conditions is essential to establish important contractual points, such as +return and refunds, warranty, and after-sale services. + +You can add default terms and conditions at the bottom of all customer invoices, sales orders, and +quotations, either as text or a link to a web page. + +.. seealso:: + `Odoo Tutorial: Terms & Conditions `_ + +Configuration +============= + +Go to :menuselection:`Accounting --> Configuration --> Settings`. Under the :guilabel:`Customer +Invoices`, enable :guilabel:`Default Terms & Conditions`. By default, the :guilabel:`Add a Note` +option is selected, and the terms and conditions are displayed at the bottom of the document. Enter +the terms and conditions in the text box below. + +.. image:: terms_conditions/terms-note.png + :alt: Example of terms and conditions as a note + +.. tip:: + You can also add a PDF version of your terms and conditions as an attachment when sending the + document via email. Edit the email templates if you want to include them by default. + +Alternatively, to display the terms and conditions on a web page, select the :guilabel:`Add a link +to a Web Page` option and click :guilabel:`Save`. Click :guilabel:`Update Terms`, edit the +content, and click :guilabel:`Save`. The link to that page is then added as a note in your document. + +.. note:: + You can edit the layout and content of the page using the :doc:`Website + ` app. If the Website app is activated, the :guilabel:`Edit in + Website Builder` option then replaces :guilabel:`Update Terms`. + +.. image:: terms_conditions/terms-webpage.png + :alt: Example of terms and conditions as a web page diff --git a/content/applications/finance/accounting/customer_invoices/terms_conditions/terms-note.png b/content/applications/finance/accounting/customer_invoices/terms_conditions/terms-note.png new file mode 100644 index 0000000000..061aa86480 Binary files /dev/null and b/content/applications/finance/accounting/customer_invoices/terms_conditions/terms-note.png differ diff --git a/content/applications/finance/accounting/customer_invoices/terms_conditions/terms-webpage.png b/content/applications/finance/accounting/customer_invoices/terms_conditions/terms-webpage.png new file mode 100644 index 0000000000..8ee82a3d7d Binary files /dev/null and b/content/applications/finance/accounting/customer_invoices/terms_conditions/terms-webpage.png differ diff --git a/content/applications/finance/accounting/getting_started/initial_configuration/setup.rst b/content/applications/finance/accounting/get_started.rst similarity index 87% rename from content/applications/finance/accounting/getting_started/initial_configuration/setup.rst rename to content/applications/finance/accounting/get_started.rst index b06742f11d..40e7a53f6c 100644 --- a/content/applications/finance/accounting/getting_started/initial_configuration/setup.rst +++ b/content/applications/finance/accounting/get_started.rst @@ -1,6 +1,8 @@ -=================================================== -Initial setup of Odoo Accounting and Odoo Invoicing -=================================================== +:show-content: + +=========== +Get started +=========== When you first open your Odoo Accounting app, the *Accounting Overview* page welcomes you with a step-by-step onboarding banner, a wizard that helps you get started. This onboarding banner is @@ -20,8 +22,7 @@ Accounting onboarding banner The step-by-step Accounting onboarding banner is composed of four steps: -.. image:: setup/setup_accounting_onboarding.png - :align: center +.. image:: get_started/setup_accounting_onboarding.png :alt: Step-by-step onboarding banner in Odoo Accounting #. :ref:`accounting-setup-company` @@ -38,8 +39,7 @@ This menu allows you to add your company’s details such as the name, address, number, email address, and Tax ID, or VAT number. These details are then displayed on your documents, such as on invoices. -.. image:: setup/setup_company.png - :align: center +.. image:: get_started/setup_company.png :alt: Add your company's details in Odoo Accounting and Odoo Invoicing .. note:: @@ -55,7 +55,7 @@ Connect your bank account to your database and have your bank statements synced so, find your bank in the list, click on *Connect*, and follow the instructions on-screen. .. note:: - :doc:`Click here <../../bank/bank_synchronization>` for more information about this feature. + :doc:`Click here ` for more information about this feature. If your Bank Institution can’t be synchronized automatically, or if you prefer not to sync it with your database, you may also configure your bank account manually by clicking on *Create it*, and @@ -74,7 +74,7 @@ filling out the form. .. note:: - You can add as many bank accounts as needed with this tool by going to :menuselection:`Accounting --> Configuration`, and clicking on *Add a Bank Account*. - - :doc:`Click here <../../bank/setup/bank_accounts>` for more information about Bank + - :doc:`Click here ` for more information about Bank Accounts. .. _accounting-setup-periods: @@ -104,12 +104,11 @@ opening balances. Basic settings are displayed on this page to help you review your Chart of Accounts. To access all the settings of an account, click on the *double arrow button* at the end of the line. -.. image:: setup/setup_chart_of_accounts.png - :align: center +.. image:: get_started/setup_chart_of_accounts.png :alt: Setup of the Chart of Accounts and their opening balances in Odoo Accounting .. note:: - :doc:`Click here ` for more information on how to configure your Chart of + :doc:`Click here ` for more information on how to configure your Chart of Accounts. Invoicing onboarding banner @@ -124,8 +123,7 @@ If you have Odoo Accounting installed on your database, you can reach it by goin The Invoicing onboarding banner is composed of four main steps: -.. image:: setup/setup_invoicing_onboarding.png - :align: center +.. image:: get_started/setup_invoicing_onboarding.png :alt: Step-by-step onboarding banner in Odoo Invoicing #. :ref:`invoicing-setup-company` @@ -154,8 +152,7 @@ automatically adds the company's phone number, email, website URL, and Tax ID (o footer, according to the values you previously configured in the :ref:`Company Data `. -.. image:: setup/setup_document_layout.png - :align: center +.. image:: get_started/setup_document_layout.png :alt: Document layout configuration in Odoo Invoicing .. tip:: @@ -186,8 +183,17 @@ Sample Invoice Send yourself a sample invoice by email to make sure everything is correctly configured. .. seealso:: - * :doc:`../../bank/setup/bank_accounts` - * :doc:`chart_of_accounts` - * :doc:`../../bank/bank_synchronization` - * :doc:`../../../fiscal_localizations` + * :doc:`bank` + * :doc:`get_started/chart_of_accounts` + * :doc:`bank/bank_synchronization` + * :doc:`../fiscal_localizations` * `Odoo Tutorials: Accounting Basics `_ + +.. toctree:: + :titlesonly: + + get_started/cheat_sheet + get_started/chart_of_accounts + get_started/multi_currency + get_started/avg_price_valuation + get_started/vat_units diff --git a/content/applications/finance/accounting/others/inventory/avg_price_valuation.rst b/content/applications/finance/accounting/get_started/avg_price_valuation.rst similarity index 97% rename from content/applications/finance/accounting/others/inventory/avg_price_valuation.rst rename to content/applications/finance/accounting/get_started/avg_price_valuation.rst index f98dcc03ca..26359d9f01 100644 --- a/content/applications/finance/accounting/others/inventory/avg_price_valuation.rst +++ b/content/applications/finance/accounting/get_started/avg_price_valuation.rst @@ -1,9 +1,9 @@ -========================================================== -Impact on the average price valuation when returning goods -========================================================== +================================= +Inventory average price valuation +================================= -As stated in the `*inventory valuation -page* `__, +As stated in the :doc:`inventory valuation page +`, one of the possible costing method you can use in perpetual stock valuation, is the average cost. diff --git a/content/applications/finance/accounting/others/inventory/avg_price_valuation/avg01.png b/content/applications/finance/accounting/get_started/avg_price_valuation/avg01.png similarity index 100% rename from content/applications/finance/accounting/others/inventory/avg_price_valuation/avg01.png rename to content/applications/finance/accounting/get_started/avg_price_valuation/avg01.png diff --git a/content/applications/finance/accounting/getting_started/initial_configuration/chart_of_accounts.rst b/content/applications/finance/accounting/get_started/chart_of_accounts.rst similarity index 94% rename from content/applications/finance/accounting/getting_started/initial_configuration/chart_of_accounts.rst rename to content/applications/finance/accounting/get_started/chart_of_accounts.rst index 2595a8b96d..df7e064f58 100644 --- a/content/applications/finance/accounting/getting_started/initial_configuration/chart_of_accounts.rst +++ b/content/applications/finance/accounting/get_started/chart_of_accounts.rst @@ -182,8 +182,11 @@ them unusable by using the **Deprecated** feature. To do so, check the :guilabel:`Deprecated` box in the account's settings, and save. .. seealso:: - * :doc:`../cheat_sheet` - * :doc:`../../payables/supplier_bills/assets` - * :doc:`../../payables/supplier_bills/deferred_expenses` - * :doc:`../../receivables/customer_invoices/deferred_revenues` - * :doc:`../../../fiscal_localizations` + * :doc:`cheat_sheet` + * :doc:`../vendor_bills/assets` + * :doc:`../vendor_bills/deferred_expenses` + * :doc:`../customer_invoices/deferred_revenues` + * :doc:`../../fiscal_localizations` + * `Odoo Tutorials: Chart of accounts `_ + * `Odoo Tutorials: Update your chart of accounts + `_ diff --git a/content/applications/finance/accounting/getting_started/initial_configuration/chart_of_accounts/account-groups.png b/content/applications/finance/accounting/get_started/chart_of_accounts/account-groups.png similarity index 100% rename from content/applications/finance/accounting/getting_started/initial_configuration/chart_of_accounts/account-groups.png rename to content/applications/finance/accounting/get_started/chart_of_accounts/account-groups.png diff --git a/content/applications/finance/accounting/getting_started/initial_configuration/chart_of_accounts/chart-of-accounts.png b/content/applications/finance/accounting/get_started/chart_of_accounts/chart-of-accounts.png similarity index 100% rename from content/applications/finance/accounting/getting_started/initial_configuration/chart_of_accounts/chart-of-accounts.png rename to content/applications/finance/accounting/get_started/chart_of_accounts/chart-of-accounts.png diff --git a/content/applications/finance/accounting/getting_started/initial_configuration/chart_of_accounts/trial-balance.png b/content/applications/finance/accounting/get_started/chart_of_accounts/trial-balance.png similarity index 100% rename from content/applications/finance/accounting/getting_started/initial_configuration/chart_of_accounts/trial-balance.png rename to content/applications/finance/accounting/get_started/chart_of_accounts/trial-balance.png diff --git a/content/applications/finance/accounting/getting_started/cheat_sheet.rst b/content/applications/finance/accounting/get_started/cheat_sheet.rst similarity index 99% rename from content/applications/finance/accounting/getting_started/cheat_sheet.rst rename to content/applications/finance/accounting/get_started/cheat_sheet.rst index 6f9916e677..19a9e0a5f8 100644 --- a/content/applications/finance/accounting/getting_started/cheat_sheet.rst +++ b/content/applications/finance/accounting/get_started/cheat_sheet.rst @@ -147,7 +147,7 @@ credits. Reconciliation ============== -:doc:`Reconciliation <../../accounting/bank/reconciliation/use_cases>` is the process of linking +:doc:`Reconciliation <../../accounting/bank/reconciliation>` is the process of linking journal items of a specific account and matching credits and debits. Its primary purpose is to link payments to their related invoices to mark them as paid. This is done diff --git a/content/applications/finance/accounting/others/multi_currency.rst b/content/applications/finance/accounting/get_started/multi_currency.rst similarity index 91% rename from content/applications/finance/accounting/others/multi_currency.rst rename to content/applications/finance/accounting/get_started/multi_currency.rst index 20ce775fb8..6cc7dd1caa 100644 --- a/content/applications/finance/accounting/others/multi_currency.rst +++ b/content/applications/finance/accounting/get_started/multi_currency.rst @@ -7,7 +7,7 @@ the main currency configured for your company. You can also set up bank accounts and run reports on your foreign currency activities. .. seealso:: - - :doc:`../bank/setup/foreign_currency` + - :doc:`../bank/foreign_currency` .. _multi-currency/config: @@ -101,8 +101,7 @@ Journals If a currency is set on a **journal**, that journal only handles transactions in that currency. To do so, go to :menuselection:`Accounting --> Configuration --> Journals`, open the journal you -want to edit, and select a currency in the field :guilabel:`Currency`. If left empty, all active -currencies are handled instead of just one. +want to edit, and select a currency in the field :guilabel:`Currency`. .. image:: multi_currency/journal-currency.png :align: center @@ -118,7 +117,8 @@ Multi-currency accounting Invoices, bills, and other documents ------------------------------------ -For all documents, you can select the currency and journal to use for the transaction. +For all documents, you can select the currency and journal to use for the transaction on the +document itself. .. image:: multi_currency/currency-field.png :align: center @@ -139,13 +139,13 @@ To register a payment in a currency other than your company's main currency, cli .. _multi-currency/mca-statements: -Bank statements ---------------- +Bank transactions +----------------- -When creating or importing bank statements, the amount is in the company's main currency. To see -additional fields related to foreign currencies, click on the **columns dropdown button** -(:guilabel:`⋮`) next to :guilabel:`Amount`, and check :guilabel:`Amount Currency` and -:guilabel:`Foreign Currency`. +When creating or importing bank transactions, the amount is in the company's main currency. To input +a **foreign currency**, select a currency in the :guilabel:`Foreign Currency`. Once selected, enter +the :guilabel:`Amount` in your main currency for it to automatically get converted in the foreign +currency in the :guilabel:`Amount in Currency field`. .. image:: multi_currency/foreign-fields.png :align: center diff --git a/content/applications/finance/accounting/others/multi_currency/account-currency.png b/content/applications/finance/accounting/get_started/multi_currency/account-currency.png similarity index 100% rename from content/applications/finance/accounting/others/multi_currency/account-currency.png rename to content/applications/finance/accounting/get_started/multi_currency/account-currency.png diff --git a/content/applications/finance/accounting/others/multi_currency/currency-field.png b/content/applications/finance/accounting/get_started/multi_currency/currency-field.png similarity index 100% rename from content/applications/finance/accounting/others/multi_currency/currency-field.png rename to content/applications/finance/accounting/get_started/multi_currency/currency-field.png diff --git a/content/applications/finance/accounting/others/multi_currency/enable-foreign-currencies.png b/content/applications/finance/accounting/get_started/multi_currency/enable-foreign-currencies.png similarity index 100% rename from content/applications/finance/accounting/others/multi_currency/enable-foreign-currencies.png rename to content/applications/finance/accounting/get_started/multi_currency/enable-foreign-currencies.png diff --git a/content/applications/finance/accounting/others/multi_currency/exchange-difference-journal.png b/content/applications/finance/accounting/get_started/multi_currency/exchange-difference-journal.png similarity index 100% rename from content/applications/finance/accounting/others/multi_currency/exchange-difference-journal.png rename to content/applications/finance/accounting/get_started/multi_currency/exchange-difference-journal.png diff --git a/content/applications/finance/accounting/others/multi_currency/exchange-journal-currency.png b/content/applications/finance/accounting/get_started/multi_currency/exchange-journal-currency.png similarity index 100% rename from content/applications/finance/accounting/others/multi_currency/exchange-journal-currency.png rename to content/applications/finance/accounting/get_started/multi_currency/exchange-journal-currency.png diff --git a/content/applications/finance/accounting/get_started/multi_currency/foreign-fields.png b/content/applications/finance/accounting/get_started/multi_currency/foreign-fields.png new file mode 100644 index 0000000000..c640d69c99 Binary files /dev/null and b/content/applications/finance/accounting/get_started/multi_currency/foreign-fields.png differ diff --git a/content/applications/finance/accounting/others/multi_currency/journal-currency.png b/content/applications/finance/accounting/get_started/multi_currency/journal-currency.png similarity index 100% rename from content/applications/finance/accounting/others/multi_currency/journal-currency.png rename to content/applications/finance/accounting/get_started/multi_currency/journal-currency.png diff --git a/content/applications/finance/accounting/others/multi_currency/manual-rate-update.png b/content/applications/finance/accounting/get_started/multi_currency/manual-rate-update.png similarity index 100% rename from content/applications/finance/accounting/others/multi_currency/manual-rate-update.png rename to content/applications/finance/accounting/get_started/multi_currency/manual-rate-update.png diff --git a/content/applications/finance/accounting/others/multi_currency/register-payment.png b/content/applications/finance/accounting/get_started/multi_currency/register-payment.png similarity index 100% rename from content/applications/finance/accounting/others/multi_currency/register-payment.png rename to content/applications/finance/accounting/get_started/multi_currency/register-payment.png diff --git a/content/applications/finance/accounting/getting_started/initial_configuration/setup/setup_accounting_onboarding.png b/content/applications/finance/accounting/get_started/setup_accounting_onboarding.png similarity index 100% rename from content/applications/finance/accounting/getting_started/initial_configuration/setup/setup_accounting_onboarding.png rename to content/applications/finance/accounting/get_started/setup_accounting_onboarding.png diff --git a/content/applications/finance/accounting/getting_started/initial_configuration/setup/setup_chart_of_accounts.png b/content/applications/finance/accounting/get_started/setup_chart_of_accounts.png similarity index 100% rename from content/applications/finance/accounting/getting_started/initial_configuration/setup/setup_chart_of_accounts.png rename to content/applications/finance/accounting/get_started/setup_chart_of_accounts.png diff --git a/content/applications/finance/accounting/getting_started/initial_configuration/setup/setup_company.png b/content/applications/finance/accounting/get_started/setup_company.png similarity index 100% rename from content/applications/finance/accounting/getting_started/initial_configuration/setup/setup_company.png rename to content/applications/finance/accounting/get_started/setup_company.png diff --git a/content/applications/finance/accounting/getting_started/initial_configuration/setup/setup_document_layout.png b/content/applications/finance/accounting/get_started/setup_document_layout.png similarity index 100% rename from content/applications/finance/accounting/getting_started/initial_configuration/setup/setup_document_layout.png rename to content/applications/finance/accounting/get_started/setup_document_layout.png diff --git a/content/applications/finance/accounting/getting_started/initial_configuration/setup/setup_invoicing_onboarding.png b/content/applications/finance/accounting/get_started/setup_invoicing_onboarding.png similarity index 100% rename from content/applications/finance/accounting/getting_started/initial_configuration/setup/setup_invoicing_onboarding.png rename to content/applications/finance/accounting/get_started/setup_invoicing_onboarding.png diff --git a/content/applications/finance/accounting/get_started/vat_units.rst b/content/applications/finance/accounting/get_started/vat_units.rst new file mode 100644 index 0000000000..2daeca56de --- /dev/null +++ b/content/applications/finance/accounting/get_started/vat_units.rst @@ -0,0 +1,86 @@ +========= +VAT units +========= + +.. important:: + This is only applicable to multi-company environments. + +A **VAT unit** is a group of VAT-taxable enterprises that are legally independent of each other but +are closely linked financially, organizationally, and economically and therefore considered the same +VAT-taxable enterprise. **VAT units** are not mandatory, but if created, constituent companies of +the unit must belong to the same **country**, use the same **currency**, and one company must be +designated as the **representative** company of the **VAT unit**. **VAT units** receive a specific +**tax ID** intended only for **tax returns**. **Constituent** companies keep their **tax ID** used +for **commercial purposes**. + +.. example:: + Enterprise **A** owes €300.000,00 of VAT taxes and enterprise **B** can recover €280.000,00 of + VAT taxes. They form up as a **VAT unit** so that the two amounts balance out and must conjointly + only pay €20.000,00 of VAT taxes. + +Configuration +============= + +To configure a **VAT unit**, go to :menuselection:`Settings --> General Settings`, scroll down to +the :guilabel:`Companies` section, and click :guilabel:`Manage Companies`. Select the company to +serve the **representative** role, and in the :guilabel:`General Information` tab, fill in the +mandatory fields for the .XML export when exporting the **tax report**: :guilabel:`Company Name`, +:guilabel:`Address`, :guilabel:`VAT`, :guilabel:`Currency`, :guilabel:`Phone`, and +:guilabel:`Email`. + +.. image:: vat_units/general.png + :align: center + :alt: General information tab + +Then, click on the :guilabel:`VAT Units` tab, :guilabel:`Add a line`, and either select an existing +**VAT unit**, or create a new one. Enter a **name** for the unit, :guilabel:`Country` of the +constituent companies and tax report, the :guilabel:`Companies`, the :guilabel:`Main Company` that +serves the **representative** role, and the :guilabel:`Tax ID` of the **VAT unit**. + +.. image:: vat_units/vat-unit.png + :align: center + :alt: VAT units tab + +Fiscal position +--------------- + +As transactions between constituents of the same **VAT unit** are not subject to VAT, it is possible +to create a :doc:`tax mapping (fiscal position) <../taxes/fiscal_positions>` to avoid the +application of VAT on inter-constituent transactions. + +Be sure a constituent company has been selected before, then go to :menuselection:`Accounting --> +Configuration --> Fiscal Positions`, and :guilabel:`Create` a new **fiscal position**. Click the +:guilabel:`Tax Mapping` tab, select the :guilabel:`Tax on Product` usually applied for +**non-constituent** transactions, and in :guilabel:`Tax to Apply`, select the 0% tax to apply for +**constituent** transactions. + +Do the same for the :guilabel:`Account Mapping` tab if required, and repeat this process for +**each** constituent company on your database. + +.. Example:: + Depending on your :doc:`localization package `, taxes + may vary from the screenshot displayed. + + .. image:: vat_units/fiscal-positions.png + :align: center + :alt: Tax mapping of fiscal position for VAT unit + +Then, assign the fiscal position by opening the **Contacts** app. Search for a **constituent** +company, and open the contact's **card**. Click the :guilabel:`Sales & Purchase` tab, and in the +:guilabel:`Fiscal Position` field, input the **fiscal position** created for the **VAT unit**. +Repeat the process for each **constituent** company card form, on each company database. + +.. seealso:: + :doc:`../taxes/fiscal_positions`. + +Tax report +========== + +The **representative** company can access the aggregated tax report of the **VAT unit** by going to +:menuselection:`Accounting --> Reporting --> Tax Report`, and selecting the **VAT unit** in +:guilabel:`Tax Unit`. This report contains the aggregated transactions of all **constituents** and +the .XML export contains the name and VAT number of the **main** company. + +.. image:: vat_units/report.png + :align: center + :alt: VAT unit tax report diff --git a/content/applications/finance/accounting/get_started/vat_units/fiscal-positions.png b/content/applications/finance/accounting/get_started/vat_units/fiscal-positions.png new file mode 100644 index 0000000000..bb9ee8e9b4 Binary files /dev/null and b/content/applications/finance/accounting/get_started/vat_units/fiscal-positions.png differ diff --git a/content/applications/finance/accounting/get_started/vat_units/general.png b/content/applications/finance/accounting/get_started/vat_units/general.png new file mode 100644 index 0000000000..36bb881928 Binary files /dev/null and b/content/applications/finance/accounting/get_started/vat_units/general.png differ diff --git a/content/applications/finance/accounting/get_started/vat_units/report.png b/content/applications/finance/accounting/get_started/vat_units/report.png new file mode 100644 index 0000000000..1c86763fa1 Binary files /dev/null and b/content/applications/finance/accounting/get_started/vat_units/report.png differ diff --git a/content/applications/finance/accounting/get_started/vat_units/vat-unit.png b/content/applications/finance/accounting/get_started/vat_units/vat-unit.png new file mode 100644 index 0000000000..2db22514d1 Binary files /dev/null and b/content/applications/finance/accounting/get_started/vat_units/vat-unit.png differ diff --git a/content/applications/finance/accounting/getting_started.rst b/content/applications/finance/accounting/getting_started.rst deleted file mode 100644 index 79d3eb189b..0000000000 --- a/content/applications/finance/accounting/getting_started.rst +++ /dev/null @@ -1,13 +0,0 @@ -:nosearch: - -=============== -Getting started -=============== - -.. toctree:: - :titlesonly: - - getting_started/main_concept - getting_started/cheat_sheet - getting_started/initial_configuration - getting_started/process_overview diff --git a/content/applications/finance/accounting/getting_started/initial_configuration.rst b/content/applications/finance/accounting/getting_started/initial_configuration.rst deleted file mode 100644 index 499fec32ae..0000000000 --- a/content/applications/finance/accounting/getting_started/initial_configuration.rst +++ /dev/null @@ -1,11 +0,0 @@ -:nosearch: - -===================== -Initial configuration -===================== - -.. toctree:: - :titlesonly: - - initial_configuration/setup - initial_configuration/chart_of_accounts diff --git a/content/applications/finance/accounting/getting_started/main_concept.rst b/content/applications/finance/accounting/getting_started/main_concept.rst deleted file mode 100644 index a7fc38ecd2..0000000000 --- a/content/applications/finance/accounting/getting_started/main_concept.rst +++ /dev/null @@ -1,138 +0,0 @@ -======================== -Main accounting concepts -======================== - -Double-entry bookkeeping -======================== - -Odoo automatically creates all the behind-the-scenes journal entries -for each of your accounting transactions: customer invoices, point of -sale order, expenses, inventory moves, etc. - -Odoo uses the rules of double-entry bookkeeping system: all journal -entries are automatically balanced (sum of debits = sum of credits). - -.. seealso:: - - :doc:`Understand Odoo's accounting transactions per document - ` - -Accrual and Cash Basis Methods -============================== - -Odoo supports both accrual and cash basis reporting. This allows you to -report income / expense at the time transactions occur (i.e., accrual basis), or when -payment is made or received (i.e., cash basis). - -Multi-companies -=============== - -Odoo allows one to manage several companies within the same database. Each -company has its own chart of accounts and rules. You can get -consolidation reports following your consolidation rules. - -Users can access several companies but always work in one company at a -time. - -Multi-currencies -================ - -Every transaction is recorded in the default currency of the -company. For transactions occurring in another currency, Odoo stores -both the value in the currency of the company and the value in the -currency of the transaction. Odoo can generate currencies gains and -losses after the reconciliation of the journal items. - -Currency rates are updated once a day using a yahoo.com online -web-service. - -International Standards -======================= - -Odoo accounting supports more than 50 countries. The Odoo core -accounting implements accounting standards that are common to all -countries. Specific modules exist per country for the -specificities of the country like the chart of accounts, taxes, or -bank interfaces. - -In particular, Odoo's core accounting engine supports: - -* Anglo-Saxon Accounting (U.S., U.K.,, and other English-speaking - countries including Ireland, Canada, Australia, and New Zealand) - where costs of good sold are reported when products are - sold/delivered. -* European accounting where expenses are accounted at the supplier - bill. - -Odoo has modules to comply with IFRS rules. - -Accounts Receivable and Payable -=============================== - -By default, Odoo uses a single account for all account -receivable entries and one for all accounts payable entries. You can -create separate accounts per customers/suppliers, but you don't need -to. - -As transactions are associated to customers or suppliers, you get -reports to perform analysis per customer/supplier such as the customer -statement, revenues per customers, aged receivable/payables, ... - -Wide range of financial reports -=============================== - -In Odoo, you can generate financial reports in real time. Odoo's -reports range from basic accounting reports to advanced management -reports. Odoo's reports include: - -* Performance reports (such as Profit and Loss, Budget Variance) -* Position reports (such as Balance Sheet, Aged Payables, Aged - Receivables) -* Cash reports (such as Bank Summary) -* Detail reports (such as Trial Balance and General Ledger) -* Management reports (such as Budgets, Executive Summary) - -Odoo's report engine allows you to customize your own report based on -your own formulae. - -Import bank feeds automatically -=============================== - -Bank reconciliation is a process that matches your bank statement -lines, as supplied by the bank, to your accounting transactions in the -general ledger. Odoo makes bank reconciliation easy by frequently -importing bank statement lines from your bank directly into your Odoo -account. This means you can have a daily view of your cashflow without -having to log into your online banking or wait for your paper bank -statements. - -Odoo speeds up bank reconciliation by matching most of your imported -bank statement lines to your accounting transactions. Odoo also -remembers how you've treated other bank statement lines and provides -suggested general ledger transactions. - -Calculate the tax you owe your tax authority -============================================ - -Odoo totals all your accounting transactions for your tax period and -uses these totals to calculate your tax obligation. You can then check -your sales tax by running Odoo's Tax Report. - -Inventory Valuation -=================== - -Odoo support both periodic (manual) and perpetual (automated) -inventory valuations. The available methods are standard price, -average price, LIFO (for countries allowing it) and FIFO. - -.. seealso:: - - :doc:`View impact of the valuation method on your transactions - ` - -Easy retained earnings -====================== - -Retained earnings are the portion of income retained by your -business. Odoo automatically calculates your current year earnings in -real time so no year-end journal or rollover is required. This is -calculated by reporting the profit and loss balance to your balance -sheet report automatically. diff --git a/content/applications/finance/accounting/getting_started/process_overview.rst b/content/applications/finance/accounting/getting_started/process_overview.rst deleted file mode 100644 index cab8539fb6..0000000000 --- a/content/applications/finance/accounting/getting_started/process_overview.rst +++ /dev/null @@ -1,11 +0,0 @@ -:nosearch: - -================ -Process overview -================ - -.. toctree:: - :titlesonly: - - process_overview/customer_invoice - process_overview/supplier_bill diff --git a/content/applications/finance/accounting/others.rst b/content/applications/finance/accounting/others.rst deleted file mode 100644 index 1ce455f6ec..0000000000 --- a/content/applications/finance/accounting/others.rst +++ /dev/null @@ -1,13 +0,0 @@ -:nosearch: - -====== -Others -====== - -.. toctree:: - :titlesonly: - - others/multi_currency - others/analytic_accounting - others/adviser - others/inventory diff --git a/content/applications/finance/accounting/others/adviser.rst b/content/applications/finance/accounting/others/adviser.rst deleted file mode 100644 index a1ef7134c5..0000000000 --- a/content/applications/finance/accounting/others/adviser.rst +++ /dev/null @@ -1,10 +0,0 @@ -:nosearch: - -======= -Adviser -======= - -.. toctree:: - :titlesonly: - - adviser/budget diff --git a/content/applications/finance/accounting/others/adviser/fiscalyear.rst~ b/content/applications/finance/accounting/others/adviser/fiscalyear.rst~ deleted file mode 100644 index 8e376bb620..0000000000 --- a/content/applications/finance/accounting/others/adviser/fiscalyear.rst~ +++ /dev/null @@ -1,3 +0,0 @@ -===================================================== -How to do a year end in Odoo? (close a fiscal year) -===================================================== diff --git a/content/applications/finance/accounting/others/inventory.rst b/content/applications/finance/accounting/others/inventory.rst deleted file mode 100644 index 7b51dd9fd3..0000000000 --- a/content/applications/finance/accounting/others/inventory.rst +++ /dev/null @@ -1,11 +0,0 @@ -:nosearch: - -========= -Inventory -========= - -.. toctree:: - :titlesonly: - - inventory/avg_price_valuation - /applications/inventory_and_mrp/inventory/management/reporting/inventory_valuation_config diff --git a/content/applications/finance/accounting/others/multi_currency/foreign-fields.png b/content/applications/finance/accounting/others/multi_currency/foreign-fields.png deleted file mode 100644 index c84769b4a7..0000000000 Binary files a/content/applications/finance/accounting/others/multi_currency/foreign-fields.png and /dev/null differ diff --git a/content/applications/finance/accounting/payables.rst b/content/applications/finance/accounting/payables.rst deleted file mode 100644 index a6738bc5f1..0000000000 --- a/content/applications/finance/accounting/payables.rst +++ /dev/null @@ -1,12 +0,0 @@ -:nosearch: - -================ -Account payables -================ - -.. toctree:: - :titlesonly: - - payables/supplier_bills - payables/pay - payables/misc diff --git a/content/applications/finance/accounting/payables/misc.rst b/content/applications/finance/accounting/payables/misc.rst deleted file mode 100644 index 05541760a7..0000000000 --- a/content/applications/finance/accounting/payables/misc.rst +++ /dev/null @@ -1,10 +0,0 @@ -:nosearch: - -============= -Miscellaneous -============= - -.. toctree:: - :titlesonly: - - misc/forecast diff --git a/content/applications/finance/accounting/payables/pay.rst b/content/applications/finance/accounting/payables/pay.rst deleted file mode 100644 index a7e5c3895f..0000000000 --- a/content/applications/finance/accounting/payables/pay.rst +++ /dev/null @@ -1,13 +0,0 @@ -:nosearch: - -=============== -Vendor payments -=============== - -.. toctree:: - :titlesonly: - - pay/sepa - pay/check - pay/multiple - pay/trusted_accounts diff --git a/content/applications/finance/accounting/payables/pay/check/check04.png b/content/applications/finance/accounting/payables/pay/check/check04.png deleted file mode 100644 index fba3f5f1f9..0000000000 Binary files a/content/applications/finance/accounting/payables/pay/check/check04.png and /dev/null differ diff --git a/content/applications/finance/accounting/payables/supplier_bills.rst b/content/applications/finance/accounting/payables/supplier_bills.rst deleted file mode 100644 index 3de47b043b..0000000000 --- a/content/applications/finance/accounting/payables/supplier_bills.rst +++ /dev/null @@ -1,12 +0,0 @@ -:nosearch: - -============ -Vendor bills -============ - -.. toctree:: - :titlesonly: - - supplier_bills/deferred_expenses - supplier_bills/assets - supplier_bills/invoice_digitization diff --git a/content/applications/finance/accounting/receivables/customer_payments/recording.rst b/content/applications/finance/accounting/payments.rst similarity index 83% rename from content/applications/finance/accounting/receivables/customer_payments/recording.rst rename to content/applications/finance/accounting/payments.rst index c7191adc47..4c8802df59 100644 --- a/content/applications/finance/accounting/receivables/customer_payments/recording.rst +++ b/content/applications/finance/accounting/payments.rst @@ -1,6 +1,8 @@ -================================== -Different ways to record a payment -================================== +:show-content: + +======== +Payments +======== In Odoo, payments can either be linked automatically to an invoice or bill or be stand-alone records for use at a later date. @@ -13,8 +15,8 @@ your company, or your company has an outstanding debit with a vendor. You can us amounts to reduce unpaid invoices/bills. .. seealso:: - - :doc:`Internal transfers <../../bank/interbank>` - - :doc:`../../bank/reconciliation/use_cases` + - :doc:`Internal transfers ` + - :doc:`bank/reconciliation` - `Odoo Tutorials: Bank Configuration `_ @@ -30,8 +32,7 @@ with a bank statement line, the invoice or vendor bill changes to the :guilabel: The information icon near the payment line displays more information about the payment. You can access additional information, such as the related journal, by clicking on :guilabel:`View`. -.. image:: recording/information-icon.png - :align: center +.. image:: payments/information-icon.png :alt: See detailed information of a payment .. note:: @@ -39,8 +40,8 @@ access additional information, such as the related journal, by clicking on :guil payment. - When clicking on :guilabel:`Register payment`, you can select the amount to pay and make a partial or full payment. - - If your main bank account is set as :doc:`outstanding account - <../../bank/setup/outstanding_accounts>`, and the payment is made in Odoo (not related to a + - If your main bank account is set as :ref:`outstanding account + `, and the payment is made in Odoo (not related to a bank statement), invoices and bills are directly registered in the status :guilabel:`Paid`. - If you unreconciled a payment, it still appears in your books but is no longer linked to the invoice. @@ -50,7 +51,7 @@ access additional information, such as the related journal, by clicking on :guil automatically created to post the cash basis tax (reversal) amount. .. seealso:: - - :doc:`../../bank/reconciliation/use_cases` + - :doc:`bank/reconciliation` Registering payments not tied to an invoice or bill =================================================== @@ -67,31 +68,30 @@ A blue banner appears when you validate a new invoice or bill and there is an ou for this specific customer or vendor. It can easily be matched from the invoice or the bill by clicking on :guilabel:`ADD` under :guilabel:`Outstanding Credits` or :guilabel:`Outstanding Debits`. -.. image:: recording/add-option.png - :align: center +.. image:: payments/add-option.png :alt: Shows the ADD option to reconcile an invoice or a bill with a payment The invoice or bill is now marked as :guilabel:`In payment` until it is reconciled with the bank statement. .. seealso:: - - :doc:`../../bank/reconciliation/use_cases` + - :doc:`bank/reconciliation` Batch payment ------------- Batch payments allow you to group different payments to ease :doc:`reconciliation -<../../bank/reconciliation/use_cases>`. They are also useful when you deposit checks to the bank or +`. They are also useful when you deposit checks to the bank or for SEPA Payments. To do so, go to :menuselection:`Accounting --> Customers --> Batch Payments` or :menuselection:`Accounting --> Vendors --> Batch Payments`. In the list view of payments, you can select several payments and group them in a batch by clicking on :menuselection:`Action --> Create Batch Payment`. .. seealso:: - - :doc:`../../receivables/customer_payments/batch` - - :doc:`../../receivables/customer_payments/batch_sdd` + - :doc:`payments/batch` + - :doc:`payments/batch_sdd` -.. _payments-matching: +.. _payments/matching: Payments matching ----------------- @@ -103,7 +103,7 @@ Customer Invoices / Vendor Bills`, and click on :guilabel:`⋮` and select :guil Matching`, or by going to :menuselection:`Accounting --> Reconciliation`. .. note:: - During the :doc:`reconciliation <../../bank/reconciliation/use_cases>`, if the sum of the debits + During the :doc:`reconciliation `, if the sum of the debits and credits does not match, there is a remaining balance. This either needs to be reconciled at a later date or needs to be written off directly. @@ -115,8 +115,7 @@ the batch reconciliation feature can be used. Go to :menuselection:`Accounting - Aged Receivable / Aged Payable`. You now see all transactions that have not been reconciled yet, and when you select a customer or vendor, the :guilabel:`Reconcile` option is displayed. -.. image:: recording/reconcile-option.png - :align: center +.. image:: payments/reconcile-option.png :alt: See the reconcile option Reconciling payments with bank statements @@ -127,4 +126,19 @@ next step is to reconcile it with the related bank statement line to have the tr and the invoice or bill marked as :guilabel:`Paid`. .. seealso:: - - :doc:`../../bank/reconciliation/use_cases` + - :doc:`bank/reconciliation` + +.. toctree:: + :titlesonly: + + payments/online + payments/checks + payments/batch + payments/batch_sdd + payments/follow_up + payments/internal_transfers + payments/pay_sepa + payments/pay_checks + payments/multiple + payments/forecast + payments/trusted_accounts diff --git a/content/applications/finance/accounting/receivables/customer_payments/recording/add-option.png b/content/applications/finance/accounting/payments/add-option.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/recording/add-option.png rename to content/applications/finance/accounting/payments/add-option.png diff --git a/content/applications/finance/accounting/receivables/customer_payments/batch.rst b/content/applications/finance/accounting/payments/batch.rst similarity index 99% rename from content/applications/finance/accounting/receivables/customer_payments/batch.rst rename to content/applications/finance/accounting/payments/batch.rst index 02567aca74..4bb6245ac5 100644 --- a/content/applications/finance/accounting/receivables/customer_payments/batch.rst +++ b/content/applications/finance/accounting/payments/batch.rst @@ -68,5 +68,5 @@ batch and click :guilabel:`Validate` to finalize the process. payment before reconciling. .. seealso:: - - :doc:`recording` + - :doc:`../payments` - :doc:`batch_sdd` diff --git a/content/applications/finance/accounting/receivables/customer_payments/batch/batch-customer-payment.png b/content/applications/finance/accounting/payments/batch/batch-customer-payment.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/batch/batch-customer-payment.png rename to content/applications/finance/accounting/payments/batch/batch-customer-payment.png diff --git a/content/applications/finance/accounting/receivables/customer_payments/batch/batch-lines-selection.png b/content/applications/finance/accounting/payments/batch/batch-lines-selection.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/batch/batch-lines-selection.png rename to content/applications/finance/accounting/payments/batch/batch-lines-selection.png diff --git a/content/applications/finance/accounting/receivables/customer_payments/batch/batch-new-inbound.png b/content/applications/finance/accounting/payments/batch/batch-new-inbound.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/batch/batch-new-inbound.png rename to content/applications/finance/accounting/payments/batch/batch-new-inbound.png diff --git a/content/applications/finance/accounting/receivables/customer_payments/batch/batch-payments.png b/content/applications/finance/accounting/payments/batch/batch-payments.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/batch/batch-payments.png rename to content/applications/finance/accounting/payments/batch/batch-payments.png diff --git a/content/applications/finance/accounting/receivables/customer_payments/batch/batch-reconciliation.png b/content/applications/finance/accounting/payments/batch/batch-reconciliation.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/batch/batch-reconciliation.png rename to content/applications/finance/accounting/payments/batch/batch-reconciliation.png diff --git a/content/applications/finance/accounting/receivables/customer_payments/batch_sdd.rst b/content/applications/finance/accounting/payments/batch_sdd.rst similarity index 92% rename from content/applications/finance/accounting/receivables/customer_payments/batch_sdd.rst rename to content/applications/finance/accounting/payments/batch_sdd.rst index f9cd3be8f2..19eed08662 100644 --- a/content/applications/finance/accounting/receivables/customer_payments/batch_sdd.rst +++ b/content/applications/finance/accounting/payments/batch_sdd.rst @@ -44,24 +44,22 @@ upload the signed file and click on :guilabel:`Validate` to start running the ma .. important:: Make sure that the **IBAN bank accounts details** are correctly recorded on the debtor’s contact - form, under the :guilabel:`Accounting` tab, and in your own :doc:`Bank Account - <../../bank/setup/bank_accounts>` settings. + form, under the :guilabel:`Accounting` tab, and in your own :doc:`Bank Account <../bank>` settings. SEPA Direct Debit as a payment method ------------------------------------- SDD can be used as a payment method both on your **eCommerce** or on the **Customer Portal** by -activating SDD as a **Payment Provider**. With this method, your customers can create and sign their -mandates themselves. +activating SDD as a **Payment Provider**. With this method, your customers can create their mandates. +To ensure the validity of the information given by the customer, they will have to confirm each +mandate with one successful bank transfer of the expected amount. -To do so, go to :menuselection:`Accounting --> Configuration --> Payment Providers`, click on *SEPA -Direct Debit*, and set it up according to your needs. -To do so, go to :menuselection:`Accounting app --> Configuration --> Payment Acquirers`, click on +To do so, go to :menuselection:`Accounting app --> Configuration --> Payment Providers`, click on :guilabel:`SEPA Direct Debit`. .. important:: - Make sure to change the :guilabel:`State` field to :guilabel:`Enabled`, and to check - :guilabel:`Online Signature`, as this is necessary to let your customers sign their mandates. + Make sure to change the :guilabel:`State` field to :guilabel:`Enabled` and set the provider as + "Published" so that it is available for your customers. Customers using SDD as payment method get prompted to add their IBAN, email address, and to sign their SEPA Direct Debit mandate. @@ -125,7 +123,7 @@ Finally, upload this file to your online banking interface to process the paymen .. seealso:: * :doc:`batch` - * :doc:`../../bank/setup/bank_accounts` + * :doc:`../bank` * `List of all SEPA countries `_ * `Sepa guidelines diff --git a/content/applications/finance/accounting/receivables/customer_payments/batch_sdd/batch-sdd-batch.png b/content/applications/finance/accounting/payments/batch_sdd/batch-sdd-batch.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/batch_sdd/batch-sdd-batch.png rename to content/applications/finance/accounting/payments/batch_sdd/batch-sdd-batch.png diff --git a/content/applications/finance/accounting/receivables/customer_payments/batch_sdd/collect.png b/content/applications/finance/accounting/payments/batch_sdd/collect.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/batch_sdd/collect.png rename to content/applications/finance/accounting/payments/batch_sdd/collect.png diff --git a/content/applications/finance/accounting/receivables/customer_payments/batch_sdd/creditor-identifier.png b/content/applications/finance/accounting/payments/batch_sdd/creditor-identifier.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/batch_sdd/creditor-identifier.png rename to content/applications/finance/accounting/payments/batch_sdd/creditor-identifier.png diff --git a/content/applications/finance/accounting/receivables/customer_payments/batch_sdd/xml.png b/content/applications/finance/accounting/payments/batch_sdd/xml.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/batch_sdd/xml.png rename to content/applications/finance/accounting/payments/batch_sdd/xml.png diff --git a/content/applications/finance/accounting/payments/checks.rst b/content/applications/finance/accounting/payments/checks.rst new file mode 100644 index 0000000000..3c263a4f9f --- /dev/null +++ b/content/applications/finance/accounting/payments/checks.rst @@ -0,0 +1,128 @@ +====== +Checks +====== + +There are two ways to handle payments received by checks in Odoo, either by using :ref:`outstanding +accounts ` or by :ref:`bypassing the reconciliation process +`. + +**Using outstanding accounts is recommended**, as your bank account balance stays accurate by taking +into account checks yet to be cashed. + +.. note:: + Both methods produce the same data in your accounting at the end of the process. But if you + have checks that have not been cashed in, the **Outstanding Account** method reports these + checks in the **Outstanding Receipts** account. However, funds appear in your bank account + whether or not they are reconciled, as the bank value is reflected at the moment of the bank + statement. + +.. seealso:: + * :ref:`Outstanding accounts ` + * :ref:`Bank reconciliation ` + +.. _checks/outstanding-account: + +Method 1: Outstanding account +============================= + +When you receive a check, you :doc:`record a payment <../bank/reconciliation>` by check on the +invoice. Then, when your bank account is credited with the check's amount, you reconcile the payment +and statement to move the amount from the **Outstanding Receipt** account to the **Bank** account. + +.. tip:: + You can create a new payment method named *Checks* if you would like to identify such payments + quickly. To do so, go to :menuselection:`Accounting --> Configuration --> Journals --> Bank`, + click the :guilabel:`Incoming Payments` tab, and :guilabel:`Add a line`. As :guilabel:`Payment + Method`, select :guilabel:`Manual`, and enter `Checks` as name. + +.. _checks/reconciliation-bypass: + +Method 2: Reconciliation bypass +=============================== + +When you receive a check, you :doc:`record a payment <../bank/reconciliation>` on the related +invoice. The amount is then moved from the **Account Receivable** to the **Bank** account, bypassing +the reconciliation and creating only **one journal entry**. + +To do so, you *must* follow the following setup. Go to :menuselection:`Accounting --> Configuration +--> Journals --> Bank`. Click the :guilabel:`Incoming Payments` tab and then :guilabel:`Add a line`, +select :guilabel:`Manual` as :guilabel:`Payment Method`, and enter `Checks` as :guilabel:`Name`. +Click the toggle menu button, tick :guilabel:`Outstanding Receipts accounts`, and in the +:guilabel:`Outstanding Receipts accounts` column, and set the :guilabel:`Bank` account for the +**Checks** payment method. + +.. image:: checks/outstanding-payment-accounts.png + :alt: Bypass the Outstanding Receipts account using the Bank account. + +Payment registration +==================== + +.. note:: + By default, there are two ways to register payments made by check: + + - **Manual**: for single checks; + - **Batch**: for multiple checks at once. + + This documentation focuses on **single-check** payments. For **batch deposits**, see :doc:`the + batch payments documentation `. + +Once you receive a customer check, go to the related invoice (:menuselection:`Accounting --> +Customer --> Invoices)`, and click :guilabel:`Register Payment`. Fill in the payment information: + +- :guilabel:`Journal: Bank`; +- :guilabel:`Payment method`: :guilabel:`Manual` (or **Checks** if you have created a specific + payment method); +- :guilabel:`Memo`: enter the check number; +- Click :guilabel:`Create Payment`. + +.. image:: checks/payment-checks.png + :alt: Check payment info + +The generated journal entries are different depending on the payment registration method chosen. + +Journal entries +=============== + +Outstanding account +------------------- + +The invoice is marked as :guilabel:`In Payment` as soon as you record the payment. This operation +produces the following **journal entry**: + ++----------------------+-------------------+----------+----------+ +| Account | Statement Match | Debit | Credit | ++======================+===================+==========+==========+ +| Account Receivable | | | 100.00 | ++----------------------+-------------------+----------+----------+ +| Outstanding Receipts | | 100.00 | | ++----------------------+-------------------+----------+----------+ + +Then, once you receive the bank statements, match this statement with the check of the **Outstanding +Receipts** account. This produces the following **journal entry**: + ++---------------------+-------------------+----------+----------+ +| Account | Statement Match | Debit | Credit | ++=====================+===================+==========+==========+ +| Outstanding Receipts| X | | 100.00 | ++---------------------+-------------------+----------+----------+ +| Bank | | 100.00 | | ++---------------------+-------------------+----------+----------+ + +If you use this approach to manage received checks, you get the list of checks that have not been +cashed in the **Outstanding Receipt** account (accessible, for example, from the general ledger). + +Reconciliation bypass +--------------------- + +The invoice is marked as :guilabel:`Paid` as soon as you record the check. + +With this approach, you bypass the use of **outstanding accounts**, effectively getting only one +journal entry in your books and bypassing the reconciliation: + ++----------------------+-------------------+----------+----------+ +| Account | Statement Match | Debit | Credit | ++======================+===================+==========+==========+ +| Account Receivable | X | | 100.00 | ++----------------------+-------------------+----------+----------+ +| Bank | | 100.00 | | ++----------------------+-------------------+----------+----------+ diff --git a/content/applications/finance/accounting/payments/checks/outstanding-payment-accounts.png b/content/applications/finance/accounting/payments/checks/outstanding-payment-accounts.png new file mode 100644 index 0000000000..c686259c58 Binary files /dev/null and b/content/applications/finance/accounting/payments/checks/outstanding-payment-accounts.png differ diff --git a/content/applications/finance/accounting/payments/checks/payment-checks.png b/content/applications/finance/accounting/payments/checks/payment-checks.png new file mode 100644 index 0000000000..c63bcf9c44 Binary files /dev/null and b/content/applications/finance/accounting/payments/checks/payment-checks.png differ diff --git a/content/applications/finance/accounting/payments/follow_up.rst b/content/applications/finance/accounting/payments/follow_up.rst new file mode 100644 index 0000000000..3683bc3f9a --- /dev/null +++ b/content/applications/finance/accounting/payments/follow_up.rst @@ -0,0 +1,95 @@ +===================== +Follow-up on invoices +===================== + +A follow-up message can be sent to customers when a payment is overdue. Odoo helps you identify late +payments and allows you to schedule and send the appropriate reminders using **follow-up actions** +that automatically trigger one or more actions according to the number of overdue days. You can send +your follow-ups via different means, such as email, post, or SMS. + +.. seealso:: + - `Odoo Tutorials: Payment Follow-up `_ + +Configuration +============= + +To configure a :guilabel:`Follow-Up Action`, go to :menuselection:`Accounting --> Configuration --> +Follow-up Levels`, and select or create (a) new follow-up level(s). Several follow-up actions are +available by default under the :guilabel:`Notification` tab, and the **name** as well as the +**number of days** can be changed. The follow-up :guilabel:`Actions` available are: + +- :guilabel:`Send Email`; +- :ref:`Send a Letter `; +- :ref:`Send an SMS message `. + +You can use a pre-filled template for your messages by selecting a :guilabel:`Content Template`. To +change the template used, hover over the field and click the :guilabel:`-->`. If enabled, SMS +messages have a specific :guilabel:`Sms Template` field. + +It is possible to automatically send a reminder by enabling the :guilabel:`Automatic` option, and +attaching the *open* invoice(s) by enabling :guilabel:`Attach Invoices`, within a specific follow-up +action. + +By clicking on the :guilabel:`Activity` tab, scheduling activities (tasks) is possible. That way, +an activity is automatically scheduled when the follow-up is triggered. To do so, enable +:guilabel:`Schedule Activity`, and select a :guilabel:`Responsible` person for the task. Choose an +:guilabel:`Activity Type`, and enter a :guilabel:`Summary` on how to handle the activity, if +desired. + +.. tip:: + Set a negative number of days to send a reminder before the actual due date. + +Follow-up reports +================= + +Overdue invoices you need to follow up on are available in :menuselection:`Accounting --> Customers +--> Follow-up Reports`. By default, Odoo filters by :guilabel:`Overdue Invoices`, but you can also +filter by :guilabel:`In need of action` in the :guilabel:`Filters` menu. + +When selecting an invoice, you can see all of the customer's unpaid invoices (overdue or not), with +the due dates of late invoices appearing in red. You can exclude invoices from a reminder by +clicking :guilabel:`Exclude from Follow-ups`. You can set either :guilabel:`Automatic` or +:guilabel:`Manual` reminders as well as a :guilabel:`Responsible` person for that customer. + +To send reminders, click on :guilabel:`Follow up`, and select the action(s) you want to perform +from: + +- :guilabel:`Print`; +- :guilabel:`Email`; +- :guilabel:`Sms`; +- :guilabel:`By post`. + +You can :guilabel:`Attach Invoices` and change the content templates from this view. When done, +click :guilabel:`Send` or :guilabel:`Send & Print`. + +.. note:: + - The contact information on the invoice or the contact form is used to send the reminder. + - When the reminder is sent, it is documented in the chatter of the invoice. + - If it is not the right time for a reminder, you can specify the :guilabel:`Next Reminder` date. + You will get the next report according to the next reminder date set. + +.. tip:: + Reconcile all bank statements right before launching the follow-up process to avoid sending a + reminder to a customer that has already paid. + +Debtor's trust level +-------------------- + +To know whether a customer usually pays late or not, you can set a trust level by marking them as +:guilabel:`Good Debtor`, :guilabel:`Normal Debtor`, or :guilabel:`Bad Debtor` on their follow-up +report. To do so, click on the bullet next to the customer's name and select a trust level. + +.. image:: follow_up/debtors-trust-level.png + :alt: Set debtor's trust level + +Send reminders in batches +------------------------- + +You can send reminder emails in batches from the :guilabel:`Follow-up Reports` page. To do so, +select all the reports you would like to process, click on the :guilabel:`Action` gear icon, and +select :guilabel:`Process follow-ups`. + +.. seealso:: + - :doc:`../../../general/in_app_purchase` + - :doc:`../../../marketing/sms_marketing/pricing/pricing_and_faq` + - :doc:`../customer_invoices/snailmail` diff --git a/content/applications/finance/accounting/receivables/customer_payments/followup/debtors-trust-level.png b/content/applications/finance/accounting/payments/follow_up/debtors-trust-level.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/followup/debtors-trust-level.png rename to content/applications/finance/accounting/payments/follow_up/debtors-trust-level.png diff --git a/content/applications/finance/accounting/payables/misc/forecast.rst b/content/applications/finance/accounting/payments/forecast.rst similarity index 100% rename from content/applications/finance/accounting/payables/misc/forecast.rst rename to content/applications/finance/accounting/payments/forecast.rst diff --git a/content/applications/finance/accounting/receivables/customer_payments/recording/information-icon.png b/content/applications/finance/accounting/payments/information-icon.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/recording/information-icon.png rename to content/applications/finance/accounting/payments/information-icon.png diff --git a/content/applications/finance/accounting/bank/interbank.rst b/content/applications/finance/accounting/payments/internal_transfers.rst similarity index 88% rename from content/applications/finance/accounting/bank/interbank.rst rename to content/applications/finance/accounting/payments/internal_transfers.rst index 5d66e44748..1fb6877f71 100644 --- a/content/applications/finance/accounting/bank/interbank.rst +++ b/content/applications/finance/accounting/payments/internal_transfers.rst @@ -1,6 +1,6 @@ -================= -Internal transfer -================= +================== +Internal transfers +================== In Odoo, internal money transfers can be made in a few clicks. You need at least either two bank accounts, two cash journals, or one bank account and one cash journal. @@ -15,7 +15,7 @@ Settings` and then under the :guilabel:`Default Accounts` section. .. note:: At least two bank accounts are needed to make internal transfers. Refer to - :doc:`Bank and cash accounts section ` to see how to add an additional bank + :doc:`Bank and cash accounts section <../bank>` to see how to add an additional bank account to your database. Register an internal transfer from one bank to another @@ -31,7 +31,7 @@ From the Accounting Dashboard, click on the drop-down selection button (:guilabe your banks. In the :guilabel:`New` column click on :guilabel:`Internal Transfer` and enter the information related to the transfer. -.. image:: interbank/internal_transfer.png +.. image:: internal_transfers/internal_transfer.png :align: center :alt: Fill in the information related to your internal transfer @@ -81,7 +81,7 @@ Automated booking - Bank journal (BANK B) journals, because the bank statement confirming the sending and receiving of the money has not been booked yet. -.. image:: interbank/outstanding-payments-receipts.png +.. image:: internal_transfers/outstanding-payments-receipts.png :align: center :alt: Outstanding Payments/Receipts pending bank statement booking @@ -91,21 +91,21 @@ Manage and reconcile bank statements ------------------------------------ The next step is to book the bank statements to finalize the transaction by creating, -:doc:`importing `, or :doc:`synchronizing ` your +:doc:`importing <../bank/transactions>`, or :doc:`synchronizing <../bank/bank_synchronization>` your :guilabel:`Transactions lines`. Fill in the :guilabel:`Ending balance` and click on the :guilabel:`Reconcile` button. -.. image:: interbank/transactions-line.png +.. image:: internal_transfers/transactions-line.png :align: center :alt: Transaction lines to be filled in prior to reconciliation .. seealso:: - :doc:`reconciliation/use_cases` + :doc:`../bank/reconciliation` In the next window, choose counterparts for the payment - in this example, the outstanding payment account - then click :guilabel:`Validate`. -.. image:: interbank/bank-reconciliation.png +.. image:: internal_transfers/bank-reconciliation.png :align: center :alt: Reconcile your payment diff --git a/content/applications/finance/accounting/bank/interbank/bank-reconciliation.png b/content/applications/finance/accounting/payments/internal_transfers/bank-reconciliation.png similarity index 100% rename from content/applications/finance/accounting/bank/interbank/bank-reconciliation.png rename to content/applications/finance/accounting/payments/internal_transfers/bank-reconciliation.png diff --git a/content/applications/finance/accounting/bank/interbank/internal_transfer.png b/content/applications/finance/accounting/payments/internal_transfers/internal_transfer.png similarity index 100% rename from content/applications/finance/accounting/bank/interbank/internal_transfer.png rename to content/applications/finance/accounting/payments/internal_transfers/internal_transfer.png diff --git a/content/applications/finance/accounting/bank/interbank/outstanding-payments-receipts.png b/content/applications/finance/accounting/payments/internal_transfers/outstanding-payments-receipts.png similarity index 100% rename from content/applications/finance/accounting/bank/interbank/outstanding-payments-receipts.png rename to content/applications/finance/accounting/payments/internal_transfers/outstanding-payments-receipts.png diff --git a/content/applications/finance/accounting/bank/interbank/transactions-line.png b/content/applications/finance/accounting/payments/internal_transfers/transactions-line.png similarity index 100% rename from content/applications/finance/accounting/bank/interbank/transactions-line.png rename to content/applications/finance/accounting/payments/internal_transfers/transactions-line.png diff --git a/content/applications/finance/accounting/payables/pay/multiple.rst b/content/applications/finance/accounting/payments/multiple.rst similarity index 83% rename from content/applications/finance/accounting/payables/pay/multiple.rst rename to content/applications/finance/accounting/payments/multiple.rst index d303cbc731..e4c874dfb8 100644 --- a/content/applications/finance/accounting/payables/pay/multiple.rst +++ b/content/applications/finance/accounting/payments/multiple.rst @@ -7,7 +7,7 @@ reconciliation process. .. seealso:: - :doc:`/applications/inventory_and_mrp/purchase/manage_deals/manage` - - :doc:`/applications/finance/accounting/bank/reconciliation/use_cases` + - :doc:`/applications/finance/accounting/bank/reconciliation` Group payments ============== @@ -44,10 +44,10 @@ Partial group payments with cash discounts In case of **partial group payments with cash discounts**, you can follow the steps found on the :doc:`cash discount documentation page -`. Make sure to +`. Make sure to apply the :doc:`payment terms -` to the **bills** +` to the **bills** *instead* of the invoices. .. seealso:: - :doc:`/applications/finance/accounting/receivables/customer_invoices/payment_terms` + :doc:`/applications/finance/accounting/customer_invoices/payment_terms` diff --git a/content/applications/finance/accounting/payables/pay/multiple/multiple-group-payments.png b/content/applications/finance/accounting/payments/multiple/multiple-group-payments.png similarity index 100% rename from content/applications/finance/accounting/payables/pay/multiple/multiple-group-payments.png rename to content/applications/finance/accounting/payments/multiple/multiple-group-payments.png diff --git a/content/applications/finance/accounting/payables/pay/multiple/register-payment-button.png b/content/applications/finance/accounting/payments/multiple/register-payment-button.png similarity index 100% rename from content/applications/finance/accounting/payables/pay/multiple/register-payment-button.png rename to content/applications/finance/accounting/payments/multiple/register-payment-button.png diff --git a/content/applications/finance/accounting/receivables/customer_payments/online_payment.rst b/content/applications/finance/accounting/payments/online.rst similarity index 82% rename from content/applications/finance/accounting/receivables/customer_payments/online_payment.rst rename to content/applications/finance/accounting/payments/online.rst index ac42e68994..5610b2d525 100644 --- a/content/applications/finance/accounting/receivables/customer_payments/online_payment.rst +++ b/content/applications/finance/accounting/payments/online.rst @@ -1,19 +1,19 @@ :show-content: -====================== -Invoice online payment -====================== +=============== +Online payments +=============== .. toctree:: - online_payment/install_portal_patch + online/install_portal_patch To make it more convenient for your customers to pay the invoices you issue, you can activate the **Invoice Online Payment** feature, which adds a *Pay Now* button on their **Customer Portal**. This allows your customers to see their invoices online and pay directly with their favorite payment method, making the payment process much easier. -.. image:: online_payment/online-payment-providers.png +.. image:: online/online-payment-providers.png :align: center :alt: Payment provider choice after having clicked on "Pay Now" @@ -36,14 +36,12 @@ After issuing the invoice, click on *Send & Print* and send the invoice by email They will receive an email with a link that redirects them to the invoice on their **Customer Portal**. -.. image:: online_payment/online-payment-view-invoice.png - :align: center +.. image:: online/view-invoice.png :alt: Email with a link to view the invoice online on the Customer Portal. They can choose which Payment Provider to use by clicking on *Pay Now*. -.. image:: online_payment/online-payment-pay-now.png - :align: center +.. image:: online/pay-now.png :alt: "Pay now" button on an invoice in the Customer Portal. .. seealso:: diff --git a/content/applications/finance/accounting/receivables/customer_payments/online_payment/install_portal_patch.rst b/content/applications/finance/accounting/payments/online/install_portal_patch.rst similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/online_payment/install_portal_patch.rst rename to content/applications/finance/accounting/payments/online/install_portal_patch.rst diff --git a/content/applications/finance/accounting/receivables/customer_payments/online_payment/online-payment-providers.png b/content/applications/finance/accounting/payments/online/online-payment-providers.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/online_payment/online-payment-providers.png rename to content/applications/finance/accounting/payments/online/online-payment-providers.png diff --git a/content/applications/finance/accounting/receivables/customer_payments/online_payment/online-payment-pay-now.png b/content/applications/finance/accounting/payments/online/pay-now.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/online_payment/online-payment-pay-now.png rename to content/applications/finance/accounting/payments/online/pay-now.png diff --git a/content/applications/finance/accounting/receivables/customer_payments/online_payment/online-payment-view-invoice.png b/content/applications/finance/accounting/payments/online/view-invoice.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/online_payment/online-payment-view-invoice.png rename to content/applications/finance/accounting/payments/online/view-invoice.png diff --git a/content/applications/finance/accounting/payables/pay/check.rst b/content/applications/finance/accounting/payments/pay_checks.rst similarity index 100% rename from content/applications/finance/accounting/payables/pay/check.rst rename to content/applications/finance/accounting/payments/pay_checks.rst diff --git a/content/applications/finance/accounting/payables/pay/sepa.rst b/content/applications/finance/accounting/payments/pay_sepa.rst similarity index 98% rename from content/applications/finance/accounting/payables/pay/sepa.rst rename to content/applications/finance/accounting/payments/pay_sepa.rst index 735ae372e3..c7848d1c6e 100644 --- a/content/applications/finance/accounting/payables/pay/sepa.rst +++ b/content/applications/finance/accounting/payments/pay_sepa.rst @@ -54,8 +54,7 @@ SCT option when paying your vendor. .. note:: According to the localization package installed, the **SEPA Direct Debit** and **SEPA Credit - Transfer** modules may be installed by default. If not, they need to be :doc:`installed - <../../../../general/apps_modules>`. + Transfer** modules may be installed by default. If not, they need to be :ref:`installed `. Activate SEPA payment methods on banks -------------------------------------- diff --git a/content/applications/finance/accounting/receivables/customer_payments/recording/reconcile-option.png b/content/applications/finance/accounting/payments/reconcile-option.png similarity index 100% rename from content/applications/finance/accounting/receivables/customer_payments/recording/reconcile-option.png rename to content/applications/finance/accounting/payments/reconcile-option.png diff --git a/content/applications/finance/accounting/payables/pay/trusted_accounts.rst b/content/applications/finance/accounting/payments/trusted_accounts.rst similarity index 100% rename from content/applications/finance/accounting/payables/pay/trusted_accounts.rst rename to content/applications/finance/accounting/payments/trusted_accounts.rst diff --git a/content/applications/finance/accounting/payables/pay/trusted_accounts/send-money-toggle.png b/content/applications/finance/accounting/payments/trusted_accounts/send-money-toggle.png similarity index 100% rename from content/applications/finance/accounting/payables/pay/trusted_accounts/send-money-toggle.png rename to content/applications/finance/accounting/payments/trusted_accounts/send-money-toggle.png diff --git a/content/applications/finance/accounting/receivables.rst b/content/applications/finance/accounting/receivables.rst deleted file mode 100644 index e444f36c02..0000000000 --- a/content/applications/finance/accounting/receivables.rst +++ /dev/null @@ -1,11 +0,0 @@ -:nosearch: - -=================== -Account receivables -=================== - -.. toctree:: - :titlesonly: - - receivables/customer_invoices - receivables/customer_payments diff --git a/content/applications/finance/accounting/receivables/customer_invoices.rst b/content/applications/finance/accounting/receivables/customer_invoices.rst deleted file mode 100644 index afa9e2590e..0000000000 --- a/content/applications/finance/accounting/receivables/customer_invoices.rst +++ /dev/null @@ -1,18 +0,0 @@ -:nosearch: - -================= -Customer invoices -================= - -.. toctree:: - :titlesonly: - - customer_invoices/overview - customer_invoices/cash_discounts - customer_invoices/cash_rounding - customer_invoices/payment_terms - customer_invoices/deferred_revenues - customer_invoices/credit_notes - customer_invoices/epc_qr_code - customer_invoices/snailmail - customer_invoices/electronic_invoicing diff --git a/content/applications/finance/accounting/receivables/customer_invoices/cash_discounts/payment-terms.png b/content/applications/finance/accounting/receivables/customer_invoices/cash_discounts/payment-terms.png deleted file mode 100644 index 06a50af329..0000000000 Binary files a/content/applications/finance/accounting/receivables/customer_invoices/cash_discounts/payment-terms.png and /dev/null differ diff --git a/content/applications/finance/accounting/receivables/customer_invoices/credit_notes.rst b/content/applications/finance/accounting/receivables/customer_invoices/credit_notes.rst deleted file mode 100644 index edbb87afb3..0000000000 --- a/content/applications/finance/accounting/receivables/customer_invoices/credit_notes.rst +++ /dev/null @@ -1,103 +0,0 @@ -======================== -Credit notes and refunds -======================== - -A **credit note**, or **credit memo**, is a document issued -to a customer that notifies them that they have been credited -a certain amount. - -There are several reasons that can lead to a credit note, such as: - * a mistake in the invoice - * a return of the goods, or a rejection of the services - * the goods delivered are damaged - -.. note:: - Issuing a credit note is the only legal way to cancel, - refund or modify a validated invoice. Don’t forget to - *register the payment* afterward if you need to send money - back to your customer. - -Issue a Credit Note -=================== - -You can create a credit note from scratch by going to -:menuselection:`Accounting --> Customers --> Credit Notes`, -and by clicking on *Create*. Filling the Credit Note’s form -works the same way as the Invoice’s form. - -However, most of the time, credit notes are generated directly -from the invoices they are related to. - -To do so, open the *Customer Invoice*, and click on *Add Credit Note*. - -.. image:: credit_notes/credit_notes01.png - :align: center - -You can choose between three options: - - Partial Refund - - Full Refund - - Full refund and new draft invoice - -.. note:: - Credit Notes’ numbers start with “R” and are followed by the - number of the document they are related to (e.g., RINV/2019/0004). - -Partial Refund --------------- - -Odoo creates a draft credit note already prefilled with all the -necessary information from the original invoice. - -This is the option to choose to do a partial refund, or if you -want to modify any detail on the credit note. - -.. note:: - This is the only option available for invoices that are already marked as *Paid*. - -Full Refund ------------ - -Odoo creates a credit note, automatically validates it, and -reconciles the original invoice with it. - -.. image:: credit_notes/credit_notes02.png - :align: center - -This is the option to choose to do a full refund or cancel -a validated invoice. - -Full refund and new draft invoice ---------------------------------- - -Odoo creates a credit note, automatically validates it, reconciles -the original invoice with it, and open a new draft invoice -prefilled with the same details from the original invoice. - -This is the option to choose to modify the content of a validated invoice. - -Record a Vendor Refund -====================== - -**Vendor Refunds** are recorded the same way you would do with invoices’ credit notes: - -You can either create a credit note from scratch by going -to :menuselection:`Accounting --> Vendors --> Refund`, and -by clicking on *Create*, or by opening the validated *Vendor Bill*, -and clicking on *Add Credit Note*. - -Journal Entries -=============== - -Issuing a credit note from an invoice creates a **reverse entry** -that zeroes out the journal items generated by the original invoice. - -Here is an example of an invoice’s journal entry: - -.. image:: credit_notes/credit_notes03.png - :align: center - -And here is the credit note’s journal entry generated to reverse -the original invoice above: - -.. image:: credit_notes/credit_notes04.png - :align: center diff --git a/content/applications/finance/accounting/receivables/customer_invoices/credit_notes/credit_notes01.png b/content/applications/finance/accounting/receivables/customer_invoices/credit_notes/credit_notes01.png deleted file mode 100644 index c8c0f5b184..0000000000 Binary files a/content/applications/finance/accounting/receivables/customer_invoices/credit_notes/credit_notes01.png and /dev/null differ diff --git a/content/applications/finance/accounting/receivables/customer_invoices/epc_qr_code.rst b/content/applications/finance/accounting/receivables/customer_invoices/epc_qr_code.rst deleted file mode 100644 index 43009484a7..0000000000 --- a/content/applications/finance/accounting/receivables/customer_invoices/epc_qr_code.rst +++ /dev/null @@ -1,69 +0,0 @@ -============================ -Add EPC QR Codes to invoices -============================ - -European Payments Council Quick Response Code, -or **EPC QR Code**, are two-dimensional barcodes -that customers can scan with their **mobile banking -applications** to initiate a **SEPA Credit Transfer -(SCT)**, and pay their invoices instantly. - -In addition to bringing ease of use and speed, -it greatly reduces typing errors that would potentially -make for payment issues. - -.. note:: - This feature is only available in several European - countries such as Austria, Belgium, Finland, Germany, - and The Netherlands. - -Configuration -============= - -Go to :menuselection:`Accounting --> Configuration --> Settings` -and activate the **SEPA QR Code** feature. - -.. image:: epc_qr_code/epc_qr_code01.png - :align: center - -Configure your Bank Account’s journal -------------------------------------- - -Make sure that your *Bank Account* is correctly configured -on Odoo with your IBAN and BIC. - -To do so, go to :menuselection:`Accounting --> Configuration ---> Journals`, open your *bank journal*, then fill out the -*Bank Account* and *Bank* under the *Bank Account* tab. - -.. image:: epc_qr_code/epc_qr_code02.png - :align: center - -Issue Invoices with EPC QR Codes -================================ - -EPC QR Codes are added automatically to your invoices, as -long as you issue them to customers that are located in a -country where this feature is available. - -Go to :menuselection:`Accounting --> Customers --> Invoices`, -and create a new invoice. - -Before posting it, open the *Other Info* tab. Odoo automatically -fills out the *Bank Account* field with your IBAN. - -Make sure that the account indicated is the one you want to use to -receive your customer’s payment as Odoo uses this field to generate -the EPC QR Code. - -.. image:: epc_qr_code/epc_qr_code03.png - :align: center - -.. tip:: - If you want to issue an invoice without an EPC QR Code, - remove the IBAN indicated in the *Bank Account* field, - under the *Other Info* tab of the invoice. - -.. seealso:: - * :doc:`../../bank/setup/bank_accounts` - * `Odoo Academy: QR Code on Invoices for European Customers `_ diff --git a/content/applications/finance/accounting/receivables/customer_invoices/epc_qr_code/epc_qr_code01.png b/content/applications/finance/accounting/receivables/customer_invoices/epc_qr_code/epc_qr_code01.png deleted file mode 100644 index e2f5552ceb..0000000000 Binary files a/content/applications/finance/accounting/receivables/customer_invoices/epc_qr_code/epc_qr_code01.png and /dev/null differ diff --git a/content/applications/finance/accounting/receivables/customer_invoices/epc_qr_code/epc_qr_code02.png b/content/applications/finance/accounting/receivables/customer_invoices/epc_qr_code/epc_qr_code02.png deleted file mode 100644 index 788aa21206..0000000000 Binary files a/content/applications/finance/accounting/receivables/customer_invoices/epc_qr_code/epc_qr_code02.png and /dev/null differ diff --git a/content/applications/finance/accounting/receivables/customer_invoices/epc_qr_code/epc_qr_code03.png b/content/applications/finance/accounting/receivables/customer_invoices/epc_qr_code/epc_qr_code03.png deleted file mode 100644 index e41e16ee89..0000000000 Binary files a/content/applications/finance/accounting/receivables/customer_invoices/epc_qr_code/epc_qr_code03.png and /dev/null differ diff --git a/content/applications/finance/accounting/receivables/customer_invoices/payment_terms.rst b/content/applications/finance/accounting/receivables/customer_invoices/payment_terms.rst deleted file mode 100644 index 6131eb5a90..0000000000 --- a/content/applications/finance/accounting/receivables/customer_invoices/payment_terms.rst +++ /dev/null @@ -1,121 +0,0 @@ -=================================== -Payment terms and installment plans -=================================== - -**Payment Terms** specify all the conditions under which a sale is paid, mostly to ensure customers -pay their invoices correctly and on time. - -Payment Terms can be applied to sales orders, customer invoices, supplier bills, and contacts. These -conditions cover: - -- The due date -- Some discounts -- Any other condition on the payment - -Defining Payment Terms automatically calculates the payments' due dates. This is particularly -helpful for managing installment plans. - -An **installment plan** allows the customers to pay an invoice in parts, with the amounts and -payment dates defined beforehand by the seller. - -**Examples of Payment Terms:** - -- | **Immediate Payment** - | The full payment is due on the day of the invoice's issuance. -- | **15 Days** (or **Net 15**) - | The full payment is due 15 days after the invoice date. -- | **21 MFI** - | The full payment is due by the 21st of the month following the invoice date. -- | **2% 10, Net 30 EOM** - | 2% :doc:`cash discount ` if the payment is received within ten days. Otherwise, - the full payment is due at the end of the month following the invoice date. - -.. note:: - Payment terms are not to be confused with down payment invoices. If, for a specific order, you - issue several invoices to your customer, that is neither a payment term nor an installment plan, - but an invoicing policy. - -.. note:: - This document is about the *Payment Terms* feature, not *Terms & Conditions*. - -.. seealso:: - - :doc:`cash_discounts` - - `Odoo Tutorials: Payment Terms `_ - -Configuration -============= - -Go to :menuselection:`Accounting --> Configuration --> Payment Terms` and click on *Create*. - -The **Description on the Invoice** is the text displayed on the document (sale order, invoice, -etc.). - -In the **Terms** section, you can add a set of rules, called *terms*, to define what needs to be -paid and by which due date. - -To add a term, click on *Add a line*, and define its *Type*, *Value*, and *Due Date Computation*. - -.. important:: - - Terms are computed in the order they are set up. - - The **balance** should always be used for the last line. - -In the following example, 30% is due on the day of issuance, and the balance is due at the end of -the following month. - -.. image:: payment_terms/configuration.png - :align: center - :alt: Example of Payment Terms. The last line is the balance due on the 31st of the following - month. - -Using Payment Terms -=================== - -Payment Terms can be defined in the **Due Date** field, with the **Terms** drop-down list, on: - -- | **Quotations** - | To set specific payment terms automatically on all invoices generated from a quotation. -- | **Customer Invoices** - | To set specific payment terms on an invoice. -- | **Vendor Bills** - | To set specific payment terms on a bill. This is mostly useful when you need to manage vendor - terms with several installments. Otherwise, setting the *Due Date* is enough. - -.. tip:: - You can also define a **Due Date** manually. If Payment Terms are already defined, empty the - field so you can select a date. - -Payment Terms can be defined with the **Payment Terms** field on: - -- | **Contacts** - | To set specific payment terms automatically on new sales orders, invoices, and bills of a - contact. This can be modified in the contact’s *Form View*, under the *Sales & Purchase* tab. - -Journal Entries -=============== - -Invoices with specific Payment Terms generate different *Journal Entries*, with one *Journal Item* -for every computed *Due Date*. - -This makes for easier *Follow-ups* and *Reconciliation* since Odoo takes each due date into account, -rather than just the balance due date. It also helps to get an accurate *Aged Receivable report*. - -.. image:: payment_terms/journal-entry.png - :align: center - :alt: The amount debited on the Account Receivable is split into two Journal Items with distinct - Due Dates - -In this example, an invoice of $1000 has been issued with the following payment terms: *30% is due -on the day of issuance, and the balance is due at the end of the following month.* - -+----------------------+-------------+---------+---------+ -| Account | Due date | Debit | Credit | -+======================+=============+=========+=========+ -| Account Receivable | February 21 | 300 | | -+----------------------+-------------+---------+---------+ -| Account Receivable | March 31 | 700 | | -+----------------------+-------------+---------+---------+ -| Product Sales | | | 1000 | -+----------------------+-------------+---------+---------+ - -The $1000 debited on the Account Receivable is split into two distinct *Journal Items*. Both of -them have their own **Due Date**. diff --git a/content/applications/finance/accounting/receivables/customer_invoices/payment_terms/configuration.png b/content/applications/finance/accounting/receivables/customer_invoices/payment_terms/configuration.png deleted file mode 100644 index 4cbb63c3dd..0000000000 Binary files a/content/applications/finance/accounting/receivables/customer_invoices/payment_terms/configuration.png and /dev/null differ diff --git a/content/applications/finance/accounting/receivables/customer_invoices/payment_terms/journal-entry.png b/content/applications/finance/accounting/receivables/customer_invoices/payment_terms/journal-entry.png deleted file mode 100644 index e47143fc0b..0000000000 Binary files a/content/applications/finance/accounting/receivables/customer_invoices/payment_terms/journal-entry.png and /dev/null differ diff --git a/content/applications/finance/accounting/receivables/customer_payments.rst b/content/applications/finance/accounting/receivables/customer_payments.rst deleted file mode 100644 index 9517f3dc69..0000000000 --- a/content/applications/finance/accounting/receivables/customer_payments.rst +++ /dev/null @@ -1,15 +0,0 @@ -:nosearch: - -================= -Customer payments -================= - -.. toctree:: - :titlesonly: - - customer_payments/recording - customer_payments/online_payment - customer_payments/check - customer_payments/batch - customer_payments/batch_sdd - customer_payments/followup diff --git a/content/applications/finance/accounting/receivables/customer_payments/check.rst b/content/applications/finance/accounting/receivables/customer_payments/check.rst deleted file mode 100644 index beafef4c4e..0000000000 --- a/content/applications/finance/accounting/receivables/customer_payments/check.rst +++ /dev/null @@ -1,151 +0,0 @@ -==================================== -Register customer payments by checks -==================================== - -There are two ways to handle payments received by checks. Odoo support -both approaches so that you can use the one that better fits your -habits. - -1. **Undeposited Funds:** - once you receive the check, you record a payment - by check on the invoice. (using a Check journal and posted on the - Undeposited Fund account) Then, once the check arrives in your - bank account, move money from Undeposited Funds to your bank - account. - -2. **One journal entry only:** - once your receive the check, you record a - payment on your bank, paid by check, without going through the - **Undeposited Funds**. Once you process your bank statement, you do - the matching with your bank feed and the check payment, without - creating a dedicated journal entry. - -We recommend the first approach as it is more accurate (your bank -account balance is accurate, taking into accounts checks that have not -been cashed yet). Both approaches require the same effort. - -Even if the first method is cleaner, Odoo support the second approach -because some accountants are used to it (quickbooks and peachtree -users). - -.. Note:: - You may have a look at the *Deposit Ticket feature* if you deposit - several checks to your bank accounts in batch. - -Option 1: Undeposited Funds -=========================== - -Configuration -------------- - -- Create a journal **Checks** - -- Set **Undeposited Checks** as a default credit/debit account - -- Set the bank account related to this journal as **Allow Reconciliation** - -From check payments to bank statements --------------------------------------- - -The first way to handle checks is to create a check journal. Thus, -checks become a payment method in itself and you will record two -transactions. - -Once you receive a customer check, go to the related invoice and click -on **Register Payment**. Fill in the information about the payment: - -- Payment method: Check Journal (that you configured with the debit and - credit default accounts as **Undeposited Funds**) - -- Memo: write the Check number - -.. image:: check/check02.png - :align: center - -This operation will produce the following journal entry: - -+----------------------+-------------------+----------+----------+ -| Account | Statement Match | Debit | Credit | -+======================+===================+==========+==========+ -| Account Receivable | | | 100.00 | -+----------------------+-------------------+----------+----------+ -| Undeposited Funds | | 100.00 | | -+----------------------+-------------------+----------+----------+ - -The invoice is marked as paid as soon as you record the check. - -Then, once you get the bank statements, you will match this statement -with the check that is in Undeposited Funds. - -+---------------------+-------------------+----------+----------+ -| Account | Statement Match | Debit | Credit | -+=====================+===================+==========+==========+ -| Undeposited Funds | X | | 100.00 | -+---------------------+-------------------+----------+----------+ -| Bank | | 100.00 | | -+---------------------+-------------------+----------+----------+ - - -If you use this approach to manage received checks, you get the list of -checks that have not been cashed in the **Undeposit Funds** account -(accessible, for example, from the general ledger). - -.. Note:: - Both methods will produce the same data in your accounting at the - end of the process. But, if you have checks that have not been cashed, - this one is cleaner because those checks have not been reported yet on - your bank account. - -Option 2: One journal entry only -================================ - -Configuration -------------- - -These is nothing to configure if you plan to manage your checks using -this method. - -From check payments to bank statements --------------------------------------- - -Once you receive a customer check, go to the related invoice and click -on **Register Payment**. Fill in the information about the payment: - -- **Payment method:** the bank that will be used for the deposit - -- Memo: write the check number - -.. image:: check/check03.png - :align: center - -The invoice is marked as paid as soon as you record the check. - -Once you will receive the bank statements, you will do the matching with -the statement and this actual payment. (technically: point this payment -and relate it to the statement line) - -With this approach, you will get the following journal entry in your -books: - -+----------------------+-------------------+----------+----------+ -| Account | Statement Match | Debit | Credit | -+======================+===================+==========+==========+ -| Account Receivable | X | | 100.00 | -+----------------------+-------------------+----------+----------+ -| Bank | | 100.00 | | -+----------------------+-------------------+----------+----------+ - -.. tip:: - You may also record the payment directly without going on the - customer invoice, using the menu :menuselection:`Sales --> Payments`. This method may - be more convenient if you have a lot of checks to record in a batch but - you will have to reconcile entries afterwards (matching payments with - invoices) - -If you use this approach to manage received checks, you can use the -report **Bank Reconciliation Report** to verify which checks have been -received or paid by the bank. (this report is available from the **More** -option from the Accounting dashboard on the related bank account). - -.. image:: check/check01.png - :align: center diff --git a/content/applications/finance/accounting/receivables/customer_payments/check/check01.png b/content/applications/finance/accounting/receivables/customer_payments/check/check01.png deleted file mode 100644 index f2ff0cf0dd..0000000000 Binary files a/content/applications/finance/accounting/receivables/customer_payments/check/check01.png and /dev/null differ diff --git a/content/applications/finance/accounting/receivables/customer_payments/check/check02.png b/content/applications/finance/accounting/receivables/customer_payments/check/check02.png deleted file mode 100644 index ea8e69a245..0000000000 Binary files a/content/applications/finance/accounting/receivables/customer_payments/check/check02.png and /dev/null differ diff --git a/content/applications/finance/accounting/receivables/customer_payments/check/check03.png b/content/applications/finance/accounting/receivables/customer_payments/check/check03.png deleted file mode 100644 index ecc9f48fb7..0000000000 Binary files a/content/applications/finance/accounting/receivables/customer_payments/check/check03.png and /dev/null differ diff --git a/content/applications/finance/accounting/receivables/customer_payments/followup.rst b/content/applications/finance/accounting/receivables/customer_payments/followup.rst deleted file mode 100644 index 6a706bb790..0000000000 --- a/content/applications/finance/accounting/receivables/customer_payments/followup.rst +++ /dev/null @@ -1,80 +0,0 @@ -===================== -Follow-up on invoices -===================== - -A follow-up message can be sent to customers when a payment is overdue. Odoo helps you identify late -payments and allows you to schedule and send the appropriate reminders, using **follow-up actions** -that trigger automatically one or more actions according to the number of overdue days. You can send -your follow-ups via different means such as email, post, or SMS. - -.. seealso:: - - `Odoo Tutorials: Payment Follow-up `_ - -Configuration -============= - -To configure a :guilabel:`Follow-Up Action`, go to :menuselection:`Accounting --> Configuration --> -Follow-up Levels`. Several follow-up actions are available by default, and you can customize them -any way you want or create new ones to trigger the following actions: - -- Send an email; -- :ref:`Send an SMS message `; -- Print a letter; -- :ref:`Send a letter `; -- Manual action (creates a task). - -It is also possible to automatically send a reminder by enabling the :guilabel:`Auto Execute` -option, within a specific :guilabel:`Follow-Up Action`. - -.. tip:: - To send a reminder before the actual due date is reached, set a negative number of due days. - -Follow-up reports -================= - -The overdue invoices you need to follow up on are available in :menuselection:`Accounting --> -Customers --> Follow-up Reports`. From there, you can identify all the customers that have late -unpaid invoices. - -When you open a customer, you see all their unpaid invoices (overdue or not). The due dates of the -late invoices appear in red. Select the invoices that are not late yet in the :guilabel:`Excluded` -column to exclude them from the reminder you send. - -It is up to you to decide how to remind your customer. You can select :guilabel:`Print Letter`, -:guilabel:`Send By Email`, :guilabel:`Send By Post`, :guilabel:`Send By SMS`. Then, click on -:guilabel:`Done` to view the next follow-up that needs your attention. - -.. note:: - - The contact information available on the invoice or on the contact form is used to send the - reminder. - - When the reminder is sent, it is documented in the chatter of the invoice. - - If it is not the right time for a reminder, you can specify the :guilabel:`Next Reminder Date` - and click on :guilabel:`Remind me later`. You will get the next report according to the next - reminder date set on the statement. - -.. tip:: - Reconcile your bank statements right before launching your follow-up process to avoid sending a - reminder to a customer that has already paid you. - -Debtor's trust level --------------------- - -To know whether a customer usually pays late or not, you can set a trust level by marking them as -:guilabel:`Good Debtor`, :guilabel:`Normal Debtor`, or :guilabel:`Bad Debtor` on their follow-up -report. To do so, click on the bullet next to the customer's name and select a trust level. - -.. image:: followup/debtors-trust-level.png - :align: center - :alt: Set debtor's trust level - -Send reminders in batches -------------------------- - -You can send reminder emails in batches from the :guilabel:`Follow-up Reports` page. To do so, -select all the reports you would like to process, click on the :guilabel:`Action` gear icon, and -select :guilabel:`Process follow-ups`. - -.. seealso:: - - :doc:`../../../../general/in_app_purchase` - - :doc:`../../../../marketing/sms_marketing/pricing/pricing_and_faq` - - :doc:`../customer_invoices/snailmail` diff --git a/content/applications/finance/accounting/reporting.rst b/content/applications/finance/accounting/reporting.rst index 1a83f5ea28..a25a3f5c67 100644 --- a/content/applications/finance/accounting/reporting.rst +++ b/content/applications/finance/accounting/reporting.rst @@ -1,12 +1,164 @@ -:nosearch: +:show-content: ========= Reporting ========= +Main reports available +====================== + +Besides the reports created specifically in each localisation module, a +few very useful **generic** and **dynamic reports** are available for all +countries : + +- **Balance Sheet** +- **Profit and Loss** +- **Executive Summary** +- **General Ledger** +- **Aged Payable** +- **Aged Receivable** +- **Cash Flow Statement** +- **Tax Report** +- **Bank Reconciliation** + +You can annotate every reports to print them and report to your adviser. +Export to xls to manage extra analysis. Drill down in the reports to see +more details (payments, invoices, journal items, etc.). + +You can also compare values with another period. Choose how many periods +you want to compare the chosen time period with. You can choose up to 12 +periods back from the date of the report if you don't want to use the +default **Previous 1 Period** option. + +.. _reporting/balance-sheet: + +Balance Sheet +------------- + +The **Balance Sheet** shows a snapshot of the assets, liabilities and equity +of your organisation as at a particular date. + +.. image:: reporting/main_reports09.png + +Profit and Loss +--------------- + +The **Profit and Loss** report (or **Income Statement**) shows your +organisation's net income, by deducting expenses from revenue for the +report period. + +.. image:: reporting/main_reports10.png + +Executive Summary +----------------- + +The **Executive Summary** allows for a quick look at all the important +figures you need to run your company. + +In very basic terms, this is what each of the items in this section is +reporting : + +- **Performance:** + - **Gross profit margin:** + The contribution each individual sale made + by your business less any direct costs needed to make those sales + (things like labour, materials, etc). + - **Net profit margin:** + The contribution each individual sale made by + your business less any direct costs needed to make those sales, + as well as any fixed overheads your company has (things like + rent, electricity, taxes you need to pay as a result of those + sales). + - **Return on investment (p.a.):** + The ratio of net profit made, to the + amount of assets the company used to make those profits. +- **Position:** + - **Average debtor days:** + The average number of days it takes your + customers to pay you (fully), across all your customer invoices. + - **Average creditor days:** + The average number of days it takes you to + pay your suppliers (fully) across all your bills. + - **Short term cash forecast:** + How much cash is expected in or out of + your organisation in the next month i.e. balance of your **Sales + account** for the month less the balance of your **Purchases account** + for the month. + - **Current assets to liabilities:** + Also referred to as **current ratio**, this is the ratio + of current assets (assets that could be + turned into cash within a year) to the current liabilities + (liabilities which will be due in the next year). This is + typically used as as a measure of a company's ability to service + its debt. + +.. image:: reporting/main_reports01.png + +General Ledger +-------------- + +The **General Ledger Report** shows all transactions from all accounts for a +chosen date range. The initial summary report shows the totals for each +account and from there you can view a detailed transaction report or any +exceptions. This report is useful for checking every transaction that +occurred during a certain period of time. + +.. image:: reporting/main_reports05.png + +.. _reporting/aged-payable: + +Aged Payable +------------ + +Run the **Aged Payable Details** report to display information on individual +bills, credit notes and overpayments owed by you, and how long these +have gone unpaid. + +.. image:: reporting/main_reports02.png + +.. _reporting/aged-receivable: + +Aged Receivable +--------------- + +The **Aged Receivables** report shows the sales invoices that were awaiting +payment during a selected month and several months prior. + +.. image:: reporting/main_reports07.png + +Cash Flow Statement +------------------- + +The **Cash Flow Statement** shows how changes in balance sheet accounts and +income affect cash and cash equivalents, and breaks the analysis down to +operating, investing and financing activities. + +.. image:: reporting/main_reports03.png + +.. _reporting/tax-report: + +Tax Report +---------- + +This report allows you to see the **net** and **tax amounts** for all the taxes +grouped by type (sale/purchase). + +.. image:: reporting/main_reports04.png + +Bank Reconciliation +------------------- + +.. image:: reporting/main_reports06.png + .. toctree:: :titlesonly: - reporting/overview - reporting/declarations + reporting/tax_returns + reporting/tax_carryover + reporting/analytic_accounting + reporting/budget + reporting/intrastat + reporting/data_inalterability reporting/silverfin + reporting/customize + reporting/year_end diff --git a/content/applications/finance/accounting/others/analytic_accounting.rst b/content/applications/finance/accounting/reporting/analytic_accounting.rst similarity index 99% rename from content/applications/finance/accounting/others/analytic_accounting.rst rename to content/applications/finance/accounting/reporting/analytic_accounting.rst index 286d9da577..c9a229e106 100644 --- a/content/applications/finance/accounting/others/analytic_accounting.rst +++ b/content/applications/finance/accounting/reporting/analytic_accounting.rst @@ -30,7 +30,7 @@ and fill in the required information: analytic account will be used; - :guilabel:`Currency`: select the currency of the analytic account; -Then, fill in your :doc:`budget ` information. +Then, fill in your :doc:`budget ` information. .. _analytic_accounting/analytic_plans: diff --git a/content/applications/finance/accounting/others/analytic_accounting/analytic_distribution.png b/content/applications/finance/accounting/reporting/analytic_accounting/analytic_distribution.png similarity index 100% rename from content/applications/finance/accounting/others/analytic_accounting/analytic_distribution.png rename to content/applications/finance/accounting/reporting/analytic_accounting/analytic_distribution.png diff --git a/content/applications/finance/accounting/others/analytic_accounting/analytic_plans.png b/content/applications/finance/accounting/reporting/analytic_accounting/analytic_plans.png similarity index 100% rename from content/applications/finance/accounting/others/analytic_accounting/analytic_plans.png rename to content/applications/finance/accounting/reporting/analytic_accounting/analytic_plans.png diff --git a/content/applications/finance/accounting/others/adviser/budget.rst b/content/applications/finance/accounting/reporting/budget.rst similarity index 100% rename from content/applications/finance/accounting/others/adviser/budget.rst rename to content/applications/finance/accounting/reporting/budget.rst diff --git a/content/applications/finance/accounting/others/adviser/budget/analytic-accounts.png b/content/applications/finance/accounting/reporting/budget/analytic-accounts.png similarity index 100% rename from content/applications/finance/accounting/others/adviser/budget/analytic-accounts.png rename to content/applications/finance/accounting/reporting/budget/analytic-accounts.png diff --git a/content/applications/finance/accounting/others/adviser/budget/define-the-budget.png b/content/applications/finance/accounting/reporting/budget/define-the-budget.png similarity index 100% rename from content/applications/finance/accounting/others/adviser/budget/define-the-budget.png rename to content/applications/finance/accounting/reporting/budget/define-the-budget.png diff --git a/content/applications/finance/accounting/others/adviser/budget/smith-and-co-expenses.png b/content/applications/finance/accounting/reporting/budget/smith-and-co-expenses.png similarity index 100% rename from content/applications/finance/accounting/others/adviser/budget/smith-and-co-expenses.png rename to content/applications/finance/accounting/reporting/budget/smith-and-co-expenses.png diff --git a/content/applications/finance/accounting/others/adviser/budget/smith-and-co-revenue.png b/content/applications/finance/accounting/reporting/budget/smith-and-co-revenue.png similarity index 100% rename from content/applications/finance/accounting/others/adviser/budget/smith-and-co-revenue.png rename to content/applications/finance/accounting/reporting/budget/smith-and-co-revenue.png diff --git a/content/applications/finance/accounting/reporting/overview/customize.rst b/content/applications/finance/accounting/reporting/customize.rst similarity index 94% rename from content/applications/finance/accounting/reporting/overview/customize.rst rename to content/applications/finance/accounting/reporting/customize.rst index dbb2450d88..7ae55885b8 100644 --- a/content/applications/finance/accounting/reporting/overview/customize.rst +++ b/content/applications/finance/accounting/reporting/customize.rst @@ -1,6 +1,6 @@ -======================================== -Create a report with customized formulas -======================================== +============== +Custom reports +============== Odoo comes with a powerful and easy-to-use reporting framework. The engine allows you to create new reports, such as **tax reports**, or **balance sheets** and **income statements** with **specific @@ -160,6 +160,16 @@ expression's **label** (ex. **code.label**). The value of the arithmetic expression will be returned only if it is strictly between the provided bounds. Otherwise, it will be brought back to the closest bound. +`if_other_expr_above(LINE_CODE.EXPRESSION_LABEL, CUR(amount))` + The value of the arithmetic expression will be returned only if the value of the expression + denoted by the provided line code and expression label is greater than the provided bound. + Otherwise, the result will be `0`. + +`if_other_expr_below(LINE_CODE.EXPRESSION_LABEL, CUR(amount))` + The value of the arithmetic expression will be returned only if the value of the expression + denoted by the provided line code and expression label is lower than the provided bound. + Otherwise, the result will be `0`. + `CUR` is the currency code in capital letters, and `amount` is the amount of the bound expressed in that currency. diff --git a/content/applications/finance/accounting/reporting/overview/customize/engine-accounting-reports.png b/content/applications/finance/accounting/reporting/customize/engine-accounting-reports.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/customize/engine-accounting-reports.png rename to content/applications/finance/accounting/reporting/customize/engine-accounting-reports.png diff --git a/content/applications/finance/accounting/reporting/overview/customize/engine-columns.png b/content/applications/finance/accounting/reporting/customize/engine-columns.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/customize/engine-columns.png rename to content/applications/finance/accounting/reporting/customize/engine-columns.png diff --git a/content/applications/finance/accounting/reporting/overview/customize/engine-create-menu-item.png b/content/applications/finance/accounting/reporting/customize/engine-create-menu-item.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/customize/engine-create-menu-item.png rename to content/applications/finance/accounting/reporting/customize/engine-create-menu-item.png diff --git a/content/applications/finance/accounting/reporting/overview/customize/engine-expressions.png b/content/applications/finance/accounting/reporting/customize/engine-expressions.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/customize/engine-expressions.png rename to content/applications/finance/accounting/reporting/customize/engine-expressions.png diff --git a/content/applications/finance/accounting/reporting/overview/customize/engine-lines-options.png b/content/applications/finance/accounting/reporting/customize/engine-lines-options.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/customize/engine-lines-options.png rename to content/applications/finance/accounting/reporting/customize/engine-lines-options.png diff --git a/content/applications/finance/accounting/reporting/overview/customize/engine-variant.png b/content/applications/finance/accounting/reporting/customize/engine-variant.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/customize/engine-variant.png rename to content/applications/finance/accounting/reporting/customize/engine-variant.png diff --git a/content/applications/finance/accounting/reporting/overview/data_inalterability.rst b/content/applications/finance/accounting/reporting/data_inalterability.rst similarity index 100% rename from content/applications/finance/accounting/reporting/overview/data_inalterability.rst rename to content/applications/finance/accounting/reporting/data_inalterability.rst diff --git a/content/applications/finance/accounting/reporting/overview/data_inalterability/data-consistency-check.png b/content/applications/finance/accounting/reporting/data_inalterability/data-consistency-check.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/data_inalterability/data-consistency-check.png rename to content/applications/finance/accounting/reporting/data_inalterability/data-consistency-check.png diff --git a/content/applications/finance/accounting/reporting/overview/data_inalterability/journal-overview.png b/content/applications/finance/accounting/reporting/data_inalterability/journal-overview.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/data_inalterability/journal-overview.png rename to content/applications/finance/accounting/reporting/data_inalterability/journal-overview.png diff --git a/content/applications/finance/accounting/reporting/declarations.rst b/content/applications/finance/accounting/reporting/declarations.rst deleted file mode 100644 index d9073d2c41..0000000000 --- a/content/applications/finance/accounting/reporting/declarations.rst +++ /dev/null @@ -1,11 +0,0 @@ -:nosearch: - -============ -Declarations -============ - -.. toctree:: - :titlesonly: - - declarations/tax_returns - declarations/intrastat diff --git a/content/applications/finance/accounting/reporting/declarations/intrastat.rst b/content/applications/finance/accounting/reporting/intrastat.rst similarity index 85% rename from content/applications/finance/accounting/reporting/declarations/intrastat.rst rename to content/applications/finance/accounting/reporting/intrastat.rst index 18f3f8058b..6d3ede38c7 100644 --- a/content/applications/finance/accounting/reporting/declarations/intrastat.rst +++ b/content/applications/finance/accounting/reporting/intrastat.rst @@ -29,11 +29,6 @@ Enable the Intrastat report by going to :menuselection:`Accounting --> Configura Under the :guilabel:`Customer Invoices` section, tick :guilabel:`Intrastat` and then :guilabel:`Save`. -.. important:: - If your Odoo database was created before **January 13, 2022**, first :ref:`upgrade - ` the `account_intrastat` module to add the new transaction codes and - :ref:`install ` the `account_intrastat_expiry` module to archive the old codes. - .. _intrastat/default-transaction-codes: Default transaction codes: invoice and refund @@ -44,16 +39,6 @@ invoice and refund transactions. Under :menuselection:`Accounting --> Configurat select a :guilabel:`Default invoice transaction code` and/or a :guilabel:`Default refund transaction code` and then :guilabel:`Save`. The code will be set automatically on all respective invoice lines. -.. _intrastat/default-incoterm: - -Default Incoterm rule ---------------------- - -You can set a default :ref:`Incoterm rule ` to automatically populate the -Incoterm field on all newly created invoices and bills. Under :menuselection:`Accounting --> -Configuration --> Settings`, select the company's :guilabel:`Default Incoterm` and then -:guilabel:`Save`. - .. _intrastat/region-code: Region code @@ -143,22 +128,6 @@ to select a transaction code. `National Bank of Belgium - Intrastat: Nature of transactions from January 2022 `_ -.. _intrastat/incoterm: - -Incoterm rule -------------- - -Incoterms are 11 internationally recognized rules defining the responsibilities of sellers and -buyers, specifying who is responsible for paying and managing the shipment, insurance, -documentation, customs clearance, and other logistical activities. A :ref:`default Incoterm -` can be set for all invoices and bills. - -To set the Incoterm manually, create an invoice or a bill, click the :guilabel:`Other Info` tab, and -select the :guilabel:`Incoterm`. - -.. seealso:: - `Wikipedia: Incoterms `_ - .. _intrastat/partner-country: Partner country @@ -223,7 +192,7 @@ Each report line refers to a single invoice line and contains the following info - :ref:`Origin Country `; - :ref:`Partner VAT `; - :ref:`Transport Code `; -- :ref:`Incoterm Code `; +- :doc:`Incoterm Code <../customer_invoices/incoterms>`; - :ref:`Weight `; - :ref:`Supplementary Units `; and - :ref:`Value `, which is always expressed in euros even if the original invoice or diff --git a/content/applications/finance/accounting/reporting/declarations/intrastat/intrastat-column.png b/content/applications/finance/accounting/reporting/intrastat/intrastat-column.png similarity index 100% rename from content/applications/finance/accounting/reporting/declarations/intrastat/intrastat-column.png rename to content/applications/finance/accounting/reporting/intrastat/intrastat-column.png diff --git a/content/applications/finance/accounting/reporting/declarations/intrastat/warehouse-region.png b/content/applications/finance/accounting/reporting/intrastat/warehouse-region.png similarity index 100% rename from content/applications/finance/accounting/reporting/declarations/intrastat/warehouse-region.png rename to content/applications/finance/accounting/reporting/intrastat/warehouse-region.png diff --git a/content/applications/finance/accounting/reporting/overview/main_reports/main_reports01.png b/content/applications/finance/accounting/reporting/main_reports01.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/main_reports/main_reports01.png rename to content/applications/finance/accounting/reporting/main_reports01.png diff --git a/content/applications/finance/accounting/reporting/overview/main_reports/main_reports02.png b/content/applications/finance/accounting/reporting/main_reports02.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/main_reports/main_reports02.png rename to content/applications/finance/accounting/reporting/main_reports02.png diff --git a/content/applications/finance/accounting/reporting/overview/main_reports/main_reports03.png b/content/applications/finance/accounting/reporting/main_reports03.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/main_reports/main_reports03.png rename to content/applications/finance/accounting/reporting/main_reports03.png diff --git a/content/applications/finance/accounting/reporting/overview/main_reports/main_reports04.png b/content/applications/finance/accounting/reporting/main_reports04.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/main_reports/main_reports04.png rename to content/applications/finance/accounting/reporting/main_reports04.png diff --git a/content/applications/finance/accounting/reporting/overview/main_reports/main_reports05.png b/content/applications/finance/accounting/reporting/main_reports05.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/main_reports/main_reports05.png rename to content/applications/finance/accounting/reporting/main_reports05.png diff --git a/content/applications/finance/accounting/reporting/overview/main_reports/main_reports06.png b/content/applications/finance/accounting/reporting/main_reports06.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/main_reports/main_reports06.png rename to content/applications/finance/accounting/reporting/main_reports06.png diff --git a/content/applications/finance/accounting/reporting/overview/main_reports/main_reports07.png b/content/applications/finance/accounting/reporting/main_reports07.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/main_reports/main_reports07.png rename to content/applications/finance/accounting/reporting/main_reports07.png diff --git a/content/applications/finance/accounting/reporting/overview/main_reports/main_reports09.png b/content/applications/finance/accounting/reporting/main_reports09.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/main_reports/main_reports09.png rename to content/applications/finance/accounting/reporting/main_reports09.png diff --git a/content/applications/finance/accounting/reporting/overview/main_reports/main_reports10.png b/content/applications/finance/accounting/reporting/main_reports10.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/main_reports/main_reports10.png rename to content/applications/finance/accounting/reporting/main_reports10.png diff --git a/content/applications/finance/accounting/reporting/overview.rst b/content/applications/finance/accounting/reporting/overview.rst deleted file mode 100644 index edfb4fe95e..0000000000 --- a/content/applications/finance/accounting/reporting/overview.rst +++ /dev/null @@ -1,13 +0,0 @@ -:nosearch: - -======== -Overview -======== - -.. toctree:: - :titlesonly: - - overview/main_reports - overview/customize - overview/data_inalterability - overview/tax_carryover diff --git a/content/applications/finance/accounting/reporting/overview/main_reports.rst b/content/applications/finance/accounting/reporting/overview/main_reports.rst deleted file mode 100644 index 9565a06501..0000000000 --- a/content/applications/finance/accounting/reporting/overview/main_reports.rst +++ /dev/null @@ -1,147 +0,0 @@ -====================== -Main reports available -====================== - -Besides the reports created specifically in each localisation module, a -few very useful **generic** and **dynamic reports** are available for all -countries : - -- **Balance Sheet** -- **Profit and Loss** -- **Executive Summary** -- **General Ledger** -- **Aged Payable** -- **Aged Receivable** -- **Cash Flow Statement** -- **Tax Report** -- **Bank Reconciliation** - -You can annotate every reports to print them and report to your adviser. -Export to xls to manage extra analysis. Drill down in the reports to see -more details (payments, invoices, journal items, etc.). - -You can also compare values with another period. Choose how many periods -you want to compare the chosen time period with. You can choose up to 12 -periods back from the date of the report if you don't want to use the -default **Previous 1 Period** option. - -Balance Sheet -------------- - -The **Balance Sheet** shows a snapshot of the assets, liabilities and equity -of your organisation as at a particular date. - -.. image:: main_reports/main_reports09.png - :align: center - -Profit and Loss ---------------- - -The **Profit and Loss** report (or **Income Statement**) shows your -organisation's net income, by deducting expenses from revenue for the -report period. - -.. image:: main_reports/main_reports10.png - :align: center - -Executive Summary ------------------ - -The **Executive Summary** allows for a quick look at all the important -figures you need to run your company. - -In very basic terms, this is what each of the items in this section is -reporting : - -- **Performance:** - - **Gross profit margin:** - The contribution each individual sale made - by your business less any direct costs needed to make those sales - (things like labour, materials, etc). - - **Net profit margin:** - The contribution each individual sale made by - your business less any direct costs needed to make those sales, - as well as any fixed overheads your company has (things like - rent, electricity, taxes you need to pay as a result of those - sales). - - **Return on investment (p.a.):** - The ratio of net profit made, to the - amount of assets the company used to make those profits. -- **Position:** - - **Average debtor days:** - The average number of days it takes your - customers to pay you (fully), across all your customer invoices. - - **Average creditor days:** - The average number of days it takes you to - pay your suppliers (fully) across all your bills. - - **Short term cash forecast:** - How much cash is expected in or out of - your organisation in the next month i.e. balance of your **Sales - account** for the month less the balance of your **Purchases account** - for the month. - - **Current assets to liabilities:** - Also referred to as **current ratio**, this is the ratio - of current assets (assets that could be - turned into cash within a year) to the current liabilities - (liabilities which will be due in the next year). This is - typically used as as a measure of a company's ability to service - its debt. - -.. image:: main_reports/main_reports01.png - :align: center - -General Ledger --------------- - -The **General Ledger Report** shows all transactions from all accounts for a -chosen date range. The initial summary report shows the totals for each -account and from there you can view a detailed transaction report or any -exceptions. This report is useful for checking every transaction that -occurred during a certain period of time. - -.. image:: main_reports/main_reports05.png - :align: center - -Aged Payable ------------- - -Run the **Aged Payable Details** report to display information on individual -bills, credit notes and overpayments owed by you, and how long these -have gone unpaid. - -.. image:: main_reports/main_reports02.png - :align: center - -Aged Receivable ---------------- - -The **Aged Receivables** report shows the sales invoices that were awaiting -payment during a selected month and several months prior. - -.. image:: main_reports/main_reports07.png - :align: center - -Cash Flow Statement -------------------- - -The **Cash Flow Statement** shows how changes in balance sheet accounts and -income affect cash and cash equivalents, and breaks the analysis down to -operating, investing and financing activities. - -.. image:: main_reports/main_reports03.png - :align: center - -Tax Report ----------- - -This report allows you to see the **net** and **tax amounts** for all the taxes -grouped by type (sale/purchase). - -.. image:: main_reports/main_reports04.png - :align: center - -Bank Reconciliation -------------------- - -.. image:: main_reports/main_reports06.png - :align: center diff --git a/content/applications/finance/accounting/reporting/overview/tax_carryover.rst b/content/applications/finance/accounting/reporting/tax_carryover.rst similarity index 100% rename from content/applications/finance/accounting/reporting/overview/tax_carryover.rst rename to content/applications/finance/accounting/reporting/tax_carryover.rst diff --git a/content/applications/finance/accounting/reporting/overview/tax_carryover/belgian-example.png b/content/applications/finance/accounting/reporting/tax_carryover/belgian-example.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/tax_carryover/belgian-example.png rename to content/applications/finance/accounting/reporting/tax_carryover/belgian-example.png diff --git a/content/applications/finance/accounting/reporting/overview/tax_carryover/pop-up.png b/content/applications/finance/accounting/reporting/tax_carryover/pop-up.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/tax_carryover/pop-up.png rename to content/applications/finance/accounting/reporting/tax_carryover/pop-up.png diff --git a/content/applications/finance/accounting/reporting/overview/tax_carryover/tax-return.png b/content/applications/finance/accounting/reporting/tax_carryover/tax-return.png similarity index 100% rename from content/applications/finance/accounting/reporting/overview/tax_carryover/tax-return.png rename to content/applications/finance/accounting/reporting/tax_carryover/tax-return.png diff --git a/content/applications/finance/accounting/reporting/declarations/tax_returns.rst b/content/applications/finance/accounting/reporting/tax_returns.rst similarity index 96% rename from content/applications/finance/accounting/reporting/declarations/tax_returns.rst rename to content/applications/finance/accounting/reporting/tax_returns.rst index bc35c41fca..3c723ac451 100644 --- a/content/applications/finance/accounting/reporting/declarations/tax_returns.rst +++ b/content/applications/finance/accounting/reporting/tax_returns.rst @@ -40,8 +40,7 @@ To do so, go to :menuselection:`Accounting --> Configuration --> Settings`. Unde :alt: Configure how often tax returns have to be made in Odoo Accounting .. note:: - This is usually configured during the :doc:`app's initial set up - <../../getting_started/initial_configuration/setup>`. + This is usually configured during the :doc:`app's initial set up <../get_started>`. .. _tax-returns/tax-grids: @@ -119,6 +118,6 @@ report to the tax authorities, along with the amount you have to pay or be refun date manually before, as described above. .. seealso:: - * :doc:`../../taxation/taxes/taxes` - * :doc:`../../getting_started/initial_configuration/setup` - * :doc:`../../../fiscal_localizations` + * :doc:`../taxes` + * :doc:`../get_started` + * :doc:`../../fiscal_localizations` diff --git a/content/applications/finance/accounting/reporting/declarations/tax_returns/tax_return_grids.png b/content/applications/finance/accounting/reporting/tax_returns/tax_return_grids.png similarity index 100% rename from content/applications/finance/accounting/reporting/declarations/tax_returns/tax_return_grids.png rename to content/applications/finance/accounting/reporting/tax_returns/tax_return_grids.png diff --git a/content/applications/finance/accounting/reporting/declarations/tax_returns/tax_return_lock.png b/content/applications/finance/accounting/reporting/tax_returns/tax_return_lock.png similarity index 100% rename from content/applications/finance/accounting/reporting/declarations/tax_returns/tax_return_lock.png rename to content/applications/finance/accounting/reporting/tax_returns/tax_return_lock.png diff --git a/content/applications/finance/accounting/reporting/declarations/tax_returns/tax_return_periodicity.png b/content/applications/finance/accounting/reporting/tax_returns/tax_return_periodicity.png similarity index 100% rename from content/applications/finance/accounting/reporting/declarations/tax_returns/tax_return_periodicity.png rename to content/applications/finance/accounting/reporting/tax_returns/tax_return_periodicity.png diff --git a/content/applications/finance/accounting/reporting/declarations/tax_returns/tax_return_report.png b/content/applications/finance/accounting/reporting/tax_returns/tax_return_report.png similarity index 100% rename from content/applications/finance/accounting/reporting/declarations/tax_returns/tax_return_report.png rename to content/applications/finance/accounting/reporting/tax_returns/tax_return_report.png diff --git a/content/applications/finance/accounting/reporting/declarations/tax_returns/tax_return_taxes.png b/content/applications/finance/accounting/reporting/tax_returns/tax_return_taxes.png similarity index 100% rename from content/applications/finance/accounting/reporting/declarations/tax_returns/tax_return_taxes.png rename to content/applications/finance/accounting/reporting/tax_returns/tax_return_taxes.png diff --git a/content/applications/finance/accounting/reporting/year_end.rst b/content/applications/finance/accounting/reporting/year_end.rst new file mode 100644 index 0000000000..2eccb8c60e --- /dev/null +++ b/content/applications/finance/accounting/reporting/year_end.rst @@ -0,0 +1,112 @@ +================ +Year-end closing +================ + +Year-end closing is vital for maintaining financial accuracy, complying with regulations, making +informed decisions, and ensuring transparency in reporting. + +.. _year-end/fiscal-years: + +Fiscal years +============ + +By default, the fiscal year is set to last 12 months and end on December 31st. However, its duration +and end date can vary due to cultural, administrative, and economic considerations. + +To modify these values, go to :menuselection:`Accounting --> Configuration --> Settings`. Under the +:guilabel:`Fiscal Periods` section, change the :guilabel:`Last Day` field if necessary. + +If the period lasts *more* than or *less* than 12 months, enable :guilabel:`Fiscal Years` and +:guilabel:`Save`. Go back to the :guilabel:`Fiscal Periods` section and click :guilabel:`➜ Fiscal +Years`. From there, click :guilabel:`Create`, give it a :guilabel:`Name`, and both a +:guilabel:`Start Date` and :guilabel:`End Date`. + +.. note:: + Once the set fiscal period is over, Odoo automatically reverts to the default periodicity, taking + into account the value specified in the :guilabel:`Last Day` field. + +.. _year-end/checklist: + +Year-end checklist +================== + +Before closure +-------------- + +Before closing a fiscal year, ensure first everything is accurate and up-to-date: + +- Make sure all bank accounts are fully :doc:`reconciled <../bank/reconciliation>` up to year-end, + and confirm that the ending book balances match the bank statement balances. +- Verify that all :doc:`customer invoices <../customer_invoices>` have been entered and + approved and that there are no draft invoices. +- Confirm that all :doc:`vendor bills <../vendor_bills>` have been entered and agreed upon. +- Validate all :doc:`expenses <../../expenses>`, ensuring their accuracy. +- Corroborate that all :doc:`received payments <../payments>` have been encoded and recorded + accurately. +- Close all :ref:`suspense accounts `. +- Book all :doc:`depreciation <../vendor_bills/assets>` and :doc:`deferred revenue + <../customer_invoices/deferred_revenues>` entries. + +Closing a fiscal year +--------------------- + +Then, to close the fiscal year: + +- Run a :ref:`tax report `, and verify that all tax information is correct. +- Reconcile all accounts on the :ref:`balance sheet `: + + - Update the bank balances in Odoo according to the actual balances found on the bank statements. + - Reconcile all transactions in the cash and bank accounts by running the :ref:`aged receivables + ` and :ref:`aged payables ` reports. + - Audit all accounts, being sure to fully understand all transactions and their nature, making + sure to include loans and fixed assets. + - Optionally, run :ref:`payments matching ` to validate any open vendor bills + and customer invoices with their payments. While this step is optional, it could assist the + year-end closing process if all outstanding payments and invoices are reconciled, potentially + finding errors or mistakes in the system. + +Next, the accountant likely verifies balance sheet items and book entries for: + + - year-end manual adjustments, + - work in progress, + - depreciation journal entries, + - loans, + - tax adjustments, + - etc. + +If the accountant is going through the year-end audit, they may want to have paper copies of all +balance sheet items (such as loans, bank accounts, prepayments, sales tax statements, etc.) to +compare these with the balances in Odoo. + +.. tip:: + During this process, it is good practice to set a :guilabel:`Journal Entries Lock Date` to the + last day (inclusive) of the preceding fiscal year by going to :menuselection:`Accounting --> + Accounting --> Lock Dates`. This way, the accountant can be confident that nobody changes the + transactions while auditing the books. Users from the *accountant* access group can still create + and modify entries. + +Current year's earnings +~~~~~~~~~~~~~~~~~~~~~~~ + +Odoo uses a unique account type called **current year's earnings** to display the amount difference +between the **income** and **expenses** accounts. + +.. note:: + The chart of accounts can only contain one account of this type. By default, it is a 999999 + account named :guilabel:`Undistributed Profits/Losses`. + +To allocate the current year's earnings, create a miscellaneous entry to book them to any equity +account. Once done, confirm whether or not the current year's earnings in the **balance sheet** is +correctly reporting a balance of zero. If that is the case, set an :guilabel:`All Users Lock Date` +to the last day of the fiscal year by going to :menuselection:`Accounting --> Accounting --> Lock +Dates`. + +.. warning:: + Setting an :guilabel:`All Users Lock Date` is **irreversible** and cannot be removed. + +.. note:: + A specific year-end closing entry is **optional** in order to close out the **profit and loss + statement**. The reports are created in real-time, meaning that the profit and loss statement + corresponds directly with the year-end date specified in Odoo. Therefore, any time the **income + statement** is generated, the beginning date corresponds with the beginning of the **fiscal + year** and all account balances should equal zero. diff --git a/content/applications/finance/accounting/taxation.rst b/content/applications/finance/accounting/taxation.rst deleted file mode 100644 index 7226512418..0000000000 --- a/content/applications/finance/accounting/taxation.rst +++ /dev/null @@ -1,11 +0,0 @@ -:nosearch: - -======== -Taxation -======== - -.. toctree:: - :titlesonly: - - taxation/taxes - taxation/fiscal_year diff --git a/content/applications/finance/accounting/taxation/fiscal_year.rst b/content/applications/finance/accounting/taxation/fiscal_year.rst deleted file mode 100644 index ee28c71d4c..0000000000 --- a/content/applications/finance/accounting/taxation/fiscal_year.rst +++ /dev/null @@ -1,11 +0,0 @@ -:nosearch: - -=========== -Fiscal year -=========== - -.. toctree:: - :titlesonly: - - fiscal_year/fiscal_year - fiscal_year/close_fiscal_year diff --git a/content/applications/finance/accounting/taxation/fiscal_year/close_fiscal_year.rst b/content/applications/finance/accounting/taxation/fiscal_year/close_fiscal_year.rst deleted file mode 100644 index 4f1178e20a..0000000000 --- a/content/applications/finance/accounting/taxation/fiscal_year/close_fiscal_year.rst +++ /dev/null @@ -1,93 +0,0 @@ -=========================================== -Do a year end in Odoo (close a fiscal year) -=========================================== - -Before going ahead with closing a fiscal year, there are a few steps one -should typically take to ensure that your accounting is correct, up to -date, and accurate: - -- Make sure you have fully reconciled your **bank account(s)** up to - year end and confirm that your ending book balances agree with - your bank statement balances. - -- Verify that all **customer invoices** have been entered and approved. - -- Confirm that you have entered and agreed all **vendor bills**. - -- Validate all **expenses**, ensuring their accuracy. - -- Corroborate that all **received payments** have been entered and - recorded accurately. - -Year-end checklist -================== - -- Run a **Tax report**, and verify that your tax information is correct. - -- Reconcile all accounts on your **Balance Sheet**: - - - Agree your bank balances in Odoo against your actual bank balances - on your statements. Utilize the **Bank Reconciliation** report to - assist with this. - - - Reconcile all transactions in your cash and bank accounts by - running your **Aged Receivables** and **Aged Payables** reports. - - - Audit your accounts, being sure to fully understand the - transactions affecting them and the nature of the - transactions, making sure to include loans and fixed assets. - -- Run the optional **Payments Matching** feature, under the **More** - dropdown on the dashboard, validating any open **Vendor Bills** and - **Customer Invoices** with their payments. This step is optional, - however it may assist the year-end process if all outstanding - payments and invoices are reconciled, and could lead finding - errors or mistakes in the system. - -- Your accountant/bookkeeper will likely verify your balance sheet - items and book entries for: - - - Year-end manual adjustments, using the **Adviser Journal Entries** - menu (For example, the **Current Year Earnings** and **Retained - Earnings** reports). - - - **Work in Progress**. - - - **Depreciation Journal Entries**. - - - **Loans**. - - - **Tax adjustments**. - -If your accountant/bookkeeper is going through end of the year auditing, -they may want to have paper copies of all balance sheet items (such as -loans, bank accounts, prepayments, sales tax statements, etc...) to -agree these against your Odoo balances. - -During this process, it is good practice to set the **Lock date for -Non-Advisers** to the last day of the preceding financial year, which is -set under the accounting configuration. This way, the accountant can be -confident that nobody is changing the previous year transactions -while auditing the books. - -.. image:: close_fiscal_year/close_fiscal_year01.png - :align: center - -Closing the fiscal year -======================= - -In Odoo there is no need to do a specific year end closing entry in order to -close out income statement accounts. The reports are created in -real-time, meaning that the **Income statement** corresponds directly with -the year-end date you specify in Odoo. Therefore, any time you generate -the **Income Statement**, the beginning date will correspond with the -beginning of the **Fiscal Year** and the account balances will all be 0. - -Once the accountant/bookkeeper has created the journal entry to allocate -the **Current Year Earnings**, you should set the **Lock Date** to the last day -of the fiscal year. Making sure that before doing so, you confirm -whether or not the current year earnings in the **Balance Sheet** is -correctly reporting a 0 balance. - -.. seealso:: - * :doc:`fiscal_year` diff --git a/content/applications/finance/accounting/taxation/fiscal_year/close_fiscal_year/close_fiscal_year01.png b/content/applications/finance/accounting/taxation/fiscal_year/close_fiscal_year/close_fiscal_year01.png deleted file mode 100644 index b9cd47c6ed..0000000000 Binary files a/content/applications/finance/accounting/taxation/fiscal_year/close_fiscal_year/close_fiscal_year01.png and /dev/null differ diff --git a/content/applications/finance/accounting/taxation/fiscal_year/fiscal_year.rst b/content/applications/finance/accounting/taxation/fiscal_year/fiscal_year.rst deleted file mode 100644 index d9429b0c7f..0000000000 --- a/content/applications/finance/accounting/taxation/fiscal_year/fiscal_year.rst +++ /dev/null @@ -1,34 +0,0 @@ -=================== -Manage Fiscal Years -=================== - -In most cases, the fiscal years last 12 months. If it is your case, you -just have to define what is the last day of your fiscal year in the -accounting settings. By default, it is set on the 31st December. - -.. image:: fiscal_year/fiscal_year01.png - :align: center - -However, there might be some exceptions. For example, if it is the first -fiscal year of your business, it could last more or less than 12 months. -In this case, some additional configuration is required. - -Go in :menuselection:`accounting --> configuration --> settings` and activate -the fiscal years. - -.. image:: fiscal_year/fiscal_year02.png - :align: center - -You can then configure your fiscal years in -:menuselection:`accounting --> configuration --> fiscal years`. - -.. image:: fiscal_year/fiscal_year03.png - :align: center - -.. note:: - You only have to create fiscal years if they last more or less - than 12 months. - -.. seealso:: - - * :doc:`close_fiscal_year` diff --git a/content/applications/finance/accounting/taxation/fiscal_year/fiscal_year/fiscal_year01.png b/content/applications/finance/accounting/taxation/fiscal_year/fiscal_year/fiscal_year01.png deleted file mode 100644 index 7def9ae808..0000000000 Binary files a/content/applications/finance/accounting/taxation/fiscal_year/fiscal_year/fiscal_year01.png and /dev/null differ diff --git a/content/applications/finance/accounting/taxation/fiscal_year/fiscal_year/fiscal_year02.png b/content/applications/finance/accounting/taxation/fiscal_year/fiscal_year/fiscal_year02.png deleted file mode 100644 index 977323dacc..0000000000 Binary files a/content/applications/finance/accounting/taxation/fiscal_year/fiscal_year/fiscal_year02.png and /dev/null differ diff --git a/content/applications/finance/accounting/taxation/fiscal_year/fiscal_year/fiscal_year03.png b/content/applications/finance/accounting/taxation/fiscal_year/fiscal_year/fiscal_year03.png deleted file mode 100644 index 42915917af..0000000000 Binary files a/content/applications/finance/accounting/taxation/fiscal_year/fiscal_year/fiscal_year03.png and /dev/null differ diff --git a/content/applications/finance/accounting/taxation/taxes.rst b/content/applications/finance/accounting/taxation/taxes.rst deleted file mode 100644 index 465ef2092a..0000000000 --- a/content/applications/finance/accounting/taxation/taxes.rst +++ /dev/null @@ -1,19 +0,0 @@ -:nosearch: - -===== -Taxes -===== - -.. toctree:: - :titlesonly: - - taxes/taxes - taxes/default_taxes - taxes/fiscal_positions - taxes/eu_distance_selling - taxes/avatax - taxes/taxcloud - taxes/retention - taxes/B2B_B2C - taxes/cash_basis_taxes - taxes/vat_validation diff --git a/content/applications/finance/accounting/taxation/taxes/default_taxes.rst b/content/applications/finance/accounting/taxation/taxes/default_taxes.rst deleted file mode 100644 index fc38f58a35..0000000000 --- a/content/applications/finance/accounting/taxation/taxes/default_taxes.rst +++ /dev/null @@ -1,40 +0,0 @@ -============= -Default taxes -============= - -**Default Taxes** define which :doc:`taxes ` are automatically selected when there is no -other indication about which tax to use. For example, Odoo prefills the **Taxes** field with the -Default Taxes when you create a new product or add a new line on an invoice. - -.. image:: default_taxes/default-taxes-invoice-line.png - :align: center - :alt: Odoo fills out the Tax field automatically according to the Default Taxes - -.. important:: - :doc:`Fiscal Positions ` take the Default Tax into account. Therefore, if a - Fiscal Position is applied to an invoice, Odoo applies the related tax instead of the Default - Taxes, as mapped in the Fiscal Position. - -Configuration -============= - -**Default Taxes** are automatically set up according to the country selected at the creation of your -database, or when you set up a :ref:`fiscal localization package ` -for your company. - -To change your **Default Taxes**, go to :menuselection:`Accounting --> Configuration --> Settings ---> Taxes --> Default Taxes`, select the appropriate taxes for your default **Sales Tax** and -**Purchase Tax**, and click on *Save*. - -.. image:: default_taxes/default-taxes-configuration.png - :align: center - :alt: Define which taxes to use by default on Odoo - -.. note:: - Databases with multiple companies: the Default Taxes values are company-specific. - -.. seealso:: - - - :doc:`taxes` - - :doc:`fiscal_positions` - - :doc:`../../../fiscal_localizations` diff --git a/content/applications/finance/accounting/taxation/taxes/default_taxes/default-taxes-configuration.png b/content/applications/finance/accounting/taxation/taxes/default_taxes/default-taxes-configuration.png deleted file mode 100644 index bfb5076be0..0000000000 Binary files a/content/applications/finance/accounting/taxation/taxes/default_taxes/default-taxes-configuration.png and /dev/null differ diff --git a/content/applications/finance/accounting/taxation/taxes/default_taxes/default-taxes-invoice-line.png b/content/applications/finance/accounting/taxation/taxes/default_taxes/default-taxes-invoice-line.png deleted file mode 100644 index 904f085aa5..0000000000 Binary files a/content/applications/finance/accounting/taxation/taxes/default_taxes/default-taxes-invoice-line.png and /dev/null differ diff --git a/content/applications/finance/accounting/taxation/taxes/eu_distance_selling.rst b/content/applications/finance/accounting/taxation/taxes/eu_distance_selling.rst deleted file mode 100644 index b5ccf86890..0000000000 --- a/content/applications/finance/accounting/taxation/taxes/eu_distance_selling.rst +++ /dev/null @@ -1,69 +0,0 @@ -=================================== -EU intra-community distance selling -=================================== - -**Distance sales within the European Union** include cross-border sales of goods and services to a -private consumer (B2C) in another EU Member State when the seller doesn't meet face-to-face with the -customer. Organizations must ensure that the VAT on distance sales is paid to the Member State in -which the goods or services are delivered. - -.. note:: - This remains true even if your organization is located outside of the European Union. - -While this regulation mainly applies to :doc:`eCommerce <../../../../websites/ecommerce>` sales to -private EU consumers, it is also valid for mail order sales and telesales. - -The Union **One-Stop Shop (OSS)** is an online portal where businesses can register for the OSS and -declare their intra-community distance sales. Each EU member state integrates an online OSS portal. - -The **EU intra-community Distance Selling** feature helps your organization comply with this -regulation by creating and configuring new :doc:`fiscal positions ` and -:doc:`taxes ` based on your company's country. - -.. seealso:: - - `European Commission: OSS | Taxation and Customs Union - `_ - -.. _eu_distance_selling/configuration: - -Configuration -============= - -Go to :menuselection:`Accounting/Invoicing --> Settings --> Taxes`, then enable **EU intra-community -Distance Selling** (or **EU Digital Goods VAT** if you created your database before July 1, 2021), -and *Save*. - -.. image:: eu_distance_selling/enable-feature.png - :align: center - :alt: EU intra-community Distance Selling feature in Odoo Accounting settings - -.. important:: - Please :ref:`upgrade the module ` `l10n_eu_service` if you already installed it - before **July 1, 2021**, or if you activated the feature **EU Digital Goods VAT** in the - Accounting settings. Then, make sure to :ref:`refresh the tax mapping - `. - -.. _eu_distance_selling/taxes: - -Fiscal Positions and Taxes -========================== - -Once enabled, the feature automatically creates all the necessary taxes and fiscal positions needed -for each EU member state, based on your company's country. - -We highly recommend checking that the proposed mapping is suitable for the products and services you -sell before using it. - -.. _eu_distance_selling/refresh-mapping: - -Refresh tax mapping -------------------- - -Whenever you add or modify taxes, you can update automatically your fiscal positions. - -To do so, go to :menuselection:`Accounting/Invoicing --> Settings --> Taxes --> EU intra-community -Distance Selling` and click on the *Refresh tax mapping* button. - -.. seealso:: - - :doc:`fiscal_positions` - - :doc:`taxes` diff --git a/content/applications/finance/accounting/taxation/taxes/eu_distance_selling/enable-feature.png b/content/applications/finance/accounting/taxation/taxes/eu_distance_selling/enable-feature.png deleted file mode 100644 index 11cbd17d1c..0000000000 Binary files a/content/applications/finance/accounting/taxation/taxes/eu_distance_selling/enable-feature.png and /dev/null differ diff --git a/content/applications/finance/accounting/taxation/taxes/fiscal_positions.rst b/content/applications/finance/accounting/taxation/taxes/fiscal_positions.rst deleted file mode 100644 index 54e34d785d..0000000000 --- a/content/applications/finance/accounting/taxation/taxes/fiscal_positions.rst +++ /dev/null @@ -1,113 +0,0 @@ -========================================== -Fiscal positions (tax and account mapping) -========================================== - -Default taxes and accounts are set on products and customers to create new transactions on the fly. -However, you might have to use different taxes and record the transactions on different accounts, -according to your customers' and providers' localizations and business types. - -**Fiscal Positions** allow you to create *sets of rules* to automatically adapt the taxes and the -accounts used for a transaction. - -.. image:: fiscal_positions/fiscal-positions-intra-community.png - :align: center - :alt: Example: Belgian to Intra-Community tax mapping with Fiscal Positions in Odoo Accounting - -They can be applied in various ways: - -- :ref:`automatically applied, based on some rules ` -- :ref:`manually applied on a transaction ` -- :ref:`assigned to a partner, on its contact form ` - -.. note:: - A few Fiscal Positions are already preconfigured on your database, as part of your :ref:`fiscal - localization package `. - -Configuration -============= - - .. _fiscal_positions/mapping: - -Tax and Account Mapping ------------------------ - -To edit or create a Fiscal Position, go to :menuselection:`Accounting --> Configuration --> Fiscal -Positions`, and open the entry you want to modify or click on *Create*. - -The mapping of taxes and accounts is based on the default taxes and accounts defined in the -products' forms. - -- To map to another tax or account, fill out the right column (**Tax to Apply**/**Account to Use - Instead**). -- To remove a tax, rather than replacing it with another, leave the field **Tax to Apply** empty. -- To replace a tax with multiple other taxes, add multiple lines with the same **Tax on Product**. - -.. note:: - The mapping only works with *active* taxes. Therefore, make sure they are active by going to - :menuselection:`Accounting --> Configuration --> Taxes`. - -.. _fiscal_positions/automatic: - -Automatic application ---------------------- - -You can configure your Fiscal Positions to be applied automatically, following a set of conditions. - -To do so, open the Fiscal Position you want to modify and click on **Detect Automatically**. You can -configure a few conditions: - -- **VAT Required**: The VAT number *must* be indicated in the customer's contact form. -- **Country Group** / **Country**: The Fiscal Position is applied to these countries. - -.. image:: fiscal_positions/fiscal-positions-automatic.png - :align: center - :alt: Example of settings to apply a Fiscal Position automatically - -.. note:: - Taxes on **eCommerce orders** are automatically updated once the visitor has logged in or filled - out their billing details. - -.. important:: - The Fiscal Positions' **sequence** - the order in which they are arranged - defines which - Fiscal Position to apply if the conditions are met in multiple Fiscal Positions. - - For example, if the first Fiscal Position targets *country A*, and the second Fiscal Position - targets a *Country Group* that also comprises *country A*, only the first Fiscal Position will be - applied to customers from *country A*. - -.. _fiscal_positions/application: - -Application -=========== - -.. _fiscal_positions/partner: - -Assign a Fiscal Position to a partner -------------------------------------- - -You can manually define which Fiscal Position must be used by default for a specific partner. - -To do so, open the partner's contact form, go to the **Sales & Purchase** tab, edit the **Fiscal -Position** field, and click on *Save*. - -.. image:: fiscal_positions/fiscal-positions-partner.png - :align: center - :alt: Selection of a Fiscal Position on a Sales Order / Invoice / Bill in Odoo Accounting - -.. _fiscal_positions/transaction: - -Choose Fiscal Positions manually on Sales Orders, Invoices, and Bills ---------------------------------------------------------------------- - -To manually select which Fiscal Position to use for a new Sales Order, Invoice, or Bill, go to the -**Other Info** tab and select the right **Fiscal Position** *before* adding product lines. - -.. image:: fiscal_positions/fiscal-positions-transaction.png - :align: center - :alt: Selection of a Fiscal Position on a Sales Order / Invoice / Bill in Odoo Accounting - -.. seealso:: - - * :doc:`taxes` - * :doc:`taxcloud` - * :doc:`B2B_B2C` diff --git a/content/applications/finance/accounting/taxation/taxes/fiscal_positions/fiscal-positions-automatic.png b/content/applications/finance/accounting/taxation/taxes/fiscal_positions/fiscal-positions-automatic.png deleted file mode 100644 index 95ae975b99..0000000000 Binary files a/content/applications/finance/accounting/taxation/taxes/fiscal_positions/fiscal-positions-automatic.png and /dev/null differ diff --git a/content/applications/finance/accounting/taxation/taxes/fiscal_positions/fiscal-positions-intra-community.png b/content/applications/finance/accounting/taxation/taxes/fiscal_positions/fiscal-positions-intra-community.png deleted file mode 100644 index c0ccf0ee50..0000000000 Binary files a/content/applications/finance/accounting/taxation/taxes/fiscal_positions/fiscal-positions-intra-community.png and /dev/null differ diff --git a/content/applications/finance/accounting/taxation/taxes/fiscal_positions/fiscal-positions-partner.png b/content/applications/finance/accounting/taxation/taxes/fiscal_positions/fiscal-positions-partner.png deleted file mode 100644 index a4db2967d7..0000000000 Binary files a/content/applications/finance/accounting/taxation/taxes/fiscal_positions/fiscal-positions-partner.png and /dev/null differ diff --git a/content/applications/finance/accounting/taxation/taxes/fiscal_positions/fiscal-positions-transaction.png b/content/applications/finance/accounting/taxation/taxes/fiscal_positions/fiscal-positions-transaction.png deleted file mode 100644 index 1668f50140..0000000000 Binary files a/content/applications/finance/accounting/taxation/taxes/fiscal_positions/fiscal-positions-transaction.png and /dev/null differ diff --git a/content/applications/finance/accounting/taxation/taxes/vat_validation.rst b/content/applications/finance/accounting/taxation/taxes/vat_validation.rst deleted file mode 100644 index ee67a008b9..0000000000 --- a/content/applications/finance/accounting/taxation/taxes/vat_validation.rst +++ /dev/null @@ -1,43 +0,0 @@ -=========================== -VIES VAT numbers validation -=========================== - -**VAT Information Exchange System** - abbreviated **VIES** - is a tool provided by the European -Commission that allows you to check the validity of VAT numbers of companies registered in the -European Union. - -Odoo provides a feature to **Verify VAT Numbers** when you save a contact. This helps you make sure -that your contacts provided you with a valid VAT number without leaving Odoo interface. - -Configuration -============= - -To enable this feature, go to :menuselection:`Accounting --> Configuration --> Settings --> Taxes`, -enable the **Verify VAT Numbers** feature, and click on *Save*. - -.. image:: vat_validation/vat-validation-configuration.png - :align: center - :alt: Enable "Verify VAT Numbers" in Odoo Accounting - -VAT Number validation -===================== - -Whenever you create or modify a contact, make sure to fill out the **Country** and **VAT** fields. - -.. image:: vat_validation/vat-validation-contact-form.png - :align: center - :alt: Fill out the contact form with the country and VAT number before clicking on *Save* - -When you click on *Save*, Odoo runs a VIES VAT number check, and displays an error message if the -VAT number is invalid. - -.. image:: vat_validation/vat-validation-error.png - :align: center - :alt: Odoo displays an error message instead of saving when the VAT number is invalid - -.. important:: - This tool checks the VAT number's validity but does not check the other fields' validity. - -.. seealso:: - - - `European Commission: VIES search engine `__ diff --git a/content/applications/finance/accounting/taxation/taxes/vat_validation/vat-validation-configuration.png b/content/applications/finance/accounting/taxation/taxes/vat_validation/vat-validation-configuration.png deleted file mode 100644 index dec8da4030..0000000000 Binary files a/content/applications/finance/accounting/taxation/taxes/vat_validation/vat-validation-configuration.png and /dev/null differ diff --git a/content/applications/finance/accounting/taxation/taxes/vat_validation/vat-validation-contact-form.png b/content/applications/finance/accounting/taxation/taxes/vat_validation/vat-validation-contact-form.png deleted file mode 100644 index ac9c09aaff..0000000000 Binary files a/content/applications/finance/accounting/taxation/taxes/vat_validation/vat-validation-contact-form.png and /dev/null differ diff --git a/content/applications/finance/accounting/taxation/taxes/vat_validation/vat-validation-error.png b/content/applications/finance/accounting/taxation/taxes/vat_validation/vat-validation-error.png deleted file mode 100644 index b5514a9e37..0000000000 Binary files a/content/applications/finance/accounting/taxation/taxes/vat_validation/vat-validation-error.png and /dev/null differ diff --git a/content/applications/finance/accounting/taxation/taxes/taxes.rst b/content/applications/finance/accounting/taxes.rst similarity index 83% rename from content/applications/finance/accounting/taxation/taxes/taxes.rst rename to content/applications/finance/accounting/taxes.rst index 3cf806755d..f04b62f0ea 100644 --- a/content/applications/finance/accounting/taxation/taxes/taxes.rst +++ b/content/applications/finance/accounting/taxes.rst @@ -1,3 +1,5 @@ +:show-content: + ===== Taxes ===== @@ -6,6 +8,30 @@ There are numerous types of **taxes**, and their application varies greatly, dep your company's localization. To make sure they are recorded with accuracy, Odoo's tax engine supports all kinds of uses and computations. +.. _taxes/default: + +Default taxes +============= + +**Default Taxes** define which taxes are automatically selected when creating a new product. They +are also used to prefill the :guilabel:`Taxes` field when adding a new line on an invoice in +**Accounting Firms** mode. + +.. image:: taxes/default-taxes-product.png + :alt: Odoo fills out the Tax field automatically according to the Default Taxes + +To change your **Default Taxes**, go to :menuselection:`Accounting --> Configuration --> Settings +--> Taxes --> Default Taxes`, select the appropriate taxes for your default **Sales Tax** and +**Purchase Tax**, and click on *Save*. + +.. image:: taxes/default-configuration.png + :alt: Define which taxes to use by default on Odoo + +.. note:: + **Default Taxes** are automatically set up according to the country selected at the creation of + your database, or when you set up a :ref:`fiscal localization package + ` for your company. + .. _taxes/list_activation: Activate Sales Taxes from the List view @@ -18,8 +44,7 @@ activated by default, so that you can activate only the ones relevant for your b To activate Sale Taxes, go to :menuselection:`Accounting --> Configuration --> Taxes` and use the *Activate* toggle button to activate or deactivate a tax. -.. image:: taxes/taxes-list.png - :align: center +.. image:: taxes/list.png :alt: Activate pre-configured taxes in Odoo Accounting .. _taxes/configuration: @@ -30,8 +55,7 @@ Configuration To edit or create a **Tax**, go to :menuselection:`Accounting --> Configuration --> Taxes` and open a tax or click on *Create*. -.. image:: taxes/taxes-edit.png - :align: center +.. image:: taxes/edit.png :alt: Edition of a tax in Odoo Accounting .. _taxes/labels: @@ -155,8 +179,7 @@ Definition tab Allocate with precision the amount of the taxable basis or percentages of the computed tax to multiple accounts and Tax Grids. -.. image:: taxes/taxes-definition.png - :align: center +.. image:: taxes/definition.png :alt: Allocate tax amounts to the right accounts and tax grids - **Based On**: @@ -165,7 +188,7 @@ multiple accounts and Tax Grids. - % of tax: a percentage of the computed tax. - **Account**: if defined, an additional Journal Item is recorded. -- **Tax Grids**: used to generate :doc:`Tax Reports <../../reporting/declarations/tax_returns>` +- **Tax Grids**: used to generate :doc:`Tax Reports ` automatically, according to your country's regulations. .. _taxes/advanced-tab: @@ -182,8 +205,7 @@ The label of the tax, as displayed on each invoice line in the **Taxes** column. :ref:`label ` visible to *front end* users, on exported invoices, on their Customer Portals, etc. -.. image:: taxes/taxes-invoice-label.png - :align: center +.. image:: taxes/invoice-label.png :alt: The Label on Invoices is displayed on each invoice line .. _taxes/tax-group: @@ -195,10 +217,9 @@ Select to which **Tax Group** the tax belongs. The Tax Group name is the :ref:`l ` displayed above the *Total* line on exported invoices, and the Customer Portals. Tax groups include different iterations of the same tax. This can be useful when you must record -differently the same tax according to :doc:`Fiscal Positions `. +differently the same tax according to :doc:`Fiscal Positions `. -.. image:: taxes/taxes-invoice-tax-group.png - :align: center +.. image:: taxes/invoice-tax-group.png :alt: The Tax Group name is different from the Label on Invoices In the example above, we see a 0% tax for Intra-Community customers in Europe. It records amounts on @@ -235,7 +256,7 @@ For example, a product has a Sales Price of $1000, and we apply a *10% of Price* .. note:: If you need to define prices accurately, both tax-included and tax-excluded, please refer to the - following documentation: :doc:`B2B_B2C`. + following documentation: :doc:`taxes/B2B_B2C`. .. note:: - **Invoices**: By default, the Line Subtotals displayed on your invoices are *Tax-Excluded*. To @@ -257,8 +278,7 @@ the same product. You can configure a new :ref:`Group of Taxes ` to include this tax, or add it directly to a product line. -.. image:: taxes/taxes-subsequent-line.png - :align: center +.. image:: taxes/subsequent-line.png :alt: The eco-tax is taken into the basis of the 21% VAT tax .. warning:: @@ -269,13 +289,24 @@ directly to a product line. To reorder the sequence, go to :menuselection:`Accounting --> Configuration --> Taxes`, and drag and drop the lines with the handles next to the tax names. - .. image:: taxes/taxes-list-sequence.png - :align: center + .. image:: taxes/list-sequence.png :alt: The taxes' sequence in Odoo determines which tax is applied first .. seealso:: - - :doc:`fiscal_positions` - - :doc:`B2B_B2C` - - :doc:`taxcloud` - - :doc:`../../reporting/declarations/tax_returns` + - :doc:`taxes/fiscal_positions` + - :doc:`taxes/B2B_B2C` + - :doc:`taxes/taxcloud` + - :doc:`reporting/tax_returns` + +.. toctree:: + :titlesonly: + + taxes/cash_basis + taxes/retention + taxes/vat_verification + taxes/fiscal_positions + taxes/avatax + taxes/taxcloud + taxes/eu_distance_selling + taxes/B2B_B2C diff --git a/content/applications/finance/accounting/taxation/taxes/B2B_B2C.rst b/content/applications/finance/accounting/taxes/B2B_B2C.rst similarity index 97% rename from content/applications/finance/accounting/taxation/taxes/B2B_B2C.rst rename to content/applications/finance/accounting/taxes/B2B_B2C.rst index 61cea001fb..1dfd015484 100644 --- a/content/applications/finance/accounting/taxation/taxes/B2B_B2C.rst +++ b/content/applications/finance/accounting/taxes/B2B_B2C.rst @@ -1,6 +1,6 @@ -=========================================================== -Manage prices for B2B (tax excluded) and B2C (tax included) -=========================================================== +================================================= +B2B (tax excluded) and B2C (tax included) pricing +================================================= When working with consumers, prices are usually expressed with taxes included in the price (e.g., in most eCommerce). But, when you work in a diff --git a/content/applications/finance/accounting/taxation/taxes/B2B_B2C/price_B2C_B2B01.png b/content/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B01.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/B2B_B2C/price_B2C_B2B01.png rename to content/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B01.png diff --git a/content/applications/finance/accounting/taxation/taxes/B2B_B2C/price_B2C_B2B02.png b/content/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B02.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/B2B_B2C/price_B2C_B2B02.png rename to content/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B02.png diff --git a/content/applications/finance/accounting/taxation/taxes/B2B_B2C/price_B2C_B2B03.png b/content/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B03.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/B2B_B2C/price_B2C_B2B03.png rename to content/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B03.png diff --git a/content/applications/finance/accounting/taxation/taxes/B2B_B2C/price_B2C_B2B04.png b/content/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B04.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/B2B_B2C/price_B2C_B2B04.png rename to content/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B04.png diff --git a/content/applications/finance/accounting/taxation/taxes/B2B_B2C/price_B2C_B2B05.png b/content/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B05.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/B2B_B2C/price_B2C_B2B05.png rename to content/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B05.png diff --git a/content/applications/finance/accounting/taxation/taxes/avatax.rst b/content/applications/finance/accounting/taxes/avatax.rst similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/avatax.rst rename to content/applications/finance/accounting/taxes/avatax.rst diff --git a/content/applications/finance/accounting/taxation/taxes/avatax/avatax-category.png b/content/applications/finance/accounting/taxes/avatax/avatax-category.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/avatax/avatax-category.png rename to content/applications/finance/accounting/taxes/avatax/avatax-category.png diff --git a/content/applications/finance/accounting/taxation/taxes/avatax/avatax-configuration-settings.png b/content/applications/finance/accounting/taxes/avatax/avatax-configuration-settings.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/avatax/avatax-configuration-settings.png rename to content/applications/finance/accounting/taxes/avatax/avatax-configuration-settings.png diff --git a/content/applications/finance/accounting/taxation/taxes/avatax/choose-customer-address.png b/content/applications/finance/accounting/taxes/avatax/choose-customer-address.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/avatax/choose-customer-address.png rename to content/applications/finance/accounting/taxes/avatax/choose-customer-address.png diff --git a/content/applications/finance/accounting/taxation/taxes/avatax/override-avatax-product-category.png b/content/applications/finance/accounting/taxes/avatax/override-avatax-product-category.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/avatax/override-avatax-product-category.png rename to content/applications/finance/accounting/taxes/avatax/override-avatax-product-category.png diff --git a/content/applications/finance/accounting/taxation/taxes/avatax/validate-customer-address.png b/content/applications/finance/accounting/taxes/avatax/validate-customer-address.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/avatax/validate-customer-address.png rename to content/applications/finance/accounting/taxes/avatax/validate-customer-address.png diff --git a/content/applications/finance/accounting/taxation/taxes/cash_basis_taxes.rst b/content/applications/finance/accounting/taxes/cash_basis.rst similarity index 96% rename from content/applications/finance/accounting/taxation/taxes/cash_basis_taxes.rst rename to content/applications/finance/accounting/taxes/cash_basis.rst index 5d8d982ddf..5160201a8f 100644 --- a/content/applications/finance/accounting/taxation/taxes/cash_basis_taxes.rst +++ b/content/applications/finance/accounting/taxes/cash_basis.rst @@ -20,7 +20,7 @@ Then, define the :guilabel:`Tax Cash Basis Journal`. Click on the external link journal to update its default properties such as the :guilabel:`Journal Name`, :guilabel:`Type` or :guilabel:`Short Code`. -.. image:: cash_basis_taxes/tax_cash_basis_journal.png +.. image:: cash_basis/tax_cash_basis_journal.png :align: center :alt: Select your Tax Cash Basis Journal and click on the external link @@ -35,7 +35,7 @@ clicking on it. The :guilabel:`Account` column reflects the proper transitional accounts to post taxes until the payment is registered. -.. image:: cash_basis_taxes/account_column.png +.. image:: cash_basis/account_column.png :align: center :alt: Fill in the account column with a transitional accounts where taxes go until the payment is registered @@ -45,7 +45,7 @@ In the :guilabel:`Advanced Options` tab, decide of the :guilabel:`Tax Exigilibit then also define the :guilabel:`Cash Basis Transition Account` where the tax amount is recorded as long as the original invoice has not been reconciled. -.. image:: cash_basis_taxes/advanced_options.png +.. image:: cash_basis/advanced_options.png :align: center :alt: Fill in the Cash Basis Transition Account where taxes amounts go until payment reconciliation. @@ -56,7 +56,7 @@ Impact of cash basis taxes on accounting To illustrate the impact of cash basis taxes on accounting transactions, let's take an example with the sales of a product that costs 1,000$, with a cash basis tax of 15%. -.. image:: cash_basis_taxes/customer_invoice_with_cbt.png +.. image:: cash_basis/customer_invoice_with_cbt.png :align: center :alt: diff --git a/content/applications/finance/accounting/taxation/taxes/cash_basis_taxes/account_column.png b/content/applications/finance/accounting/taxes/cash_basis/account_column.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/cash_basis_taxes/account_column.png rename to content/applications/finance/accounting/taxes/cash_basis/account_column.png diff --git a/content/applications/finance/accounting/taxation/taxes/cash_basis_taxes/advanced_options.png b/content/applications/finance/accounting/taxes/cash_basis/advanced_options.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/cash_basis_taxes/advanced_options.png rename to content/applications/finance/accounting/taxes/cash_basis/advanced_options.png diff --git a/content/applications/finance/accounting/taxation/taxes/cash_basis_taxes/customer_invoice_with_cbt.png b/content/applications/finance/accounting/taxes/cash_basis/customer_invoice_with_cbt.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/cash_basis_taxes/customer_invoice_with_cbt.png rename to content/applications/finance/accounting/taxes/cash_basis/customer_invoice_with_cbt.png diff --git a/content/applications/finance/accounting/taxation/taxes/cash_basis_taxes/tax_cash_basis_journal.png b/content/applications/finance/accounting/taxes/cash_basis/tax_cash_basis_journal.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/cash_basis_taxes/tax_cash_basis_journal.png rename to content/applications/finance/accounting/taxes/cash_basis/tax_cash_basis_journal.png diff --git a/content/applications/finance/accounting/taxes/default-configuration.png b/content/applications/finance/accounting/taxes/default-configuration.png new file mode 100644 index 0000000000..f3cfa3d340 Binary files /dev/null and b/content/applications/finance/accounting/taxes/default-configuration.png differ diff --git a/content/applications/finance/accounting/taxes/default-taxes-product.png b/content/applications/finance/accounting/taxes/default-taxes-product.png new file mode 100644 index 0000000000..a47362539b Binary files /dev/null and b/content/applications/finance/accounting/taxes/default-taxes-product.png differ diff --git a/content/applications/finance/accounting/taxation/taxes/taxes/taxes-definition.png b/content/applications/finance/accounting/taxes/definition.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/taxes/taxes-definition.png rename to content/applications/finance/accounting/taxes/definition.png diff --git a/content/applications/finance/accounting/taxation/taxes/taxes/taxes-edit.png b/content/applications/finance/accounting/taxes/edit.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/taxes/taxes-edit.png rename to content/applications/finance/accounting/taxes/edit.png diff --git a/content/applications/finance/accounting/taxes/eu_distance_selling.rst b/content/applications/finance/accounting/taxes/eu_distance_selling.rst new file mode 100644 index 0000000000..60f28fd4fd --- /dev/null +++ b/content/applications/finance/accounting/taxes/eu_distance_selling.rst @@ -0,0 +1,65 @@ +=================================== +EU intra-community distance selling +=================================== + +EU intra-community distance selling involves the cross-border trade of goods and services from +vendors registered for VAT purposes to individuals (B2C) located in a European Union member state. +The transaction is conducted remotely, typically through online platforms, mail orders, telephone, +or other means of communication. + +EU intra-community distance selling is subject to specific VAT rules and regulations. The vendor +must charge VAT per the VAT rate applicable in the buyer's country. + +.. note:: + This remains applicable even if the vendor is located outside of the European Union. + +Configuration +============= + +The **EU Intra-community Distance Selling** feature helps you comply with this regulation by +creating and configuring new **fiscal positions** and **taxes** based on your company's country. To +enable it, go to :menuselection:`Accounting --> Configuration --> Settings --> Taxes`, tick +:guilabel:`EU Intra-community Distance Selling`, and :guilabel:`Save`. + +.. image:: eu_distance_selling/enable-feature.png + :alt: EU intra-community Distance Selling feature in Odoo Accounting settings + +.. tip:: + Whenever you add or modify taxes, you can automatically update your fiscal positions. To do so, + go to :menuselection:`Accounting/Invoicing --> Settings --> Taxes --> EU Intra-community Distance + Selling` and click on the :guilabel:`Refresh tax mapping`. + +.. note:: + We highly recommend checking that the proposed mapping is suitable for the products and services + you sell before using it. + +.. seealso:: + - :doc:`../taxes` + - :doc:`../../fiscal_localizations` + - :doc:`fiscal_positions` + +One-Stop Shop (OSS) +=================== + +The :abbr:`OSS (One-Stop Shop)` system introduced by the European Union simplifies VAT collection +for **cross-border** sales of goods and services. It primarily applies to business-to-consumer +**(B2C)** cases. With the OSS, businesses can register for VAT in their home country and use a +single online portal to handle VAT obligations for their sales within the EU. There are **two +primary schemes**: the **Union OSS** scheme for cross-border services and the **Import OSS** scheme +for goods valued at or below €150. + +Reports +------- + +To generate **OSS sales** or **OSS imports** reports and submit them onto the OSS portal, go to +:menuselection:`Accounting --> Reporting --> Tax Report`, click :guilabel:`Report: Generic Tax +report`, and select either :guilabel:`OSS Sales` or :guilabel:`OSS Imports`. Once selected, click on +:guilabel:`PDF`, :guilabel:`XLSX`, or :guilabel:`XML` in the top-left corner. This generates the +currently-opened report in the selected format. Once generated, log into the platform of your +competent federal authority to submit it onto the OSS portal. + +.. image:: eu_distance_selling/oss-report.png + :alt: OSS reports view + +.. seealso:: + - `European Commission: OSS | Taxation and Customs Union `_ diff --git a/content/applications/finance/accounting/taxes/eu_distance_selling/enable-feature.png b/content/applications/finance/accounting/taxes/eu_distance_selling/enable-feature.png new file mode 100644 index 0000000000..34bec4370d Binary files /dev/null and b/content/applications/finance/accounting/taxes/eu_distance_selling/enable-feature.png differ diff --git a/content/applications/finance/accounting/taxes/eu_distance_selling/oss-report.png b/content/applications/finance/accounting/taxes/eu_distance_selling/oss-report.png new file mode 100644 index 0000000000..52618cdc48 Binary files /dev/null and b/content/applications/finance/accounting/taxes/eu_distance_selling/oss-report.png differ diff --git a/content/applications/finance/accounting/taxes/fiscal_positions.rst b/content/applications/finance/accounting/taxes/fiscal_positions.rst new file mode 100644 index 0000000000..ca254dc783 --- /dev/null +++ b/content/applications/finance/accounting/taxes/fiscal_positions.rst @@ -0,0 +1,119 @@ +========================================== +Fiscal positions (tax and account mapping) +========================================== + +Default taxes and accounts are set on products and customers to create new transactions on the fly. +However, depending on the customers' and providers' localization and business type, using different +taxes and accounts for a transaction might be necessary. + +**Fiscal positions** allow the creation of rules to adapt the taxes and accounts used for a +transaction automatically. + +They can be applied :ref:`automatically `, :ref:`manually +`, or :ref:`assigned to a partner `. + +.. note:: + Several default fiscal positions are available as part of your :ref:`fiscal localization + package `. + +Configuration +============= + + .. _fiscal_positions/mapping: + +Tax and account mapping +----------------------- + +To edit or create a fiscal position, go to :menuselection:`Accounting --> Configuration --> Fiscal +Positions`, and open the entry to modify or click on :guilabel:`New`. + +The mapping of taxes and accounts is based on the default taxes and accounts defined in the +product form. + +- To map to another tax or account, fill out the right column (:guilabel:`Tax to Apply`/ + :guilabel:`Account to Use Instead`). + +.. image:: fiscal_positions/fiscal-positions-tax-mapping.png + :align: center + :alt: Example of a fiscal position's tax mapping + +.. image:: fiscal_positions/fiscal-positions-account-mapping.png + :align: center + :alt: Example of a fiscal position's account mapping + +- To remove a tax, leave the field :guilabel:`Tax to Apply` empty. +- To replace a tax with several other taxes, add multiple lines using the same :guilabel:`Tax on + Product`. + +.. note:: + The mapping only works with *active* taxes. Therefore, make sure they are active by going to + :menuselection:`Accounting --> Configuration --> Taxes`. + +Application +=========== + +.. _fiscal_positions/automatic: + +Automatic application +--------------------- + +To automatically apply a fiscal position following a set of conditions, go to +:menuselection:`Accounting --> Configuration --> Fiscal Positions`, open the fiscal position to +modify, and tick :guilabel:`Detect Automatically`. + +From there, several conditions can be activated: + +- :guilabel:`VAT Required`: the customer's VAT number must be present on their contact form. +- :guilabel:`Country Group` and :guilabel:`Country`: the fiscal position is only applied to the + selected country or country group. + +.. image:: fiscal_positions/fiscal-positions-automatic.png + :align: center + :alt: Example of a fiscal position automatic application settings + +.. note:: + - If the :doc:`Verify VAT Numbers ` feature is enabled, any fiscal positions + with :guilabel:`VAT required` enabled will require Intra-Community valid VAT numbers to apply + automatically. + - Taxes on **eCommerce orders** are automatically updated once the customer has logged in or + filled out their billing details. + +.. important:: + The fiscal positions' **sequence** defines which fiscal position is applied if all conditions + set on multiple fiscal positions are met simultaneously. + + For example, suppose the first fiscal position in a sequence targets *country A* while the second + fiscal position targets a *country group* that comprises *country A*. In that case, only the + first fiscal position will be applied to customers from *country A*. + +.. _fiscal_positions/manual: + +Manual application +------------------ + +To manually select a fiscal position, open a sales order, invoice, or bill, go to the +:guilabel:`Other Info` tab and select the desired :guilabel:`Fiscal Position` before adding product +lines. + +.. image:: fiscal_positions/fiscal-positions-manual.png + :align: center + :alt: Selection of a fiscal position on a sales order, invoice, or bill + +.. _fiscal_positions/partner: + +Assign to a partner +------------------- + +To define which fiscal position must be used by default for a specific partner, go to +:menuselection:`Accounting --> Customers --> Customers`, select the partner, open the +:guilabel:`Sales & Purchase` tab, and select the :guilabel:`Fiscal Position`. + +.. image:: fiscal_positions/fiscal-positions-customer.png + :align: center + :alt: Selection of a fiscal position on a customer + +.. seealso:: + + * :doc:`../taxes` + * :doc:`taxcloud` + * :doc:`B2B_B2C` diff --git a/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-account-mapping.png b/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-account-mapping.png new file mode 100644 index 0000000000..8e43b8af91 Binary files /dev/null and b/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-account-mapping.png differ diff --git a/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-automatic.png b/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-automatic.png new file mode 100644 index 0000000000..e9594d36fd Binary files /dev/null and b/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-automatic.png differ diff --git a/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-customer.png b/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-customer.png new file mode 100644 index 0000000000..4ead421997 Binary files /dev/null and b/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-customer.png differ diff --git a/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-manual.png b/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-manual.png new file mode 100644 index 0000000000..507b666c97 Binary files /dev/null and b/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-manual.png differ diff --git a/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-tax-mapping.png b/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-tax-mapping.png new file mode 100644 index 0000000000..ace6efff75 Binary files /dev/null and b/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-tax-mapping.png differ diff --git a/content/applications/finance/accounting/taxation/taxes/taxes/taxes-invoice-label.png b/content/applications/finance/accounting/taxes/invoice-label.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/taxes/taxes-invoice-label.png rename to content/applications/finance/accounting/taxes/invoice-label.png diff --git a/content/applications/finance/accounting/taxation/taxes/taxes/taxes-invoice-tax-group.png b/content/applications/finance/accounting/taxes/invoice-tax-group.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/taxes/taxes-invoice-tax-group.png rename to content/applications/finance/accounting/taxes/invoice-tax-group.png diff --git a/content/applications/finance/accounting/taxation/taxes/taxes/taxes-list-sequence.png b/content/applications/finance/accounting/taxes/list-sequence.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/taxes/taxes-list-sequence.png rename to content/applications/finance/accounting/taxes/list-sequence.png diff --git a/content/applications/finance/accounting/taxation/taxes/taxes/taxes-list.png b/content/applications/finance/accounting/taxes/list.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/taxes/taxes-list.png rename to content/applications/finance/accounting/taxes/list.png diff --git a/content/applications/finance/accounting/taxation/taxes/retention.rst b/content/applications/finance/accounting/taxes/retention.rst similarity index 95% rename from content/applications/finance/accounting/taxation/taxes/retention.rst rename to content/applications/finance/accounting/taxes/retention.rst index aff03866de..cac486021b 100644 --- a/content/applications/finance/accounting/taxation/taxes/retention.rst +++ b/content/applications/finance/accounting/taxes/retention.rst @@ -1,6 +1,6 @@ -======================== -Manage withholding taxes -======================== +================= +Withholding taxes +================= A withholding tax, also called a retention tax, is a government requirement for the payer of a customer invoice to withhold or deduct @@ -67,4 +67,4 @@ The printed invoice will show the different amounts in each tax group. .. seealso:: - * :doc:`taxes` + * :doc:`../taxes` diff --git a/content/applications/finance/accounting/taxation/taxes/retention/retention01.png b/content/applications/finance/accounting/taxes/retention/retention01.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/retention/retention01.png rename to content/applications/finance/accounting/taxes/retention/retention01.png diff --git a/content/applications/finance/accounting/taxation/taxes/retention/retention02.png b/content/applications/finance/accounting/taxes/retention/retention02.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/retention/retention02.png rename to content/applications/finance/accounting/taxes/retention/retention02.png diff --git a/content/applications/finance/accounting/taxation/taxes/retention/retention03.png b/content/applications/finance/accounting/taxes/retention/retention03.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/retention/retention03.png rename to content/applications/finance/accounting/taxes/retention/retention03.png diff --git a/content/applications/finance/accounting/taxation/taxes/retention/retention04.png b/content/applications/finance/accounting/taxes/retention/retention04.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/retention/retention04.png rename to content/applications/finance/accounting/taxes/retention/retention04.png diff --git a/content/applications/finance/accounting/taxation/taxes/taxes/taxes-subsequent-line.png b/content/applications/finance/accounting/taxes/subsequent-line.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/taxes/taxes-subsequent-line.png rename to content/applications/finance/accounting/taxes/subsequent-line.png diff --git a/content/applications/finance/accounting/taxation/taxes/taxcloud.rst b/content/applications/finance/accounting/taxes/taxcloud.rst similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/taxcloud.rst rename to content/applications/finance/accounting/taxes/taxcloud.rst diff --git a/content/applications/finance/accounting/taxation/taxes/taxcloud/fiscal-position-detect.png b/content/applications/finance/accounting/taxes/taxcloud/fiscal-position-detect.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/taxcloud/fiscal-position-detect.png rename to content/applications/finance/accounting/taxes/taxcloud/fiscal-position-detect.png diff --git a/content/applications/finance/accounting/taxation/taxes/taxcloud/tax-payable-id.png b/content/applications/finance/accounting/taxes/taxcloud/tax-payable-id.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/taxcloud/tax-payable-id.png rename to content/applications/finance/accounting/taxes/taxcloud/tax-payable-id.png diff --git a/content/applications/finance/accounting/taxation/taxes/taxcloud/taxcloud-api-keys.png b/content/applications/finance/accounting/taxes/taxcloud/taxcloud-api-keys.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/taxcloud/taxcloud-api-keys.png rename to content/applications/finance/accounting/taxes/taxcloud/taxcloud-api-keys.png diff --git a/content/applications/finance/accounting/taxation/taxes/taxcloud/taxcloud-settings.png b/content/applications/finance/accounting/taxes/taxcloud/taxcloud-settings.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/taxcloud/taxcloud-settings.png rename to content/applications/finance/accounting/taxes/taxcloud/taxcloud-settings.png diff --git a/content/applications/finance/accounting/taxation/taxes/taxcloud/user-defaults-complete-configuration.png b/content/applications/finance/accounting/taxes/taxcloud/user-defaults-complete-configuration.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/taxcloud/user-defaults-complete-configuration.png rename to content/applications/finance/accounting/taxes/taxcloud/user-defaults-complete-configuration.png diff --git a/content/applications/finance/accounting/taxation/taxes/taxcloud/user-defaults-search-filters.png b/content/applications/finance/accounting/taxes/taxcloud/user-defaults-search-filters.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/taxcloud/user-defaults-search-filters.png rename to content/applications/finance/accounting/taxes/taxcloud/user-defaults-search-filters.png diff --git a/content/applications/finance/accounting/taxation/taxes/taxcloud/user-defaults-search-more.png b/content/applications/finance/accounting/taxes/taxcloud/user-defaults-search-more.png similarity index 100% rename from content/applications/finance/accounting/taxation/taxes/taxcloud/user-defaults-search-more.png rename to content/applications/finance/accounting/taxes/taxcloud/user-defaults-search-more.png diff --git a/content/applications/finance/accounting/taxes/vat_verification.rst b/content/applications/finance/accounting/taxes/vat_verification.rst new file mode 100644 index 0000000000..a15fb90ef3 --- /dev/null +++ b/content/applications/finance/accounting/taxes/vat_verification.rst @@ -0,0 +1,41 @@ +=============================== +VAT numbers verification (VIES) +=============================== + +`VAT Information Exchange System `_, or +**VIES**, is a tool provided by the European Commission that allows you to check the validity of VAT +numbers for companies registered in the European Union. + +Odoo's VAT Validation feature uses the VIES to verify your contacts' VAT numbers directly from +Odoo's interface. + +.. note:: + Regardless of whether or not the Verify VAT Numbers feature is enabled, Odoo checks the format of + a contact's VAT against the `expected format of VAT numbers + `_ from that country. + +VIES VAT number verification +============================ + +To activate this feature, go to :menuselection:`Accounting --> Configuration --> Settings`. In the +:guilabel:`Taxes` section, enable the :guilabel:`Verify VAT Numbers` feature, and click on +:guilabel:`Save`. + +Once the :guilabel:`Verify VAT Numbers` feature is enabled, if the contact's :guilabel:`Tax ID` +field is populated *and* its country is different from your company's country, Odoo displays an +:guilabel:`Intra-Community Valid` checkbox. Odoo tests the VAT number through the VIES and +automatically checks or unchecks the :guilabel:`Intra-Community Valid` checkbox depending on the +validity of the VAT number. + +.. image:: vat_verification/intra-community-valid.png + :alt: Intra-community valid checkbox on the contact record + +.. important:: + It is possible to manually override the :guilabel:`Intra-Community Valid` field on a contact in + case the automatic VIES check is incorrect (for example, if the company was recently created and + its VAT is not yet in the VIES). This change is logged in the chatter for transparency. + +.. note:: + Odoo can :ref:`automatically apply fiscal positions `. If the Verify VAT + Numbers feature is enabled, any fiscal positions with VAT required enabled will require + Intra-Community valid VAT numbers to apply automatically. diff --git a/content/applications/finance/accounting/taxes/vat_verification/intra-community-valid.png b/content/applications/finance/accounting/taxes/vat_verification/intra-community-valid.png new file mode 100644 index 0000000000..a38eaed4f1 Binary files /dev/null and b/content/applications/finance/accounting/taxes/vat_verification/intra-community-valid.png differ diff --git a/content/applications/finance/accounting/getting_started/process_overview/supplier_bill.rst b/content/applications/finance/accounting/vendor_bills.rst similarity index 89% rename from content/applications/finance/accounting/getting_started/process_overview/supplier_bill.rst rename to content/applications/finance/accounting/vendor_bills.rst index 82191220ff..ce1f2d73e9 100644 --- a/content/applications/finance/accounting/getting_started/process_overview/supplier_bill.rst +++ b/content/applications/finance/accounting/vendor_bills.rst @@ -1,6 +1,8 @@ -=========================== -From vendor bill to payment -=========================== +:show-content: + +============ +Vendor bills +============ In Odoo, we can register vendor bills **manually** or **automatically**, while the **Aged Payable report** provides an overview of all outstanding bills to help us pay the correct @@ -35,7 +37,7 @@ appropriately completed: - :guilabel:`Vendor`: Odoo automatically fills some information based on the vendor's registered information, previous purchase orders, or bills. - :guilabel:`Bill Reference`: add the sales order reference provided by the vendor and is used to do - the :ref:`matching ` when you receive the products. + the :ref:`matching ` when you receive the products. - :guilabel:`Auto-Complete`: select a past bill/purchase order to automatically complete the document. The :guilabel:`Vendor` field should be completed prior to completing this field. - :guilabel:`Bill Date`: is the issuance date of the document. @@ -44,14 +46,15 @@ appropriately completed: :guilabel:`Memo` field. - :guilabel:`Recipient Bank`: to indicate to which account number the payment has to be made. - :guilabel:`Due Date` or :guilabel:`Terms` to pay the bill. -- :guilabel:`Journal`: select in which journal the bill should be recorded and the :doc:`Currency <../../others/multi_currency>`. +- :guilabel:`Journal`: select in which journal the bill should be recorded and the :doc:`Currency + `. -.. image:: supplier_bill/bill-completion.png +.. image:: vendor_bills/bill-completion.png :align: center :alt: filling the vendor bill .. note:: - - Bills can be :doc:`digitized <../../payables/supplier_bills/invoice_digitization>` for + - Bills can be :doc:`digitized ` for automatic completion by clicking :guilabel:`Send for Digitization`. - If you upload the bill, the PDF document is displayed on the right of the screen, allowing you to easily fill in the bill information. @@ -77,7 +80,7 @@ automatically if the :guilabel:`Payment Reference` has been set correctly in the the field is empty, we recommend you select the vendor invoice number as a reference. Once confirmed, an :guilabel:`In Payment` banner appears on the bill until it is :doc:`reconciled -<../../bank/reconciliation/use_cases>`. +`. Aged payable report =================== @@ -95,3 +98,10 @@ dates, etc. - You might receive several bills for the same purchase order if your vendor is in back-order and is sending you invoices as they ship the products, or if your vendor is sending you a partial bill or asking for a deposit. + +.. toctree:: + :titlesonly: + + vendor_bills/invoice_digitization + vendor_bills/assets + vendor_bills/deferred_expenses diff --git a/content/applications/finance/accounting/payables/supplier_bills/assets.rst b/content/applications/finance/accounting/vendor_bills/assets.rst similarity index 99% rename from content/applications/finance/accounting/payables/supplier_bills/assets.rst rename to content/applications/finance/accounting/vendor_bills/assets.rst index f76425a45e..5b112978a7 100644 --- a/content/applications/finance/accounting/payables/supplier_bills/assets.rst +++ b/content/applications/finance/accounting/vendor_bills/assets.rst @@ -253,4 +253,4 @@ You have three choices for the **Automate Assets** field: fully automate its purchase. (see: :ref:`product-assets-account`). .. seealso:: - * :doc:`../../getting_started/initial_configuration/chart_of_accounts` + * :doc:`../get_started/chart_of_accounts` diff --git a/content/applications/finance/accounting/payables/supplier_bills/assets/assets01.png b/content/applications/finance/accounting/vendor_bills/assets/assets01.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/assets/assets01.png rename to content/applications/finance/accounting/vendor_bills/assets/assets01.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/assets/assets02.png b/content/applications/finance/accounting/vendor_bills/assets/assets02.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/assets/assets02.png rename to content/applications/finance/accounting/vendor_bills/assets/assets02.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/assets/assets03.png b/content/applications/finance/accounting/vendor_bills/assets/assets03.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/assets/assets03.png rename to content/applications/finance/accounting/vendor_bills/assets/assets03.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/assets/assets04.png b/content/applications/finance/accounting/vendor_bills/assets/assets04.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/assets/assets04.png rename to content/applications/finance/accounting/vendor_bills/assets/assets04.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/assets/assets05.png b/content/applications/finance/accounting/vendor_bills/assets/assets05.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/assets/assets05.png rename to content/applications/finance/accounting/vendor_bills/assets/assets05.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/assets/assets06.png b/content/applications/finance/accounting/vendor_bills/assets/assets06.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/assets/assets06.png rename to content/applications/finance/accounting/vendor_bills/assets/assets06.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/assets/assets07.png b/content/applications/finance/accounting/vendor_bills/assets/assets07.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/assets/assets07.png rename to content/applications/finance/accounting/vendor_bills/assets/assets07.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/assets/assets08.png b/content/applications/finance/accounting/vendor_bills/assets/assets08.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/assets/assets08.png rename to content/applications/finance/accounting/vendor_bills/assets/assets08.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/assets/assets09.png b/content/applications/finance/accounting/vendor_bills/assets/assets09.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/assets/assets09.png rename to content/applications/finance/accounting/vendor_bills/assets/assets09.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/assets/assets10.png b/content/applications/finance/accounting/vendor_bills/assets/assets10.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/assets/assets10.png rename to content/applications/finance/accounting/vendor_bills/assets/assets10.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/assets/assets11.png b/content/applications/finance/accounting/vendor_bills/assets/assets11.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/assets/assets11.png rename to content/applications/finance/accounting/vendor_bills/assets/assets11.png diff --git a/content/applications/finance/accounting/getting_started/process_overview/supplier_bill/bill-completion.png b/content/applications/finance/accounting/vendor_bills/bill-completion.png similarity index 100% rename from content/applications/finance/accounting/getting_started/process_overview/supplier_bill/bill-completion.png rename to content/applications/finance/accounting/vendor_bills/bill-completion.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/deferred_expenses.rst b/content/applications/finance/accounting/vendor_bills/deferred_expenses.rst similarity index 99% rename from content/applications/finance/accounting/payables/supplier_bills/deferred_expenses.rst rename to content/applications/finance/accounting/vendor_bills/deferred_expenses.rst index 44e3179261..e929250ac8 100644 --- a/content/applications/finance/accounting/payables/supplier_bills/deferred_expenses.rst +++ b/content/applications/finance/accounting/vendor_bills/deferred_expenses.rst @@ -192,4 +192,4 @@ You have three choices for the **Automate Deferred Expense** field: products`_). .. seealso:: - * :doc:`../../getting_started/initial_configuration/chart_of_accounts` + * :doc:`../get_started/chart_of_accounts` diff --git a/content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses01.png b/content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses01.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses01.png rename to content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses01.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses02.png b/content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses02.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses02.png rename to content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses02.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses03.png b/content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses03.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses03.png rename to content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses03.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses04.png b/content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses04.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses04.png rename to content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses04.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses05.png b/content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses05.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses05.png rename to content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses05.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses06.png b/content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses06.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses06.png rename to content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses06.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses07.png b/content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses07.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses07.png rename to content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses07.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses08.png b/content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses08.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses08.png rename to content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses08.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses09.png b/content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses09.png similarity index 100% rename from content/applications/finance/accounting/payables/supplier_bills/deferred_expenses/deferred_expenses09.png rename to content/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expenses09.png diff --git a/content/applications/finance/accounting/payables/supplier_bills/invoice_digitization.rst b/content/applications/finance/accounting/vendor_bills/invoice_digitization.rst similarity index 97% rename from content/applications/finance/accounting/payables/supplier_bills/invoice_digitization.rst rename to content/applications/finance/accounting/vendor_bills/invoice_digitization.rst index e67f540d53..53a879fd00 100644 --- a/content/applications/finance/accounting/payables/supplier_bills/invoice_digitization.rst +++ b/content/applications/finance/accounting/vendor_bills/invoice_digitization.rst @@ -52,7 +52,7 @@ The email alias is now available in the :guilabel:`Advanced Settings` tab of the sent to this address will be converted automatically into new invoices or bills. .. note:: - If you use the :doc:`Documents <../../../documents>` app, you can automatically send your scanned + If you use the :doc:`Documents <../../documents>` app, you can automatically send your scanned invoices to the :guilabel:`Finance` workspace (e.g., `inbox-financial@example.odoo.com`). The default email aliases `vendor-bills@` and `customer-invoices@` followed by the diff --git a/content/applications/finance/documents.rst b/content/applications/finance/documents.rst index b5fc07c061..c88d0091b8 100644 --- a/content/applications/finance/documents.rst +++ b/content/applications/finance/documents.rst @@ -209,4 +209,4 @@ digitize, click on :guilabel:`Create Bill`, :guilabel:`Create Customer Invoice` :guilabel:`Create credit note`, and then click on :guilabel:`Send for Digitization`. .. seealso:: - :doc:`AI-powered document digitization <../finance/accounting/payables/supplier_bills/invoice_digitization>` + :doc:`AI-powered document digitization <../finance/accounting/vendor_bills/invoice_digitization>` diff --git a/content/applications/finance/expenses.rst b/content/applications/finance/expenses.rst index 3ec32cca78..1521cce080 100644 --- a/content/applications/finance/expenses.rst +++ b/content/applications/finance/expenses.rst @@ -4,231 +4,651 @@ Expenses ======== -**Odoo Expenses** streamlines the management of expenses. Employees can submit their expenses; -managers can approve them; accountants can record them and process the payments. +Odoo **Expenses** streamlines the management of expenses. After an employee submits their expenses +in Odoo, the expenses are reviewed by management and accounting teams. Once approved, payments can +then be processed and disbursed back to the employee for reimbursement(s). .. seealso:: - - `Odoo Expenses: product page `_ + `Odoo Expenses: product page `_ -How to set expense types -======================== +Set expense categories +====================== -The first step to track expenses is to configure the expense types (managed as products in Odoo) -that your company allows, from the *Configuration* menu. -When a specific expense is reimbursed at a fixed price, set a cost on the product. -Otherwise keep the cost at 0.0 and employees will report the real cost per expense. +The first step to track expenses is to configure the different types of expenses for the company +(managed as *expense categories* in Odoo). Each category can be as specific or generalized as +needed. Go to :menuselection:`Expenses app --> Configuration --> Expense Categories` to view the +current expensable categories in a default list view. -.. image:: expenses/product.png +.. image:: expenses/categories.png :align: center + :alt: Set expense costs on products. -Here are some examples: +To create a new expense category, click :guilabel:`New`. A product form will appear, with the +description field labeled :guilabel:`Product Name`. -* Restaurant: +.. note:: + Expense categories are managed like products in Odoo. The expense category form follows the + standard product form in Odoo, and the information entered is similar. Expense products will be + referred to as expense categories throughout this document since the main menu refers to these as + :guilabel:`Expense Categories`. - * Cost: 0.00 (the cost of the ticket will be recorded on every expense) -* Travel with Personal Car: +Only two fields are required, the :guilabel:`Product Name` and the :guilabel:`Unit of Measure`. +Enter the :guilabel:`Product Name` in the field, and select the :guilabel:`Unit of Measure` from the +drop-down menu (most products will be set to :guilabel:`Units`). - * Cost: 0.30 (the price per mile reimbursed by the company is fixed) -* Hotel: +.. tip:: + The *Sales* app is where specification on the units of measure are created and edited (e.g. + units, miles, nights, etc.). Go to :menuselection:`Sales app --> Configuration --> Settings` and + ensure `Units of Measure` is enabled in the `Product Catalog` section. Click on the + :guilabel:`Units of Measure` internal link to view, create, and edit the units of measure. Refer + to :doc:`this document ` to + learn more about units of measure and how to configure them. + +.. image:: expenses/new-expense-product.png + :align: center + :alt: Set expense costs on products. - * Cost: 0.00 (the cost of the ticket will be recorded on every expense) +The :guilabel:`Cost` field on the product form is populated with a value of `0.00` by default. When +a specific expense should always be reimbursed for a particular price, enter that amount in the +:guilabel:`Cost` field. Otherwise, leave the :guilabel:`Cost` set to `0.00`, and employees will +report the actual cost when submitting an expense report. -* Others: +.. note:: + The :guilabel:`Cost` field is always visible on the expense category form, but the + :guilabel:`Sales Price` field is *only* visible if the :guilabel:`Sales Price` is selected under + the :guilabel:`Re-Invoice Expenses` section. Otherwise, the :guilabel:`Sales Price` field is + hidden. + +.. example:: + Here are some examples for when to set a specific :guilabel:`Cost` on a product vs. leaving the + :guilabel:`Cost` at `0.00`: + + - **Meals**: Set the :guilabel:`Cost` to `0.00`. When an employee logs an expense for a meal, + they enter the actual amount of the bill and will be reimbursed for that amount. An expense for + a meal costing $95.23 would equal a reimbursement for $95.23. + - **Mileage**: Set the :guilabel:`Cost` to `0.30`. When an employee logs an expense for + "mileage", they enter the number of miles driven in the :guilabel:`Quantity` field, and are + reimbursed 0.30 per mile they entered. An expense for 100 miles would equal a reimbursement for + $30.00. + - **Monthly Parking**: Set the :guilabel:`Cost` to `75.00`. When an employee logs an expense for + "monthly parking", the reimbursement would be for $75.00. + - **Expenses**: Set the :guilabel:`Cost` to `0.00`. When an employee logs an expense that is not + a meal, mileage, or monthly parking, they use the generic :guilabel:`Expenses` product. An + expense for a laptop costing $350.00 would be logged as an :guilabel:`Expenses` product, and + the reimbursement would be for $350.00. + +Select an :guilabel:`Expense Account` if using the Odoo *Accounting* app. It is recommended to check +with the accounting department to determine the correct account to reference in this field as it +will affect reports. + +Set a tax on each product in the :guilabel:`Vendor Taxes` and :guilabel:`Customer Taxes` fields, if +applicable. It is considered good practice to use a tax that is configured with :ref:`Tax Included +in Price `. Taxes will be automatically configured if this is set. + +.. _expenses/new: + +Record expenses +=============== + +Manually create a new expense +----------------------------- + +To record a new expense, begin in the main :menuselection:`Expenses` app dashboard, which presents +the default :guilabel:`My Expenses` view. This view can also be accessed from +:menuselection:`Expenses app --> My Expenses --> My Expenses`. + +First, click :guilabel:`New`, and then fill out the various fields on the form. + +- :guilabel:`Description`: Enter a short description for the expense in the :guilabel:`Description` + field. This should be short and informative, such as `lunch with client` or `hotel for + conference`. +- :guilabel:`Category`: Select the expense category from the drop-down menu that most closely + corresponds to the expense. For example, an airplane ticket would be appropriate for an expense + :guilabel:`Category` named :guilabel:`Air Travel`. +- :guilabel:`Total`: Enter the total amount paid for the expense in one of two ways: + + #. If the expense is for one single item/expense, and the category selected was for a single item, + enter the cost in the :guilabel:`Total` field (the :guilabel:`Quantity` field is hidden). + #. If the expense is for multiples of the same item/expense with a fixed price, the + :guilabel:`Unit Price` is displayed. Enter the quantity in the :guilabel:`Quantity` field, and + the total cost is automatically updated with the correct total (the :guilabel:`Unit Price` x + the :guilabel:`Quantity` = the total). Be advised, the word "total" does not appear, the total + cost simply appears below the :guilabel:`Quantity`. + + .. example:: + For example, in the case of mileage driven, the :guilabel:`Unit Price` is populated as the + cost *per mile*. Set the :guilabel:`Quantity` to the *number of miles* driven, and the total + is calculated. + +- :guilabel:`Included Taxes`: If taxes were configured on the expense category, the tax percentage + and amount appear automatically after entering either the :guilabel:`Total` or the + :guilabel:`Quantity`. + + .. note:: + When a tax is configured on an expense category, the :guilabel:`Included Taxes` value will + update in real time as the :guilabel:`Total` or :guilabel:`Quantity` is updated. + +- :guilabel:`Employee`: Using the drop-down menu, select the employee this expense is for. +- :guilabel:`Paid By`: Click the radio button to indicate who paid for the expense and should be + reimbursed. If the employee paid for the expense (and should be reimbursed) select + :guilabel:`Employee (to reimburse)`. If the company paid directly instead (e.g. if the company + credit card was used to pay for the expense) select :guilabel:`Company`. Depending on the expense + category selected, this field may not appear. +- :guilabel:`Bill Reference`: If there is any reference text that should be included for the + expense, enter it in this field. +- :guilabel:`Expense Date`: Using the calendar module, enter the date the expense was incurred. Use + the :guilabel:`< (left)` and :guilabel:`> (right)` arrows to navigate to the correct month, then + click on the specific day to enter the selection. +- :guilabel:`Account`: Select the expense account that this expense should be logged on from the + drop-down menu. +- :guilabel:`Customer to Reinvoice`: If the expense is something that should be paid for by a + customer, select the :abbr:`SO (Sales Order)` and customer that will be invoiced for this expense + from the drop-down menu. All sales orders in the drop-down menu list both the :abbr:`SO (Sales + Order)` as well as the company the sales order is written for, but after the expense is saved, the + customer name disappears and only the :abbr:`SO (Sales Order)` is visible on the expense. + + .. example:: + A customer wishes to have an on-site meeting for a custom garden (design and installation) and + agrees to pay for the expenses associated with it (such as travel, hotel, meals, etc.). All + expenses tied to that meeting would indicate the sales order for the custom garden (which also + references the customer) as the :guilabel:`Customer to Reinvoice`. + +- :guilabel:`Analytic Distribution`: Select the account(s) the expense should be written against + from the drop-down menu for either :guilabel:`Projects`, :guilabel:`Departments`, or both. + Multiple accounts can be listed for each category if needed. Adjust the percentage for each + analytic account by typing in the percentage value next to the account. +- :guilabel:`Company`: If multiple companies are set up, select the company this expense should be + filed for from the drop-down menu. The current company will automatically populate this field. +- :guilabel:`Notes...`: If any notes are needed in order to clarify the expense, enter them in the + notes field. + +.. image:: expenses/expense-filled-in.png + :align: center + :alt: A filled in expense form for a client lunch. - * Cost: 0.0 +Attach a receipt +~~~~~~~~~~~~~~~~ -Don't forget to set an expense tax on each expense type -(and an account if you use Odoo Accounting). -It's usually a good practice to use a tax that is configured -with :ref:`Tax Included in Price `. -That way, employees report expenses with -prices including taxes, which is usually the expected behaviour. +After the expense is created, the next step is to attach a receipt. Click the :guilabel:`Attach +Receipt` button, and a file explorer appears. Navigate to the receipt to be attached, and click +:guilabel:`Open`. The new receipt is recorded in the chatter, and the number of receipts will appear +next to the :guilabel:`📎 (paperclip)` icon beneath the expense form. More than one receipt can be +attached to an individual expense, as needed. The number of receipts attached to the expense will be +noted on the paperclip icon. -.. tip:: - The *Sales* app allows you to specify units of measure for your - expense types (units, miles, nights, etc.). - Go to :menuselection:`Sales --> Configuration --> Settings` and check - *Some products may be sold/purchased in different units of measure (advanced)*. +.. image:: expenses/receipt-icon.png + :align: center + :alt: Attach a receipt and it appears in the chatter. +Create new expenses from a scanned receipt +------------------------------------------ -How to record expenses -====================== +Rather than manually inputting all of the information for an expense, expenses can be created by +scanning a PDF receipt. -Manually --------- +First, in the main :guilabel:`Expenses` app dashboard view (this view can also be accessed from +:menuselection:`Expenses app --> My Expenses --> My Expenses`), click :guilabel:`Scan`, and a file +explorer pops up. Navigate to the receipt to be uploaded, click on it to select it, and then click +:guilabel:`Open`. -As an employee (Employee in user access rights), you can record -expenses from :menuselection:`My Expenses --> Expenses to Submit`. +.. image:: expenses/scan.png + :align: center + :alt: Create an expense by scanning a receipt. Click Scan at the top of the Expenses dashboard + view. -.. image:: expenses/submit_01.png +The receipt is scanned, and a new entry is created with today's date as the :guilabel:`Expense +Date`, and any other fields it can populate based on the scanned data, such as the total. Click on +the new entry to open the individual expense form, and make any changes needed. The scanned receipt +appears in the chatter. + +Automatically create new expenses from an email +----------------------------------------------- + +Instead of individually creating each expense in the *Expenses* app, expenses can be automatically +created by sending an email to an email alias. + +To do so, first, an email alias needs to be configured. Go to :menuselection:`Expenses app --> +Configuration --> Settings`. Ensure :guilabel:`Incoming Emails` is enabled. + +.. image:: expenses/email-alias.png + :align: center + :alt: Create the domain alias by clicking the link. + +.. note:: + If the domain alias needs to be set up, :guilabel:`Setup your domain alias` will appear beneath + the incoming emails check box instead of the email address field. Refer to this documentation for + setup instructions and more information: :doc:`/administration/maintain/domain_names`. Once the + domain alias is configured, the email address field will be visible beneath the incoming emails + section. + +Next, enter the email address to be used in the email field, and then click :guilabel:`Save`. Now +that the email address has been entered, emails can be sent to that alias to create new expenses +without having to be in the Odoo database. + +To submit an expense via email, create a new email and enter the product's *internal reference* code +(if available) and the amount of the expense in the email subject. Next, attach the receipt to the +email. Odoo creates the expense by taking the information in the email subject and combining it with +the receipt. + +To check an expense categories internal reference, go to :menuselection:`Expenses app --> +Configuration --> Expense Categories`. If an internal reference is listed on the expense category, +it is listed in the :guilabel:`Internal Reference` column. + +.. image:: expenses/ref.png :align: center + :alt: Internal reference numbers are listed in the main Expense Categories view. -1. Select the related product and enter either the total amount - you paid (with Quantity = 1) or the unit price if Quantity is - countable (e.g. number of hotel nights). -2. Enter the expense date. -3. Choose if you paid the bill on your own (and expect to be reimbursed) - or if the company paid directly (e.g. if you used a company's credit card). -4. Set the bill reference, add some notes if requested and attach a - photo/scan of the receipt from the discussion thread. - That will help the manager and the accountant validate it. +To add an internal reference on an expense category, click on the category to open the form. Enter +the internal reference in the field. Beneath the :guilabel:`Internal Reference` field, this sentence +appears: :guilabel:`Use this reference as a subject prefix when submitting by email.` -.. image:: expenses/submit_02.png +.. image:: expenses/mileage-internal-reference.png :align: center + :alt: Internal reference numbers are listed in the main Expense Products view. + +.. note:: + For security purposes, only authenticated employee emails are accepted by Odoo when creating an + expense from an email. To confirm an authenticated employee email address, go to the employee + card in the :menuselection:`Employees` app, and refer to the :guilabel:`Work Email` + + .. image:: expenses/authenticated-email-address.png + :align: center + :alt: Create the domain alias by clicking the link. + +.. example:: + If submitting an expense via email for a $25.00 meal during a work trip, the email subject would + be `FOOD $25.00`. + + Explanation: + + - The :guilabel:`Internal Reference` for the expense category `Meals` is `FOOD` + - The :guilabel:`Cost` for the expense is `$25.00` + +.. _expenses/report: + +Create an expense report +======================== + +When expenses are ready to submit (such as at the end of a business trip, or once a month), an +*expense report* needs to be created. Go to the main :menuselection:`Expenses` app dashboard, which +displays a default :guilabel:`My Expenses` view, or go to :menuselection:`Expenses app --> My +Expenses --> My Expenses`. + +Expenses are color coded by status. Any expense with a status of :guilabel:`To Report` (expenses +that still need to be added to an expense report) the text appears in blue. All other statuses +(:guilabel:`To Submit`, :guilabel:`Submitted`, and :guilabel:`Approved`) the text appears in black. + +First, select each individual expense for the report by clicking the check box next to each entry, +or quickly select all the expenses in the list by clicking the check box next to :guilabel:`Expense +Date`. + +Another way to quickly add all expenses that are not on an expense report is to click +:guilabel:`Create Report` without selecting any expenses, and Odoo will select all expenses with a +status of :guilabel:`To Submit` that are not already on a report. + +.. image:: expenses/create-report.png + :align: center + :alt: Select the expenses to submit, then create the report. + +.. note:: + Any expense can be selected from the :guilabel:`My Expenses` list, regardless of status. The + :guilabel:`Create Report` button is visible as long as there is a minimum of 1 expense with a + status of :guilabel:`To Report` selected. When the :guilabel:`Create Report` button is clicked, + only expenses with a status of :guilabel:`To Submit` that are *not* currently on another expense + report will appear in the newly created expense report. + +Once the expenses have been selected, click the :guilabel:`Create Report` button. The new report +appears with all the expenses listed in the :guilabel:`Expense` tab. If there is a receipt attached +to an individual expense, a :guilabel:`📎 (paperclip)` icon appears next to the :guilabel:`Customer +to Reinvoice` and :guilabel:`Analytic Distribution` columns. + +When the report is created, the date range for the expenses appears in the :guilabel:`Expense Report +Summary` field by default. It is recommended to edit this field with a short summary for each report +to help keep expenses organized. Enter a short description for the expense report (such as `Client +Trip NYC`, or `Repairs for Company Car`) in the :guilabel:`Expense Report Summary` field. Next, +select a :guilabel:`Manager` from the drop-down menu to assign a manager to review the report. If +needed, the :guilabel:`Journal` can be changed. Use the drop-down menu to select a different +:guilabel:`Journal`. + +.. image:: expenses/expense-report-summary.png + :align: center + :alt: Enter a short description and select a manager for the report. + +If some expenses are not on the report that should be, they can still be added. Click :guilabel:`Add +a line` at the bottom of the :guilabel:`Expense` tab. A pop up appears with all the available +expenses that can be added to the report (with a status of :guilabel:`To Submit`). Click the check +box next to each expense to add, then click :guilabel:`Select`. The items now appear on the report +that was just created. If a new expense needs to be added that does *not* appear on the list, click +:guilabel:`New` to create a new expense and add it to the report. + +.. image:: expenses/add-an-expense-line.png + :align: center + :alt: Add more expenses to the report before submitting. + +.. note:: + Expense reports can be created in one of three places: -In one click from emails + #. Go to the main :menuselection:`Expenses` app dashboard (also accessed by going to + :menuselection:`Expenses app --> My Expenses --> My Expenses`) + #. Go to :menuselection:`Expenses app --> My Expenses --> My Reports` + #. Go to :menuselection:`Expenses app --> Expense Reports` + + In any of these views, click :guilabel:`New` to create a new expense report. + +.. _expenses/submit: + +Submit an expense report ------------------------ -Let your employees record their expenses from a simple email. -Make a snapshot of the receipt and send it by email, or simply forward a bill! +When an expense report is completed, the next step is to submit the report to a manager for +approval. Reports must be individually submitted, and cannot be submitted in batches. Open the +specific report from the list of expense reports (if the report is not already open). To view all +expense reports, go to :menuselection:`Expenses app --> My Expenses --> My Reports`. -The only thing to do is setting up an email alias in -:menuselection:`Expenses --> Configuration --> Settings` (e.g. *expenses* @mycompany.odoo.com). -For security purposes, only authenticated employee emails -(cfr. *Work Email* in employee detail form) are accepted. +If the list is large, grouping the results by status may be helpful since only reports that have a +:guilabel:`To Submit` status need to be submitted, reports with an :guilabel:`Approved` or +:guilabel:`Submitted` status do not. -.. tip:: - The expense product is set automatically if the mail subject contains - the product's internal reference in first position. - Type the expense amount in the mail subject to set it on the expense too (e.g. Ref001 Food 100€). +The :guilabel:`To Submit` expenses are easily identifiable not just from the :guilabel:`To Submit` +status, but the text appears in blue, while the other expenses text appears in black. + +.. image:: expenses/expense-status.png + :align: center + :alt: Submit the report to the manager. + +.. note:: + The status of each report is shown in the :guilabel:`Status` column on the right. If the + :guilabel:`Status` column is not visible, click the :guilabel:`Additional Options (two dots)` + icon at the end of the row, and enable :guilabel:`Status`. + +Click on a report to open it, then click :guilabel:`Submit To Manager`. After submitting a report, +the next step is to wait for the manager to approve it. + +.. important:: + The :ref:`expenses/approve`, :ref:`expenses/post`, and :ref:`expenses/reimburse` sections are + **only** for users with the *necessary rights*. + +.. _expenses/approve: -How to submit expenses to managers -================================== +Approve expenses +================ -When you are ready to submit your expenses to your manager -(e.g. at the end of a business trip, or once a month), -go to the menu :menuselection:`My Expenses --> Expenses to Submit`. Select all expenses -from the list view and click on :menuselection:`Action --> Submit to Manager`. -Save the newly created expense report (i.e. set of expenses), -and wait for your manager to approve it. +In Odoo, not just anyone can approve expense reports— only users with the necessary rights (or +permissions) can. This means that a user must have at least *Team Approver* rights for the +*Expenses* app. Employees with the necessary rights can review expense reports, approve or reject +them, and provide feedback thanks to the integrated communication tool. -.. image:: expenses/submit_03.png +To see who has rights to approve, go to the main :menuselection:`Settings` app and click on +:guilabel:`Manage Users`. + +.. note:: + If the *Settings* app is not available, then certain rights are not set on the account. Check the + :guilabel:`Access Rights` tab of a user's card in the :menuselection:`Settings` app. the + :guilabel:`Administration` section (bottom right of the :guilabel:`Access Rights` tab) is set to + one of three options: + + - :guilabel:`None (blank)`: The user cannot access the *Settings* app at all. + - :guilabel:`Access Rights`: The user can only view the :guilabel:`User's & Companies` section of + the *Settings* app. + - :guilabel:`Settings`: The user has access to the entire *Settings* app with no restrictions. + + Please refer to :doc:`this document ` to learn more + about managing users and their access rights. + +Click on an individual to view their card, which displays the :guilabel:`Access Rights` tab in the +default view. Scroll down to the :guilabel:`Human Resources` section. Under :guilabel:`Expenses`, +there are four options: + +- :guilabel:`None (blank)`: A blank field means the user has no rights to view or approve expense + reports, and can only view their own. +- :guilabel:`Team Approver`: The user can only view and approve expense reports for their own + specific team. +- :guilabel:`All Approver`: The user can view and approve any expense report. +- :guilabel:`Administrator`: The user can view and approve any expense report, as well as access the + reporting and configuration menus in the *Expenses* app. + +Users who are able to approve expense reports (typically managers) can easily view all expense +reports they have access rights to. Go to :menuselection:`Expenses app --> Expense Reports`, and a +list appears with all expense reports that have a status of either :guilabel:`To Submit`, +:guilabel:`Submitted`, :guilabel:`Approved`, :guilabel:`Posted`, or :guilabel:`Done`. Expense +reports with a status of :guilabel:`Refused` are hidden in the default view. + +.. image:: expenses/expense-reports-list.png :align: center + :alt: Reports to validate are found on the Reports to Approve page. -You can also submit expenses one by one from the *Submit to Manager* -button on the form view of an expense. +When viewing expense reports, there is a panel of filters that can be enabled or disabled on the +left side. The three categories that filters can be applied on are :guilabel:`Status`, +:guilabel:`Employee`, and :guilabel:`Company`. To view only expense reports with a particular +status, enable the specific status filter to display the expense reports with only that status. +Disable the specific status filter to hide the reports with that status. To view expense reports for +a particular employee and/or company, enable the specific employee name filter and/or company filter +in the :guilabel:`Employee` and :guilabel:`Company` sections. -All your submitted expense reports can be found in -:menuselection:`Expenses --> My Expenses --> Expense Reports`. +Reports can be approved in two ways (individually or several at once) and refused only one way. To +approve multiple expense reports at once, remain in the list view. First, select the reports to +approve by clicking the check box next to each report, or click the box next to :guilabel:`Employee` +to select all the reports in the list. +.. important:: + Only reports with a status of :guilabel:`Submitted` can be approved. It is recommended to only + display the submitted reports by adjusting the status filter on the left side by only having the + :guilabel:`Submitted` filter enabled. -How to approve expenses -======================= + If a report is selected that is unable to be approved, the :guilabel:`Approve Report` button + **will not appear**, indicating there is a problem with the selected report(s). -HR and team managers get an overview of all expense reports to -validate from the top menu :menuselection:`To Approve --> Expense Reports to Approve`. -Such users must have at least *Officers* access rights for *Expenses*. +Next, click the :guilabel:`Approve Report` button. -.. image:: expenses/approval_01.png +.. image:: expenses/approve-report.png :align: center + :alt: Approve multiple reports by clicking the checkboxes next to each report. + +To approve an individual report, click on a report to go to a detailed view of that report. In this +view, several options are presented: :guilabel:`Approve`, :guilabel:`Report in Next Payslip`, +:guilabel:`Refuse`, or :guilabel:`Reset to draft`. Click :guilabel:`Approve` to approve the report. -They can review expense reports, approve or reject them, as well as providing -feedback thanks to the integrated communication tool. +If :guilabel:`Refuse` is clicked, a pop-up window appears. Enter a brief explanation for the refusal +in the :guilabel:`Reason to Refuse Expense` field, and then click :guilabel:`Refuse`. -.. image:: expenses/approval_02.png +.. image:: expenses/refuse-expense.png :align: center + :alt: Send messages in the chatter. -As a team manager you can easily find the expense reports of your team members. -You need to be set as manager in the detail form of those employees. +Team managers can easily view all the expense reports for their team members. While in the +:guilabel:`Expense Reports` view, click the drop-down arrow in the right-side of the search box, and +click on :guilabel:`My Team` in the :guilabel:`Filters` section. This presents all the reports for +the manager's team. -.. image:: expenses/approval_03.png +.. image:: expenses/my-team-filter.png :align: center + :alt: Select the My Team filter. +.. tip:: + If more information is needed, such as a missing receipt, communication is easy from the chatter. + In an individual report, simply click :guilabel:`Send message` to open the message text box. Type + in a message, tagging the proper person (if needed), and post it to the chatter by clicking + :guilabel:`Send`. The message is posted in the chatter, and the person tagged will be notified + via email of the message, as well as any followers. -How to post expenses in accounting -================================== + The only people that can be tagged in a message are *followers*. To see who is a follower, click + on the :guilabel:`👤 (person)` icon to display the followers of the expense. -Once expense reports approved by managers, the accounting department -goes to :menuselection:`Expenses --> Accountant --> Expense Reports To Post` to check -accounts, products and taxes. They can click *Post Journal Entries* -to post related journal entries into your books. -To do so, the user must have following access rights: + .. image:: expenses/chatter.png + :align: center + :alt: Send messages in the chatter. -* Accounting: Accountant or Adviser -* Expenses: Manager +.. _expenses/post: -.. note:: - To post an expense, a *Home Address* must be set on the employee. - If you get a related blocking message when posting, click the employee, - go to *Personal Information* tab and select/create the contact of your employee - in the address book. - A contact has been automatically created if this person is using Odoo. +Post expenses in accounting +=========================== -How to reimburse employees -========================== +Once an expense report is approved, the next step is to post the report to the accounting journal. +To view all expense reports, go to :menuselection:`Expenses app --> Expense Reports`. To view only the +expense reports that have been approved and need to be posted, adjust the filters on the left side +so that only the :guilabel:`Approved` status is enabled. -You can now see all the expense reports to reimburse in -:menuselection:`Expenses --> Accountant --> Expense Reports To Pay`. -To record the payment or pay by check, click *Register a Payment*. +.. image:: expenses/post-reports.png + :align: center + :alt: View reports to post by clicking on expense reports, then reports to post. -See how you can easily manage the payment process in Odoo: +Just like approvals, expense reports can be posted in two ways (individually or several at once). To +post multiple expense reports at once, remain in the list view. First, select the reports to post by +clicking the check box next to each report, or click the box next to :guilabel:`Employee` to select +all the reports in the list. Next, click :guilabel:`Post Entries`. -* :doc:`accounting/payables/pay/check` -* :doc:`accounting/payables/pay/sepa` +.. image:: expenses/post-entries.png + :align: center + :alt: Post multiple reports at a time from the Expense Reports view, with the Approved filter. +To post an individual report, click on a report to go to the detailed view of that report. In this +view, several options are presented: :guilabel:`Post Journal Entries`, :guilabel:`Report In Next +Payslip`, :guilabel:`Refuse`, or :guilabel:`Reset to Draft`. Click :guilabel:`Post Journal Entries` +to post the report. -How to re-invoice expenses to your customers -============================================ +If :guilabel:`Refuse` is clicked, a pop-up window appears. Enter a brief explanation for the refusal +in the :guilabel:`Reason to Refuse Expense` field, and then click :guilabel:`Refuse`. Refused +reports can be viewed by going to :menuselection:`Expenses app --> Expense Reports`, then adjusting +the filters on the left so that only :guilabel:`Refused` is selected. This will only show the +refused expense reports. -If you track expenses on customer projects, you can charge them back to -your customers automatically. +.. important:: + To post expense reports to an accounting journal, the user must have following access rights: -Setup ------ + - Accounting: Accountant or Adviser + - Expenses: Manager -- Enable **Customer Billing** in the Expenses settings +.. _expenses/reimburse: -- Go to the product configuration menu and set the invoicing method on - all your Expense types: +Reimburse employees +=================== - - Ordered quantities: it will invoice expenses based on the ordered - quantity +After an expense report is posted to an accounting journal, the next step is to reimburse the +employee. To view all the expense reports to pay, go to :menuselection:`Expenses app --> Expense +Reports --> Reports To Pay`. - - Delivered quantities: it will invoice expenses based on the - expenses quantity +.. image:: expenses/reports-to-pay.png + :align: center + :alt: View reports to pay by clicking on expense reports, then reports to pay. - - At cost: will invoice expenses at their real cost. +Just like approvals and posting, expense reports can be paid in two ways (individually or several at +once). To pay multiple expense reports at once, remain in the list view. First, select the reports +to pay by clicking the check box next to each report, or click the box next to :guilabel:`Employee` +to select all the reports in the list. Next, click :guilabel:`Register Payment`. - - At sales price: will invoice based on a fixed sales price set on - the sale order. +.. image:: expenses/register-payment.png + :align: center + :alt: Post multiple reports by selecting them, clicking the gear, and then post the entries. + +To pay an individual report, click on a report to go to a detailed view of that report. Click +:guilabel:`Register Payment` to pay the employee. + +A :guilabel:`Register Payment` pop-up appears, and the :guilabel:`Journal`, :guilabel:`Payment +Method`, and :guilabel:`Payment Date` can be modified, if needed. When the selections are correct, +click :guilabel:`Create Payment` to send the payment to the employee. + +To pay an individual report, click on a report in the list view to go to a detailed view of that +report. Click :guilabel:`Register Payment` to pay the employee. A :guilabel:`Register Payment` +pop-up appears, but when paying an individual expense report instead of several at once, more +options appear in the pop-up. In addition to the :guilabel:`Journal`, :guilabel:`Payment Method`, +and :guilabel:`Payment Date` fields, a :guilabel:`Recipient Bank Account`, :guilabel:`Amount`, and +:guilabel:`Memo` field appear. Select the employee's bank account from the drop-down menu to +directly deposit the payment to their account. When all other selections are correct, click +:guilabel:`Create Payment` to send the payment to the employee. + +.. image:: expenses/two-payment-posting-options.png + :align: center + :alt: Different options appear when registering an individual expense report versus multiple + expense reports at once. + +Re-invoice expenses to customers +================================ + +If expenses are tracked on customer projects, expenses can be automatically charged back to the +customer. This is done by creating an expense, referencing the :abbr:`SO (Sales Order)` the expense +should be added to, and then creating the expense report. Next, managers approve the expense report, +and the accounting department posts the journal entries. Finally, once the expense report is posted +to a journal, the expense(s) appears on the :abbr:`SO (Sales Order)` that was referenced. The sales +order can then be invoiced, thus invoicing the customer for the expense. + +Setup +----- + +First, specify the invoicing policy for each expense category. Go to :menuselection:`Expenses app +--> Configuration --> Expense Categories`. Click on the expense category to open the expense +category form. Under the :guilabel:`Invoicing` section, click the radio button next to the desired +selection for :guilabel:`Re-Invoicing Expenses`. Options are :guilabel:`None`, :guilabel:`At cost`, +and :guilabel:`Sales price`. -.. image:: expenses/invoicing_01.png - :align: center +:guilabel:`Re-Invoicing Expenses`: -Create an order ---------------- +- :guilabel:`None`: Expense category will not be re-invoiced. +- :guilabel:`At cost`: Expense category will invoice expenses at their real cost. +- :guilabel:`At sales price`: Expense category will invoice the price set on the sale order. -- As a salesman, create and confirm a Sales Order for the services - delivered to your customer. If you don't put any expense in the - order, it will be added automatically once posted by the - accountant. +Create an expense +----------------- -- Link the expense to the Sale Order. +First, when :ref:`creating a new expense `, the correct information needs to be +entered in order to re-invoice a customer. Select the *sales order* the expense will appear on in +the :guilabel:`Customer to Reinvoice` section, from the drop-down menu. Next, select the +:guilabel:`Analytic Account` the expense will be posted to. After the expense(s) are created, the +expense report needs to be :ref:`created ` and :ref:`submitted ` +as usual. -.. image:: expenses/invoicing_02.png - :align: center +.. image:: expenses/reinvoice-expense.png + :align: center + :alt: Ensure the customer to be invoiced is called out on the expense. -Submit, validate and post expenses ----------------------------------- +.. important:: + Selecting a :guilabel:`Customer to Reinvoice` when creating an expense is critical, since this is + what causes the expenses to be automatically invoiced after an expense report is approved. -- As a manager, make sure the analytic account is set on every expense - line on approving expenses reports. Click the line to add one if - missing. Employees are already able to set one when submitting. + The :guilabel:`Customer to Reinvoice` field can be modified *until an expense report is* + **approved**, then the field is no longer able to be modified. -.. image:: expenses/invoicing_03.png - :align: center +Validate and post expenses +-------------------------- -- As an accountant, post journal entries. +Only employees with permissions (typically managers or supervisors) can :ref:`approve expenses +`. Before approving an expense report, ensure the :guilabel:`Analytic +Distribution` is set on every expense line of a report. If an :guilabel:`Analytic Distribution` is +missing, assign the correct account(s) from the drop-down menu, and then click :guilabel:`Approve` +or :guilabel:`Refuse`. + +The accounting department is typically responsible for :ref:`posting journal entries +`. Once an expense report is approved, it can then be posted. The :abbr:`SO (Sales +Order)` is **only** updated *after the journal entries are posted*. One the journal entries are +posted, the expenses now appear on the referenced :abbr:`SO (Sales Order)`. Invoice expenses ---------------- -Now you can invoice the order. It shows up in -:menuselection:`Sales --> Invoicing --> Sales` -to Invoice. The expenses have been added automatically in the order -lines. Such items show up in blue (i.e. to invoice). +Once the :abbr:`SO (Sales Order)` has been updated, it is time to invoice the customer. After the +expense report has been approved and the journal entries have been posted, click the +:guilabel:`Sales Orders` smart button to open the :abbr:`SO (Sales Order)`. The expenses to be +re-invoiced are now on the :abbr:`SO (Sales Order)`. + +.. image:: expenses/sales-order.png + :align: center + :alt: After the expense report is posted to the journal entry, the sales order can be called up + by clicking on the sales order number. + +.. note:: + More than one :abbr:`SO (Sales Order)` can be referenced on an expense report. If more than one + :abbr:`SO (Sales Order)` is referenced, the :guilabel:`Sales Orders` smart button will list the + number of :abbr:`SO (Sales Order)`'s. If multiple :abbr:`SO (Sales Order)`'s are listed, the + :guilabel:`Sales Orders` smart button opens a list view of all the :abbr:`SO (Sales Order)`'s on + the expense report. Click on a :abbr:`SO (Sales Order)` to open the individual :abbr:`SO (Sales + Order)`. -.. image:: expenses/invoicing_04.png - :align: center +The expenses are listed in the :abbr:`SO (Sales Order)` :guilabel:`Order Lines` tab. + +.. image:: expenses/so-details.png + :align: center + :alt: See the expenses listed on the sales order after clicking into it. -e (i.e. to invoice). +Next, click :guilabel:`Create Invoice`, and select if the invoice is for a :guilabel:`Regular +invoice`, a :guilabel:`Down payment (percentage)`, or a :guilabel:`Down payment (fixed amount)` by +clicking the radio button next to it. Then, click :guilabel:`Create Invoice`. The customer has now +been invoiced for the expenses. diff --git a/content/applications/finance/expenses/add-an-expense-line.png b/content/applications/finance/expenses/add-an-expense-line.png new file mode 100644 index 0000000000..073eaae1c2 Binary files /dev/null and b/content/applications/finance/expenses/add-an-expense-line.png differ diff --git a/content/applications/finance/expenses/approval_01.png b/content/applications/finance/expenses/approval_01.png deleted file mode 100644 index c617cbbd65..0000000000 Binary files a/content/applications/finance/expenses/approval_01.png and /dev/null differ diff --git a/content/applications/finance/expenses/approval_02.png b/content/applications/finance/expenses/approval_02.png deleted file mode 100644 index 7441b7b5e8..0000000000 Binary files a/content/applications/finance/expenses/approval_02.png and /dev/null differ diff --git a/content/applications/finance/expenses/approval_03.png b/content/applications/finance/expenses/approval_03.png deleted file mode 100644 index aec7ac2730..0000000000 Binary files a/content/applications/finance/expenses/approval_03.png and /dev/null differ diff --git a/content/applications/finance/expenses/approve-report.png b/content/applications/finance/expenses/approve-report.png new file mode 100644 index 0000000000..7ab74ae951 Binary files /dev/null and b/content/applications/finance/expenses/approve-report.png differ diff --git a/content/applications/finance/expenses/authenticated-email-address.png b/content/applications/finance/expenses/authenticated-email-address.png new file mode 100644 index 0000000000..6080bcc302 Binary files /dev/null and b/content/applications/finance/expenses/authenticated-email-address.png differ diff --git a/content/applications/finance/expenses/categories.png b/content/applications/finance/expenses/categories.png new file mode 100644 index 0000000000..d4f05cec6c Binary files /dev/null and b/content/applications/finance/expenses/categories.png differ diff --git a/content/applications/finance/expenses/chatter.png b/content/applications/finance/expenses/chatter.png new file mode 100644 index 0000000000..23b22d8723 Binary files /dev/null and b/content/applications/finance/expenses/chatter.png differ diff --git a/content/applications/finance/expenses/create-report.png b/content/applications/finance/expenses/create-report.png new file mode 100644 index 0000000000..2264066046 Binary files /dev/null and b/content/applications/finance/expenses/create-report.png differ diff --git a/content/applications/finance/expenses/email-alias.png b/content/applications/finance/expenses/email-alias.png new file mode 100644 index 0000000000..981229cb6a Binary files /dev/null and b/content/applications/finance/expenses/email-alias.png differ diff --git a/content/applications/finance/expenses/expense-filled-in.png b/content/applications/finance/expenses/expense-filled-in.png new file mode 100644 index 0000000000..eda4790821 Binary files /dev/null and b/content/applications/finance/expenses/expense-filled-in.png differ diff --git a/content/applications/finance/expenses/expense-report-summary.png b/content/applications/finance/expenses/expense-report-summary.png new file mode 100644 index 0000000000..4fe9e2c520 Binary files /dev/null and b/content/applications/finance/expenses/expense-report-summary.png differ diff --git a/content/applications/finance/expenses/expense-reports-list.png b/content/applications/finance/expenses/expense-reports-list.png new file mode 100644 index 0000000000..4f2cf7a403 Binary files /dev/null and b/content/applications/finance/expenses/expense-reports-list.png differ diff --git a/content/applications/finance/expenses/expense-status.png b/content/applications/finance/expenses/expense-status.png new file mode 100644 index 0000000000..f88b8008c1 Binary files /dev/null and b/content/applications/finance/expenses/expense-status.png differ diff --git a/content/applications/finance/expenses/invoicing_01.png b/content/applications/finance/expenses/invoicing_01.png deleted file mode 100644 index 8ce46d28c0..0000000000 Binary files a/content/applications/finance/expenses/invoicing_01.png and /dev/null differ diff --git a/content/applications/finance/expenses/invoicing_02.png b/content/applications/finance/expenses/invoicing_02.png deleted file mode 100644 index 3dea275ff5..0000000000 Binary files a/content/applications/finance/expenses/invoicing_02.png and /dev/null differ diff --git a/content/applications/finance/expenses/invoicing_03.png b/content/applications/finance/expenses/invoicing_03.png deleted file mode 100644 index 1f89a376ec..0000000000 Binary files a/content/applications/finance/expenses/invoicing_03.png and /dev/null differ diff --git a/content/applications/finance/expenses/invoicing_04.png b/content/applications/finance/expenses/invoicing_04.png deleted file mode 100644 index 530b4e197c..0000000000 Binary files a/content/applications/finance/expenses/invoicing_04.png and /dev/null differ diff --git a/content/applications/finance/expenses/mileage-internal-reference.png b/content/applications/finance/expenses/mileage-internal-reference.png new file mode 100644 index 0000000000..3614e99e0b Binary files /dev/null and b/content/applications/finance/expenses/mileage-internal-reference.png differ diff --git a/content/applications/finance/expenses/my-team-filter.png b/content/applications/finance/expenses/my-team-filter.png new file mode 100644 index 0000000000..817ab2a730 Binary files /dev/null and b/content/applications/finance/expenses/my-team-filter.png differ diff --git a/content/applications/finance/expenses/new-expense-product.png b/content/applications/finance/expenses/new-expense-product.png new file mode 100644 index 0000000000..065a94c908 Binary files /dev/null and b/content/applications/finance/expenses/new-expense-product.png differ diff --git a/content/applications/finance/expenses/post-entries.png b/content/applications/finance/expenses/post-entries.png new file mode 100644 index 0000000000..d6d421497e Binary files /dev/null and b/content/applications/finance/expenses/post-entries.png differ diff --git a/content/applications/finance/expenses/post-reports.png b/content/applications/finance/expenses/post-reports.png new file mode 100644 index 0000000000..ad26927560 Binary files /dev/null and b/content/applications/finance/expenses/post-reports.png differ diff --git a/content/applications/finance/expenses/product.png b/content/applications/finance/expenses/product.png deleted file mode 100644 index 6fb15f3ac6..0000000000 Binary files a/content/applications/finance/expenses/product.png and /dev/null differ diff --git a/content/applications/finance/expenses/receipt-icon.png b/content/applications/finance/expenses/receipt-icon.png new file mode 100644 index 0000000000..b8d0c4e940 Binary files /dev/null and b/content/applications/finance/expenses/receipt-icon.png differ diff --git a/content/applications/finance/expenses/ref.png b/content/applications/finance/expenses/ref.png new file mode 100644 index 0000000000..c2a91b6b2c Binary files /dev/null and b/content/applications/finance/expenses/ref.png differ diff --git a/content/applications/finance/expenses/refuse-expense.png b/content/applications/finance/expenses/refuse-expense.png new file mode 100644 index 0000000000..3ac9687938 Binary files /dev/null and b/content/applications/finance/expenses/refuse-expense.png differ diff --git a/content/applications/finance/expenses/register-payment.png b/content/applications/finance/expenses/register-payment.png new file mode 100644 index 0000000000..843d197e3a Binary files /dev/null and b/content/applications/finance/expenses/register-payment.png differ diff --git a/content/applications/finance/expenses/reinvoice-expense.png b/content/applications/finance/expenses/reinvoice-expense.png new file mode 100644 index 0000000000..55d37dbabc Binary files /dev/null and b/content/applications/finance/expenses/reinvoice-expense.png differ diff --git a/content/applications/finance/expenses/reports-to-pay.png b/content/applications/finance/expenses/reports-to-pay.png new file mode 100644 index 0000000000..96f480208e Binary files /dev/null and b/content/applications/finance/expenses/reports-to-pay.png differ diff --git a/content/applications/finance/expenses/sales-order.png b/content/applications/finance/expenses/sales-order.png new file mode 100644 index 0000000000..dd7ac91957 Binary files /dev/null and b/content/applications/finance/expenses/sales-order.png differ diff --git a/content/applications/finance/expenses/scan.png b/content/applications/finance/expenses/scan.png new file mode 100644 index 0000000000..c1937f754d Binary files /dev/null and b/content/applications/finance/expenses/scan.png differ diff --git a/content/applications/finance/expenses/so-details.png b/content/applications/finance/expenses/so-details.png new file mode 100644 index 0000000000..e67671f3f6 Binary files /dev/null and b/content/applications/finance/expenses/so-details.png differ diff --git a/content/applications/finance/expenses/submit_01.png b/content/applications/finance/expenses/submit_01.png deleted file mode 100644 index cd06043abf..0000000000 Binary files a/content/applications/finance/expenses/submit_01.png and /dev/null differ diff --git a/content/applications/finance/expenses/submit_02.png b/content/applications/finance/expenses/submit_02.png deleted file mode 100644 index 966e1fc5aa..0000000000 Binary files a/content/applications/finance/expenses/submit_02.png and /dev/null differ diff --git a/content/applications/finance/expenses/submit_03.png b/content/applications/finance/expenses/submit_03.png deleted file mode 100644 index 54f062d6e7..0000000000 Binary files a/content/applications/finance/expenses/submit_03.png and /dev/null differ diff --git a/content/applications/finance/expenses/two-payment-posting-options.png b/content/applications/finance/expenses/two-payment-posting-options.png new file mode 100644 index 0000000000..7f1edf64f5 Binary files /dev/null and b/content/applications/finance/expenses/two-payment-posting-options.png differ diff --git a/content/applications/finance/fiscal_localizations.rst b/content/applications/finance/fiscal_localizations.rst index 3ae9c9c78b..f1870c8fd4 100644 --- a/content/applications/finance/fiscal_localizations.rst +++ b/content/applications/finance/fiscal_localizations.rst @@ -40,8 +40,8 @@ These packages require you to fine-tune your chart of accounts according to your taxes you use, and configure your country-specific statements and certifications. .. seealso:: - - :doc:`accounting/getting_started/initial_configuration/chart_of_accounts` - - :doc:`accounting/taxation/taxes/taxes` + - :doc:`accounting/get_started/chart_of_accounts` + - :doc:`accounting/taxes` .. _fiscal_localizations/countries-list: @@ -104,11 +104,12 @@ available on Odoo. - Pakistan - Accounting - Panama - Accounting - :doc:`Peru - Accounting ` +- :doc:`Philippines - Accounting ` - Poland - Accounting - Portugal - Accounting - Romania - Accounting -- Saudi Arabia - Accounting -- Singapore - Accounting +- :doc:`Saudi Arabia - Accounting ` +- :doc:`Singapore - Accounting ` - Slovak - Accounting - Slovenian - Accounting - South Africa - Accounting @@ -124,7 +125,7 @@ available on Odoo. - United States - Accounting - Uruguay - Accounting - Venezuela - Accounting -- Vietnam - Accounting +- :doc:`Vietnam - Accounting ` .. toctree:: :titlesonly: @@ -148,7 +149,11 @@ available on Odoo. fiscal_localizations/mexico fiscal_localizations/netherlands fiscal_localizations/peru + fiscal_localizations/philippines + fiscal_localizations/saudi_arabia + fiscal_localizations/singapore fiscal_localizations/spain fiscal_localizations/switzerland + fiscal_localizations/vietnam fiscal_localizations/united_arab_emirates fiscal_localizations/united_kingdom diff --git a/content/applications/finance/fiscal_localizations/australia.rst b/content/applications/finance/fiscal_localizations/australia.rst index d5e0192819..2ca2af88ca 100644 --- a/content/applications/finance/fiscal_localizations/australia.rst +++ b/content/applications/finance/fiscal_localizations/australia.rst @@ -2,75 +2,66 @@ Australia ========= -.. _australia/keypay: +.. _australia/employment-hero: -KeyPay Australian Payroll -========================= +Employment Hero Australian Payroll +================================== -The KeyPay Module synchronizes payslip accounting entries (e.g., expenses, social charges, -liabilities, taxes) from KeyPay to Odoo automatically. Payroll administration is still done in -KeyPay. We only record the journal entries in Odoo. +The Employment Hero module synchronizes payslip accounting entries (e.g., expenses, social charges, +liabilities, taxes) from Employment Hero to Odoo automatically. Payroll administration is still done +in Employment Hero. We only record the journal entries in Odoo. -Configuration Steps -------------------- +.. important:: + KeyPay was rebranded as **Employment Hero** in March 2023. -#. Create a company located in Australia. -#. Check that the Australian localization module (Australia - Accounting) is installed. -#. Configure the *KeyPay API*. +Configuration +------------- - .. image:: australia/australia-keypay-api.png - :align: center - :alt: Odoo Accounting settings includes a section for the Australian Loclization +#. :ref:`Activate ` the :guilabel:`Employment Hero Australian Payroll` module + (technical name: `l10n_au_keypay`). +#. Configure the **Employment Hero API** by going to :menuselection:`Accounting --> Configuration --> + Settings`. More fields become visible after clicking on :guilabel:`Enable Employment Hero + Integration`. -#. More fields become visible after clicking on *Enable KeyPay Integration*. + .. image:: australia/employment-hero-integration.png + :alt: Enabling Employment Hero Integration in Odoo Accounting displays new fields in the + settings - .. image:: australia/australia-keypay-integration.png - :align: center - :alt: Enabling KeyPay Integration in Odoo Accounting displays new fields in the settings + - You can find the API Key in the :guilabel:`My Account` section of the Employment Hero platform. -#. You can find the API Key in the *My Account* section of the KeyPay platform. + .. image:: australia/employment-hero-myaccount.png + :alt: "Account Details" section on the Employment Hero dashboard - .. image:: australia/australia-keypay-myaccount.png - :align: center - :alt: "Account Details" section on the KeyPay dashboard + - The **Payroll URL** is pre-filled with `https://keypay.yourpayroll.com.au`. *Please do not + change it.* + - You can find the **Business ID** in the Employment Hero URL. (i.e., `189241`) -#. The **Payroll URL** is pre-filled with ``https://keypay.yourpayroll.com.au``. *Please do not - change it.* -#. You can find the **Business ID** in the KeyPay URL. (i.e., ``189241``) + .. image:: australia/employment-hero-business-id.png + :alt: The Employment Hero "Business ID" number is in the URL - .. image:: australia/australia-keypay-business-id.png - :align: center - :alt: The KeyPay "Business ID" number is in the URL - -#. You can choose any Odoo journal to post the payslip entries. + - You can choose any Odoo journal to post the payslip entries. How does the API work? ---------------------- -The API syncs the journal entries from KeyPay to Odoo and leaves them in draft mode. The reference -includes the KeyPay payslip entry ID in brackets for the user to easily retrieve the same record in -KeyPay and Odoo. - -.. image:: australia/australia-keypay-journal-entry.png - :align: center - :alt: Example of a KeyPay Journal Entry in Odoo Accounting (Australia) +The API syncs the journal entries from Employment Hero to Odoo and leaves them in draft mode. The +reference includes the Employment Hero payslip entry ID in brackets for the user to easily retrieve +the same record in Employment Hero and Odoo. -.. note:: - The API sync is triggered by scheduled actions. +.. image:: australia/employment-hero-journal-entry.png + :alt: Example of a Employment Hero Journal Entry in Odoo Accounting (Australia) - .. image:: australia/australia-keypay-scheduled-actions.png - :align: center - :alt: Scheduled Actions settings for KeyPay Payroll in Odoo (debug mode) +By default, the synchronization happens once per week. You can fetch the records manually by going +to :menuselection:`Accounting --> Configuration --> Settings` and, in the :guilabel:`Enable +Employment Hero Integration` option, click on :guilabel:`Fetch Payruns Manually`. -KeyPay payslip entries also work based on double-entry bookkeeping. Debit must equal credit (like in -Odoo). +Employment Hero payslip entries also work based on double-entry bookkeeping. -The accounts used by KeyPay are defined in the section **Payroll settings**. +The accounts used by Employment Hero are defined in the section :guilabel:`Payroll settings`. -.. image:: australia/australia-keypay-chart-of-accounts.png - :align: center - :alt: Chart of Accounts menu in KeyPay +.. image:: australia/employment-hero-chart-of-accounts.png + :alt: Chart of Accounts menu in Employment Hero -For the API to work, you need to create the same accounts as the default accounts of your KeyPay -business (**same name and same code**) in Odoo. You also need to choose the correct account types in -Odoo to generate accurate financial reports. +For the API to work, you need to create the same accounts as the default accounts of your Employment +Hero business (**same name and same code**) in Odoo. You also need to choose the correct account +types in Odoo to generate accurate financial reports. diff --git a/content/applications/finance/fiscal_localizations/australia/australia-keypay-api.png b/content/applications/finance/fiscal_localizations/australia/australia-keypay-api.png deleted file mode 100644 index 568afa51e5..0000000000 Binary files a/content/applications/finance/fiscal_localizations/australia/australia-keypay-api.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/australia/australia-keypay-business-id.png b/content/applications/finance/fiscal_localizations/australia/australia-keypay-business-id.png deleted file mode 100644 index da6c83363a..0000000000 Binary files a/content/applications/finance/fiscal_localizations/australia/australia-keypay-business-id.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/australia/australia-keypay-chart-of-accounts.png b/content/applications/finance/fiscal_localizations/australia/australia-keypay-chart-of-accounts.png deleted file mode 100644 index 7c5d892151..0000000000 Binary files a/content/applications/finance/fiscal_localizations/australia/australia-keypay-chart-of-accounts.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/australia/australia-keypay-integration.png b/content/applications/finance/fiscal_localizations/australia/australia-keypay-integration.png deleted file mode 100644 index b3f6270664..0000000000 Binary files a/content/applications/finance/fiscal_localizations/australia/australia-keypay-integration.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/australia/australia-keypay-myaccount.png b/content/applications/finance/fiscal_localizations/australia/australia-keypay-myaccount.png deleted file mode 100644 index 60661ecbaf..0000000000 Binary files a/content/applications/finance/fiscal_localizations/australia/australia-keypay-myaccount.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/australia/australia-keypay-scheduled-actions.png b/content/applications/finance/fiscal_localizations/australia/australia-keypay-scheduled-actions.png deleted file mode 100644 index 14a3ee2f97..0000000000 Binary files a/content/applications/finance/fiscal_localizations/australia/australia-keypay-scheduled-actions.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/australia/employment-hero-business-id.png b/content/applications/finance/fiscal_localizations/australia/employment-hero-business-id.png new file mode 100644 index 0000000000..8004a1efed Binary files /dev/null and b/content/applications/finance/fiscal_localizations/australia/employment-hero-business-id.png differ diff --git a/content/applications/finance/fiscal_localizations/australia/employment-hero-chart-of-accounts.png b/content/applications/finance/fiscal_localizations/australia/employment-hero-chart-of-accounts.png new file mode 100644 index 0000000000..38438920ba Binary files /dev/null and b/content/applications/finance/fiscal_localizations/australia/employment-hero-chart-of-accounts.png differ diff --git a/content/applications/finance/fiscal_localizations/australia/employment-hero-integration.png b/content/applications/finance/fiscal_localizations/australia/employment-hero-integration.png new file mode 100644 index 0000000000..403a8a39d5 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/australia/employment-hero-integration.png differ diff --git a/content/applications/finance/fiscal_localizations/australia/australia-keypay-journal-entry.png b/content/applications/finance/fiscal_localizations/australia/employment-hero-journal-entry.png similarity index 100% rename from content/applications/finance/fiscal_localizations/australia/australia-keypay-journal-entry.png rename to content/applications/finance/fiscal_localizations/australia/employment-hero-journal-entry.png diff --git a/content/applications/finance/fiscal_localizations/australia/employment-hero-myaccount.png b/content/applications/finance/fiscal_localizations/australia/employment-hero-myaccount.png new file mode 100644 index 0000000000..61fc20268c Binary files /dev/null and b/content/applications/finance/fiscal_localizations/australia/employment-hero-myaccount.png differ diff --git a/content/applications/finance/fiscal_localizations/belgium.rst b/content/applications/finance/fiscal_localizations/belgium.rst index 54a6d5b66a..a11420c53a 100644 --- a/content/applications/finance/fiscal_localizations/belgium.rst +++ b/content/applications/finance/fiscal_localizations/belgium.rst @@ -2,7 +2,271 @@ Belgium ======= -.. _belgium/introduction: +.. _belgium/configuration: + +Configuration +============= + +Install the :guilabel:`🇧🇪 Belgium` :ref:`fiscal localization package +` to get all the default accounting features of the Belgian +localization, following the :abbr:`IFRS(International Financial Reporting Standards)` rules. + +.. _belgium/coa: + +Chart of accounts +================= + +You can reach the :guilabel:`Chart of accounts` by going to :menuselection:`Accounting --> +Configuration --> Accounting: Chart of Accounts`. + +The Belgian chart of accounts includes pre-configured accounts as described in the :abbr:`PCMN(Plan +Comptable Minimum Normalisé)`. To add a new account, click :guilabel:`New`. A new line appears. Fill +it in, click :guilabel:`Save`, and then :guilabel:`Setup` to configure it further. + +.. seealso:: + :doc:`../accounting/get_started/chart_of_accounts` + +.. _belgium/taxes: + +Taxes +===== + +Default Belgian taxes are created automatically when the :guilabel:`Belgium - Accounting` and +the :guilabel:`Belgium - Accounting Reports` modules are installed. Each tax impacts the Belgian +:guilabel:`Tax Report`, available by going to :menuselection:`Accounting --> Reporting --> +Statements Reports: Tax Report`. + +In Belgium, the standard VAT rate is **21%**, but there are lower rates for some categories of goods +and services. An intermediate rate of **12%** is applied on social housing and food served in +restaurants, while a reduced rate of **6%** applies to most basic goods, such as food, water supply, +books, and medicine. A **0%** rate applies to some exceptional goods and services, such as some +daily and weekly publications, as well as recycled goods. + +.. _belgium/non-deductible: + +Non-deductible taxes +-------------------- + +In Belgium, some taxes are not fully deductible, such as taxes on the maintenance of cars. This +means a part of these taxes is considered as an expense. + +In Odoo, you can configure non-deductible taxes by creating tax rules for these taxes and linking +them to the corresponding accounts. This way, the system automatically calculates the taxes and +allocates them to the appropriate accounts. + +To configure a new non-deductible tax, go to :menuselection:`Accounting --> Configuration --> +Accounting: Taxes`, and click :guilabel:`New`: + +#. :guilabel:`Add a line` and select :guilabel:`Base` in the :guilabel:`Based On` column; +#. :guilabel:`Add a line`, then select :guilabel:`on tax` in the :guilabel:`Based on` column and + enter the **non-deductible** percentage in the :guilabel:`%` column; +#. On the :guilabel:`of tax` line, select the :guilabel:`Tax Grid(s)` related to your tax; +#. :guilabel:`Add a line` with the **deductible** percentage in the :guilabel:`%` column; +#. Set :guilabel:`of tax` in :guilabel:`Based On`; +#. Select :guilabel:`411000 VAT recoverable` as account, and select the related tax grid. + +Once you have created a non-deductible tax, you can apply it to your transactions by selecting the +appropriate tax during the encoding of bills and credit notes. The system automatically calculates +the tax amount and allocates it to the corresponding accounts based on the tax rules configured. + +.. example:: + With the Belgian localization, the **21% car** tax is created by default (50% non-deductible). + + .. image:: belgium/deductible-tax.png + :alt: Example of not-fully deductible tax + +.. seealso:: + - :doc:`Taxes <../accounting/taxes>` + - :doc:`../accounting/reporting/tax_returns` + +.. _belgium/reports: + +Reports +======= + +Here is the list of Belgian-specific reports available: + +- Balance sheet; +- Profit & loss; +- Tax report; +- Partner VAT Listing; +- EC Sales List; +- Intrastat. + +You can access Belgian-specific versions of reports by clicking on the **book** icon when on a +report and selecting its Belgian version: **(BE)**. + +.. image:: belgium/belgian-reports.png + :alt: Belgian version of reports + +.. seealso:: + :doc:`../accounting/reporting` + +.. _belgium/disallowed-expenses: + +Disallowed expenses report +-------------------------- + +**Disallowed expenses** are expenses that can be deducted from your accounting result but not from +your fiscal result. + +The **disallowed expenses report** is available by going to :menuselection:`Accounting --> Reporting +--> Management: Disallowed Expenses`. It allows financial results in real-time, and periodic +changes. This report is generated based on the **disallowed expenses categories** that you can reach +by going to :menuselection:`Accounting --> Configuration --> Management: Disallowed Expenses +Categories`. Some categories already exist by default but do not have any rates. Click on +:guilabel:`Set Rates` to update a specific category. + +.. tip:: + - You can add multiple rates for various dates. In that case, the rate used to calculate the + expense depends on the date at which it is calculated, and the rate set for that date. + - If you have the **Fleet** app installed, tick the :guilabel:`Car Category` box when applicable. + This makes the vehicle mandatory while booking a vendor bill. + +To link a disallowed expenses category with a specific account, go to :menuselection:`Accounting --> +Configuration --> Acounting: Chart of Accounts`. Find the account you want, and click on +:guilabel:`Setup`. Add the :guilabel:`Disallowed Expense category` in the :guilabel:`Disallowed +Expenses` field. From now, when an expense is created with this account, the disallowed expense is +calculated based on the rate mentioned in the :guilabel:`Disallowed Expense category`. + +Let's take an example reflecting **restaurant** and **car expenses**. + +.. _belgium/restaurant-expenses: + +Restaurant expenses +~~~~~~~~~~~~~~~~~~~ + +In Belgium, 31% of **restaurant** expenses are non-deductible. Create a new **disallowed expenses +category** and set both :guilabel:`Related Account(s)` and :guilabel:`Current Rate`. + +.. image:: belgium/restaurant-expenses.png + :alt: Disallowed expenses categories + +.. _belgium/vehicle-split: + +Car expenses: vehicle split +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In Belgium, the deductible percentage varies from car to car and, therefore, should be indicated for +each vehicle. To do so, open :menuselection:`Fleet` and select a vehicle. In the :guilabel:`Tax +info` tab, go to the :guilabel:`Disallowed Expenses Rate` section and click on :guilabel:`Add a +line`. Add a :guilabel:`Start Date` and a :guilabel:`%`. The amounts go in the same account for all +car expenses. + +When you create a bill for car expenses, you can link each expense to a specific car by filling the +:guilabel:`Vehicle` column, so the right percentage is applied. + +.. image:: belgium/car-bill.png + :alt: Disallowed expenses categories + +The :guilabel:`vehicle split` option available in the disallowed expenses report allows you to see +the rate and disallowed amount for each car. + +.. image:: belgium/vehicle-split.png + :alt: Disallowed expenses categories + +.. _belgium/forms: + +Fee form 281.50 and form 325 +============================ + +.. _belgium/281.50: + +Fee form 281.50 +--------------- + +Annually, a **281.50 fee form** must be reported to the fiscal authorities. To do so, the tag +`281.50` must be added on the **contact form** of the entities concerned by the **281.50** fee. To +add the tag, open :menuselection:`Contacts`, select the person or company you want to create a +**281.50 fee form** for, and add the `281.50` tag in the :guilabel:`Tags` field. + +.. image:: belgium/281-50.png + :alt: add the tag 281.50 on a contact form + +.. note:: + Make sure the **street, zip code, country**, and **VAT number** are also informed on the + **Contact form**. + +Then, depending on the nature of the expense, add the corresponding `281.50` tag on the impact +accounts. To do so, go to :menuselection:`Accounting --> Configuration --> Accounting: Chart of +Accounts`, and click on :guilabel:`Setup` to add the corresponding `281.50` tag on the impacted +accounts, i.e., :guilabel:`281.50 - Commissions`, depending on the nature of the expense. + +.. _belgium/325: + +Form 325 +-------- + +You can create a **325 form** by going to :menuselection:`Accounting --> Reporting --> Belgium: +Create 325 form`. A new page pops up: select the right options and click :guilabel:`Generate 325 +form`. To open an already generated **325 form**, go to :menuselection:`Accounting --> Reporting --> +Belgium: Open 325 forms`. + +.. image:: belgium/325-form.png + :alt: Add the tag 281-50 on a contact form + +.. _belgium/coda-soda: + +CODA and SODA statements +======================== + +.. _belgium/coda: + +CODA +---- + +**CODA** is an electronic XML format used to import Belgian bank statements. You can download CODA +files from your bank and import them directly into Odoo by clicking :guilabel:`Import Statement` +from your :guilabel:`Bank` journal on your dashboard. + +.. image:: belgium/coda-import.png + :alt: Import CODA files + +.. seealso:: + :ref:`Import bank statements files ` + +.. _belgium/soda: + +SODA +---- + +**SODA** is an electronic XML format used to import accounting entries related to salaries. SODA +files can be imported into the journal you use to record salaries by going to your Accounting +**dashboard** and clicking :guilabel:`Upload` in the related journal card form. + +Once your **SODA** files are imported, the entries are created automatically in your 'salary' +journal. + +.. image:: belgium/soda-import.png + :alt: Import SODA files + +.. _belgium/einvoicing: + +Electronic invoicing +==================== + +Odoo supports the **Peppol BIS Billing 3.0 (UBL)** electronic invoicing format. To enable it for a +customer, go to :menuselection:`Accounting --> Customers --> Customers`, open their contact form, +and under the :guilabel:`Accounting` tab, select the :guilabel:`Peppol BIS Billing 3.0` format. + +.. seealso:: + :doc:`../accounting/customer_invoices/electronic_invoicing` + +.. _belgium/cash-discount: + +Cash discount +============= + +In Belgium, if an early payment discount is offered on an invoice, the tax is calculated based on +the discounted total amount, whether the customer benefits from the discount or not. + +To apply the right tax amount and report it correctly in your VAT return, set the tax reduction as +:guilabel:`Always (upon invoice)`. + +.. seealso:: + :doc:`../accounting/customer_invoices/cash_discounts` + +.. _belgium/pos-restaurant-certification: Fiscal certification: POS restaurant ==================================== @@ -12,14 +276,14 @@ use a government-certified **Cash Register System** for their receipts. This app earnings (excluding VAT, drinks, and take-away food) exceed 25,000 euros. This government-certified system entails the use of a :ref:`certified POS system -`, along with a device called a :ref:`Fiscal Data Module ` (or +`, along with a device called a :ref:`Fiscal Data Module ` (or **black box**) and a :ref:`VAT Signing Card `. .. important:: Do not forget to register as *foodservice industry manager* on the `Federal Public Service Finance registration form `_. -.. _belgium/certified: +.. _belgium/certified-pos: Certified POS system -------------------- @@ -121,7 +385,6 @@ As a pre-requisite, :ref:`activate ` the `Belgian Registered Ca (technical name: `pos_blackbox_be`). .. image:: belgium/be-modules.png - :align: center :alt: black box modules for belgian fiscal certification Once the module is activated, add your VAT number to your company information. To set it up, go to @@ -131,7 +394,6 @@ so, go to the :guilabel:`Employees` app and open an employee form. There, go to settings tab --> Attendance/Point of Sale`, and fill in the :guilabel:`INSZ or BIS number` field. .. image:: belgium/bis-number.png - :align: center :alt: ISNZ or BIS number field on employee form .. tip:: @@ -160,7 +422,6 @@ database. To verify that the IoT Box recognizes the FDM, go to the IoT homepage :guilabel:`IOT Device` section, which should display the FDM. .. image:: belgium/iot-devices.png - :align: center :alt: Hardware status page on a registered IoT Box Then, add the IoT to your POS. To do so, go to :menuselection:`Point of Sale --> Configuration --> diff --git a/content/applications/finance/fiscal_localizations/belgium/281-50.png b/content/applications/finance/fiscal_localizations/belgium/281-50.png new file mode 100644 index 0000000000..07f726b25c Binary files /dev/null and b/content/applications/finance/fiscal_localizations/belgium/281-50.png differ diff --git a/content/applications/finance/fiscal_localizations/belgium/325-form.png b/content/applications/finance/fiscal_localizations/belgium/325-form.png new file mode 100644 index 0000000000..84aea5e3e0 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/belgium/325-form.png differ diff --git a/content/applications/finance/fiscal_localizations/belgium/belgian-reports.png b/content/applications/finance/fiscal_localizations/belgium/belgian-reports.png new file mode 100644 index 0000000000..86dbddc898 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/belgium/belgian-reports.png differ diff --git a/content/applications/finance/fiscal_localizations/belgium/car-bill.png b/content/applications/finance/fiscal_localizations/belgium/car-bill.png new file mode 100644 index 0000000000..1acbe6be6c Binary files /dev/null and b/content/applications/finance/fiscal_localizations/belgium/car-bill.png differ diff --git a/content/applications/finance/fiscal_localizations/belgium/coda-import.png b/content/applications/finance/fiscal_localizations/belgium/coda-import.png new file mode 100644 index 0000000000..597fad093e Binary files /dev/null and b/content/applications/finance/fiscal_localizations/belgium/coda-import.png differ diff --git a/content/applications/finance/fiscal_localizations/belgium/deductible-tax.png b/content/applications/finance/fiscal_localizations/belgium/deductible-tax.png new file mode 100644 index 0000000000..aa51422e53 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/belgium/deductible-tax.png differ diff --git a/content/applications/finance/fiscal_localizations/belgium/disallowed-categories.png b/content/applications/finance/fiscal_localizations/belgium/disallowed-categories.png new file mode 100644 index 0000000000..20d83fb417 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/belgium/disallowed-categories.png differ diff --git a/content/applications/finance/fiscal_localizations/belgium/restaurant-expenses.png b/content/applications/finance/fiscal_localizations/belgium/restaurant-expenses.png new file mode 100644 index 0000000000..0e18a18619 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/belgium/restaurant-expenses.png differ diff --git a/content/applications/finance/fiscal_localizations/belgium/soda-import.png b/content/applications/finance/fiscal_localizations/belgium/soda-import.png new file mode 100644 index 0000000000..82a118bac2 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/belgium/soda-import.png differ diff --git a/content/applications/finance/fiscal_localizations/belgium/vehicle-split.png b/content/applications/finance/fiscal_localizations/belgium/vehicle-split.png new file mode 100644 index 0000000000..02d24895f0 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/belgium/vehicle-split.png differ diff --git a/content/applications/finance/fiscal_localizations/chile.rst b/content/applications/finance/fiscal_localizations/chile.rst index e72daaec00..89fb6c6fbe 100644 --- a/content/applications/finance/fiscal_localizations/chile.rst +++ b/content/applications/finance/fiscal_localizations/chile.rst @@ -734,6 +734,9 @@ sales, sampling, consignment, internal transfers, and basically any product move Delivery Guide from a Sales Process ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. warning:: + A delivery guide should **not** be longer than one page or contain more than 60 product lines. + When a Sales Order is created and confirmed, a Delivery Order is generated. After validating the Delivery Order, the option to create a Delivery Guide is activated. diff --git a/content/applications/finance/fiscal_localizations/ecuador.rst b/content/applications/finance/fiscal_localizations/ecuador.rst index a460ec348f..9751f31519 100644 --- a/content/applications/finance/fiscal_localizations/ecuador.rst +++ b/content/applications/finance/fiscal_localizations/ecuador.rst @@ -54,7 +54,7 @@ localization: - `l10n_ec_edi` - Includes all the technical and functional requirements to generate and validate :doc:`Electronics Documents - <../accounting/receivables/customer_invoices/electronic_invoicing>`, based on the Technical + <../accounting/customer_invoices/electronic_invoicing>`, based on the Technical documentation published by the SRI. The authorized documents are: Invoices, Credit Notes, Debit Notes, Withholdings and Purchase liquidations. @@ -176,7 +176,7 @@ Customer Invoice, Credit Notes and Debit Notes need to use the same journal as t enable it for Ecuador. .. seealso:: - :doc:`../accounting/receivables/customer_invoices/electronic_invoicing` + :doc:`../accounting/customer_invoices/electronic_invoicing` Withholding ----------- @@ -236,7 +236,7 @@ Configure master data Chart of accounts ~~~~~~~~~~~~~~~~~ -The :doc:`chart of accounts <../accounting/getting_started/initial_configuration/chart_of_accounts>` +The :doc:`chart of accounts <../accounting/get_started/chart_of_accounts>` is installed by default as part of the set of data included in the localization module, the accounts are mapped automatically in Taxes, Default Account Payable, Default Account Receivable. @@ -357,7 +357,7 @@ documents can be created from your sales order or manually. They must contain th Customer credit note ~~~~~~~~~~~~~~~~~~~~ -The :doc:`Customer credit note <../accounting/receivables/customer_invoices/credit_notes>` is an +The :doc:`Customer credit note <../accounting/customer_invoices/credit_notes>` is an electronic document that, when validated, is sent to SRI. It is necessary to have a validated (posted) invoice in order to register a credit note. On the invoice there is a button named :guilabel:`Credit note`, click on this button to be directed to the :guilabel:`Create credit note` diff --git a/content/applications/finance/fiscal_localizations/egypt.rst b/content/applications/finance/fiscal_localizations/egypt.rst index f8fe1b54e1..17729f2034 100644 --- a/content/applications/finance/fiscal_localizations/egypt.rst +++ b/content/applications/finance/fiscal_localizations/egypt.rst @@ -122,7 +122,7 @@ Most of these codes are handled automatically by Odoo, provided that your :ref:` .. seealso:: - `Egyptian eInvoicing & eReceipt SDK - Code Tables `_ - - :doc:`../accounting/taxation/taxes/taxes` + - :doc:`../accounting/taxes` .. _egypt/e-invoicing-branches: diff --git a/content/applications/finance/fiscal_localizations/hong_kong.rst b/content/applications/finance/fiscal_localizations/hong_kong.rst index 4afe616bca..82ccf225d8 100644 --- a/content/applications/finance/fiscal_localizations/hong_kong.rst +++ b/content/applications/finance/fiscal_localizations/hong_kong.rst @@ -2,16 +2,6 @@ Hong Kong ========= -Configuration -============= - -:ref:`Install ` the :guilabel:`Hong Kong - Accounting` module to get the features -of the HK localization. - -.. image:: hong_kong/hk-module.png - :align: center - :alt: "Hong Kong - Accounting" localization module marked as "installed" - Add FPS QR codes to invoices ============================ @@ -25,26 +15,23 @@ Activate QR codes Go to :menuselection:`Accounting --> Configuration --> Settings`. Under the :guilabel:`Customer Payments` section, activate the :guilabel:`QR Codes` feature. -.. image:: hong_kong/hk-qr-code-setting.png - :align: center - :alt: "QR Codes" feature activated - FPS bank account configuration ------------------------------ Go to :menuselection:`Contacts --> Configuration --> Bank Accounts` and select the bank account for -which you want to activate FPS. Set the :guilabel:`FPS Type` and fill in the :guilabel:`FPS ID/Phone -Number/Email Address` field depending on the type you chose. +which you want to activate FPS. Set the :guilabel:`Proxy Type` and fill in the :guilabel:`Proxy +Value` field depending on the type you chose. -.. note:: - The account holder's country must be set to Hong Kong on its contact form. +.. important:: + - The account holder's country must be set to Hong Kong on its contact form. + - You could also include the invoice number in the QR code by checking the :guilabel:`Include + Reference` checkbox. .. image:: hong_kong/hk-fps-bank-setting.png - :align: center :alt: FPS bank account configuration .. seealso:: - :doc:`../accounting/bank/setup/bank_accounts` + :doc:`../accounting/bank` Bank journal configuration -------------------------- @@ -53,7 +40,6 @@ Go to :menuselection:`Accounting --> Configuration --> Journals`, open the bank out the :guilabel:`Account Number` and :guilabel:`Bank` under the :guilabel:`Journal Entries` tab. .. image:: hong_kong/hk-bank-account-journal-setting.png - :align: center :alt: Bank Account's journal configuration Issue invoices with FPS QR codes @@ -63,7 +49,6 @@ When creating a new invoice, open the :guilabel:`Other Info` tab and set the :gu QR-code` option to *EMV Merchant-Presented QR-code*. .. image:: hong_kong/hk-qr-code-invoice-setting.png - :align: center :alt: Select EMV Merchant-Presented QR-code option Ensure that the :guilabel:`Recipient Bank` is the one you configured, as Odoo uses this field to diff --git a/content/applications/finance/fiscal_localizations/hong_kong/hk-fps-bank-setting.png b/content/applications/finance/fiscal_localizations/hong_kong/hk-fps-bank-setting.png index bb1ec5cf9d..a87ec885b4 100644 Binary files a/content/applications/finance/fiscal_localizations/hong_kong/hk-fps-bank-setting.png and b/content/applications/finance/fiscal_localizations/hong_kong/hk-fps-bank-setting.png differ diff --git a/content/applications/finance/fiscal_localizations/hong_kong/hk-module.png b/content/applications/finance/fiscal_localizations/hong_kong/hk-module.png deleted file mode 100644 index 3a534b28ab..0000000000 Binary files a/content/applications/finance/fiscal_localizations/hong_kong/hk-module.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/hong_kong/hk-qr-code-setting.png b/content/applications/finance/fiscal_localizations/hong_kong/hk-qr-code-setting.png deleted file mode 100644 index d85cbcf285..0000000000 Binary files a/content/applications/finance/fiscal_localizations/hong_kong/hk-qr-code-setting.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/india.rst b/content/applications/finance/fiscal_localizations/india.rst index 9a45849dfe..5749dd17a3 100644 --- a/content/applications/finance/fiscal_localizations/india.rst +++ b/content/applications/finance/fiscal_localizations/india.rst @@ -352,7 +352,7 @@ Return Period** if it does not exist. GST Return file-in is done in **three step .. note:: **Tax Return Periodicity** can be - :doc:`configured <../accounting/reporting/declarations/tax_returns>` according to the user's + :doc:`configured <../accounting/reporting/tax_returns>` according to the user's needs. .. _india/gstr-1: diff --git a/content/applications/finance/fiscal_localizations/italy.rst b/content/applications/finance/fiscal_localizations/italy.rst index 13de86b293..c520d34860 100644 --- a/content/applications/finance/fiscal_localizations/italy.rst +++ b/content/applications/finance/fiscal_localizations/italy.rst @@ -48,19 +48,11 @@ section, click :guilabel:`Update info`. From here, fill out the fields: - :guilabel:`VAT`: VAT of the company; - :guilabel:`Codice Fiscale`: the fiscal code of the company; - :guilabel:`Tax System`: the tax system under which the company falls; -- :guilabel:`PEC address email`: the certified email address of the company. .. image:: italy/italy-company.png :align: center :alt: Company information to provide -PEC mail --------- - -The **PEC email** is a specific type of **certified** email providing a legal equivalent to the -traditional registered mail. The **PEC email** of the main company must be the same as the one -registered by the **Agenzia delle Entrate** authorities. - E-invoicing ----------- @@ -99,7 +91,7 @@ XML file can be found in the **chatter** of the invoice. :alt: Electronic invoicing status (waiting for confirmation) .. seealso:: - :doc:`../accounting/receivables/customer_invoices/electronic_invoicing` + :doc:`../accounting/customer_invoices/electronic_invoicing` File processing authorization (Odoo) ------------------------------------ diff --git a/content/applications/finance/fiscal_localizations/luxembourg.rst b/content/applications/finance/fiscal_localizations/luxembourg.rst index 52d045d399..0ad449feab 100644 --- a/content/applications/finance/fiscal_localizations/luxembourg.rst +++ b/content/applications/finance/fiscal_localizations/luxembourg.rst @@ -47,7 +47,7 @@ To download it, go to :menuselection:`Accounting --> Report --> Audit Reports -- click on :guilabel:`Export eCDF declaration`. .. seealso:: - - :doc:`../accounting/reporting/declarations/tax_returns` + - :doc:`../accounting/reporting/tax_returns` - `Platform for electronic gathering of financial data (eCDF) `_ Annual tax report diff --git a/content/applications/finance/fiscal_localizations/mexico.rst b/content/applications/finance/fiscal_localizations/mexico.rst index cdf7eaf96a..d2bf122e42 100644 --- a/content/applications/finance/fiscal_localizations/mexico.rst +++ b/content/applications/finance/fiscal_localizations/mexico.rst @@ -33,7 +33,7 @@ localization in Odoo, it is necessary to meet the following requirements: `_ (CSD). #. Choose a PAC and purchase stamps. Currently the Mexican location in Odoo works with the following PACs: `Solución Factible `_, `Quadrum (formerly Finkok) - `_ and `SW Sapien - Smarter Web `_. + `_ and `SW Sapien - Smarter Web `_. #. Have knowledge and experience with billing, sales and accounting in Odoo. This documentation contains only the information necessary to enable the use of Odoo in a company based in Mexico. @@ -211,7 +211,7 @@ working with and the credentials. That way, electronic invoicing will be enabled Remember that you must register directly with the PAC of your choice before you start creating invoices from Odoo. We have the following PACs available: `Quadrum `_, `Solución Factible `_ - and `SW Sapien - Smarter Web `_. + and `SW Sapien - Smarter Web `_. You must process your **Private Key (CSD)** with the SAT institution before following these steps. If you do not have this information, try with the Test Credentials and return to this @@ -545,7 +545,7 @@ Once the payment is made, it will be associated with the corresponding invoice a be *In Payment* since the payment will be effectively validated when it is bank reconciled. .. seealso:: - :doc:`../accounting/bank/reconciliation/use_cases`. + :doc:`../accounting/bank/reconciliation`. .. image:: mexico/mx_ft_18.png :align: center diff --git a/content/applications/finance/fiscal_localizations/peru.rst b/content/applications/finance/fiscal_localizations/peru.rst index 971f44c86c..c9fe55ca83 100644 --- a/content/applications/finance/fiscal_localizations/peru.rst +++ b/content/applications/finance/fiscal_localizations/peru.rst @@ -233,7 +233,7 @@ directly to its services and get the currency rate either automatically or manua :alt: Bank of Peru is displayed in Multicurrency Service option Please refer to the next section in our documentation for more information about -:doc:`multicurrencies <../accounting/others/multi_currency>`. +:doc:`multicurrencies <../accounting/get_started/multi_currency>`. Configure Master data --------------------- @@ -354,7 +354,7 @@ EDI Elements Once you have configured your master data, the invoices can be created from your sales order or manually. Additional to the basic invoice information described on :doc:`our page about the -invoicing process <../accounting/receivables/customer_invoices/overview>`, there are a couple of +invoicing process <../accounting/customer_invoices/overview>`, there are a couple of fields required as part of the Peru EDI: - **Document type**: The default value is “Factura Electronica” but you can manually change the @@ -572,7 +572,7 @@ By default the Credit Note is set in the document type: :alt: Credit Note document type To finish the workflow please follow the instructions on :doc:`our page about Credit Notes -<../accounting/receivables/customer_invoices/credit_notes>`. +<../accounting/customer_invoices/credit_notes>`. .. note:: The EDI workflow for the Credit notes works in the same way as the invoices. diff --git a/content/applications/finance/fiscal_localizations/philippines.rst b/content/applications/finance/fiscal_localizations/philippines.rst new file mode 100644 index 0000000000..5d64130be3 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/philippines.rst @@ -0,0 +1,95 @@ +=========== +Philippines +=========== + +Configuration +============= + +:ref:`Install ` the :guilabel:`🇵🇭 Philippines` :ref:`fiscal localization package +` to get all the default accounting features of the Philippine +localization, such as a chart of accounts, taxes, and the BIR 2307 report. These provide a base +template to get started with using Philippine accounting. + +.. note:: + - When creating a new database and `Philippines` is selected as a country, the fiscal + localization module **Philippines - Accounting** is automatically installed. + - If installing the module in an existing company, the **chart of accounts** and **taxes** will + *not* be replaced if there are already posted journal entries. + - The BIR 2307 report is installed, but the withholding taxes may need to be manually created. + +Chart of accounts and taxes +--------------------------- + +A minimum configuration default chart of accounts is installed, and the following types of taxes are +installed and also linked to the relevant account: + +- VAT 12% +- VAT Exempt +- Withholding taxes + +For the withholding taxes, there is an additional :guilabel:`Philippines ATC` field under the +:guilabel:`Philippines` tab. + +.. image:: philippines/philippines-atc-code.png + :alt: Philippines ATC code field set on taxes. + +Taxes' ATC codes are used for the BIR 2307 report. If a tax is created manually, its ATC code must +be added. + +Contacts +-------- + +When a company or an individual (not belonging to a company) contact is located in the Philippines, +fill in the :guilabel:`Tax ID` field with their `Taxpayer Identification Number (TIN)`. + +For individuals not belonging to a company, identify them by using the following additional fields: + +- :guilabel:`First Name` +- :guilabel:`Middle Name` +- :guilabel:`Last Name` + +.. image:: philippines/philippines-contact-individual.png + :alt: Individual type contact with First, Middle, and Last Name fields. + +.. note:: + For both :guilabel:`Company` and :guilabel:`Individual`, the TIN should follow the + `NNN-NNN-NNN-NNNNN` format. The branch code should follow the last digits of the TIN, or else it + can be left as `00000`. + +BIR 2307 report +=============== + +**BIR 2307** report data, also known as *Certificate of Creditable Tax Withheld at Source*, +can be generated for purchase orders and vendor payments with the applicable withholding taxes. + +To generate a BIR 2307 report, select one or multiple vendor bills from the list view, and click +:menuselection:`Action --> Download BIR 2307 XLS`. + +.. image:: philippines/philippines-multi-bill.png + :alt: Multiple vendor bills selected with action to "Download BIR 2307 XLS". + +The same action can be performed on a vendor bill from the form view. + +A pop-up appears to review the selection, then click on :guilabel:`Generate`. + +.. image:: philippines/philippines-generate.png + :alt: Pop up menu to generate BIR 2307 XLS file. + +This generates the `Form_2307.xls` file that lists all the vendor bill lines with the applicable +withholding tax. + +The same process above can also be done for a *single* vendor :doc:`payment +<../accounting/payments>` if they were linked to one or more :doc:`vendor bills +<../accounting/payments/multiple>` with applied withholding taxes. + +.. note:: + - If there is no withholding tax applied, then the XLS file will not generate records for those + vendor bill lines. + - When grouping payments for multiple bills, Odoo splits the payments based on the contact. From + a payment, clicking :menuselection:`Action --> Download BIR 2307 XLS`, generates a report that + only includes vendor bills related to that contact. + +.. important:: + Odoo cannot generate the BIR 2307 PDF report or DAT files directly. + The generated `Form_2307.xls` file can be exported to an *external* tool to convert it to BIR DAT + or PDF format. diff --git a/content/applications/finance/fiscal_localizations/philippines/philippines-atc-code.png b/content/applications/finance/fiscal_localizations/philippines/philippines-atc-code.png new file mode 100644 index 0000000000..10b08cf9e5 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/philippines/philippines-atc-code.png differ diff --git a/content/applications/finance/fiscal_localizations/philippines/philippines-contact-company.png b/content/applications/finance/fiscal_localizations/philippines/philippines-contact-company.png new file mode 100644 index 0000000000..73587e6810 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/philippines/philippines-contact-company.png differ diff --git a/content/applications/finance/fiscal_localizations/philippines/philippines-contact-individual.png b/content/applications/finance/fiscal_localizations/philippines/philippines-contact-individual.png new file mode 100644 index 0000000000..65d2e4748d Binary files /dev/null and b/content/applications/finance/fiscal_localizations/philippines/philippines-contact-individual.png differ diff --git a/content/applications/finance/fiscal_localizations/philippines/philippines-generate.png b/content/applications/finance/fiscal_localizations/philippines/philippines-generate.png new file mode 100644 index 0000000000..d12e6de6e8 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/philippines/philippines-generate.png differ diff --git a/content/applications/finance/fiscal_localizations/philippines/philippines-multi-bill.png b/content/applications/finance/fiscal_localizations/philippines/philippines-multi-bill.png new file mode 100644 index 0000000000..25869f5c24 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/philippines/philippines-multi-bill.png differ diff --git a/content/applications/finance/fiscal_localizations/saudi_arabia.rst b/content/applications/finance/fiscal_localizations/saudi_arabia.rst new file mode 100644 index 0000000000..778aee69b6 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/saudi_arabia.rst @@ -0,0 +1,142 @@ +============ +Saudi Arabia +============ + +Configuration +============= + +:ref:`Install ` the following modules to get all the features of the Saudi Arabian +localization: + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name + - Technical name + - Description + * - Saudi Arabia - Accounting + - `l10n_sa` + - Default :ref:`fiscal localization package ` + * - Saudi Arabia - E-invoicing + - `l10n_sa_edi` + - ZATCA e-invoices implementation + * - Saudi Arabia - Point of Sale + - `l10n_sa_pos` + - Point of Sale compliance + +ZATCA e-invoices +================ + +The ZATCA e-invoicing system is designed to streamline and digitize the invoicing process for +businesses operating in Saudi Arabia. + +.. seealso:: + `ZATCA e-invoicing page `_ + +Company information +------------------- + +Go to :menuselection:`Settings --> General Settings --> Companies`, click :guilabel:`Update info`, +and ensure the following company information is complete and up-to-date. + +- The full :guilabel:`Company Name`. +- All relevant :guilabel:`Address` fields, including the :guilabel:`Building Number` and + :guilabel:`Plot Identification` (four digits each). +- Select an enterprise :guilabel:`Identification Scheme`. It is recommended to use the + :guilabel:`Commercial Registration Number`. +- Enter the :guilabel:`Identification Number` for the selected :guilabel:`Identification Scheme`. +- The :guilabel:`VAT` number. +- Ensure the :guilabel:`Currency` is set to :guilabel:`SAR`. + +.. note:: + It is also necessary to fill out similar information for partner companies. + +Simulation mode +--------------- + +.. important:: + It is strongly recommended to thoroughly test all invoicing workflows using the Fatoora + **simulation** portal first, as **any** invoice submitted to the regular Fatoora portal will be + accounted for, which could lead to fines and penalties. + +Fatoora simulation portal +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Log in on the `Fatoora portal `_ using the company's ZATCA +credentials. Then, click the :guilabel:`Fatoora Simulation Portal` button to switch to the +simulation portal. + +.. seealso:: + `ZACTA Fatoora portal user manual version 3 (May 2023) `_ + +.. _saudi-arabia/api-mode: + +ZATCA API integration +~~~~~~~~~~~~~~~~~~~~~ + +On Odoo, go to :menuselection:`Accounting --> Configuration --> Settings`. Under :guilabel:`ZATCA +API Integration`, select the :guilabel:`Simulation (Pre-Production)` :guilabel:`API mode` and click +:guilabel:`Save`. + +.. _saudi-arabia/journals: + +Sales journals +~~~~~~~~~~~~~~ + +Each sales journal on Odoo needs to be configured. To do so, go to :menuselection:`Accounting --> +Configuration --> Journals`, open any sales journal (e.g., Customer Invoices), and go to the +:guilabel:`ZATCA` tab. Once there, enter any :guilabel:`Serial Number` to identify the journal. + +.. note:: + The same serial number can be used for all of the company's sales journals. + +Next, click :guilabel:`Onboard Journal`. In the dialog box, providing an :abbr:`OTP (one-time +password)` code is required. To retrieve it, open the `Fatoora simulation portal +`_, click :guilabel:`Onboard New Solution Unit/Device`, choose the +number of OTP codes to generate (one per journal to configure), and click :guilabel:`Generate OTP +Code`. Copy an OTP code, it into the dialog box on Odoo, and click :guilabel:`Request`. + +.. note:: + OTP codes expire after one hour. + +.. tip:: + If any issue occurs during onboarding, click :guilabel:`Regenerate CSR` to start again. + +Testing +~~~~~~~ + +When confirming an invoice, there is now an option to process the invoice, sending it directly the +Fatoora simulation portal. Odoo displays the portal's response after each submission. Only rejected +invoices can be reset to draft and edited on Odoo. Furthermore, at the end of each day, Odoo sends +all unprocessed invoices to the portal. + +.. tip:: + - Testing all invoicing workflows, preferably with real invoices and for a reasonable amount of + time, is recommended. + - Compare the invoices received statistics page on the Fatoora simulation portal with the list of + invoices on Odoo to ensure both align. + +Taxes +~~~~~ + +When using a **0% tax** in a customer invoice, it is necessary to specify the reason behind such a +rate. To configure taxes, go to :menuselection:`Accounting --> Configuration --> Settings --> +Taxes`, and open the tax to edit. Under the :guilabel:`Advanced Options`, select an +:guilabel:`Exemption Reason Code` and click :guilabel:`Save`. + +When using **retention** or **withholding an amount** in a customer invoice, the tax used to retain +the amount needs to be specified. + +Production mode +--------------- + +When ready for production, change the :ref:`API mode ` to +:guilabel:`Production` and click :guilabel:`Save`. + +.. warning:: + Setting the :guilabel:`API mode` to :guilabel:`Production` is **irreversible**. + +The sales journals initially linked to the simulation portal now needs to be linked to the regular +portal. To do so, :ref:`onboard the journals ` again, ensuring to use the +regular `Fatoora portal `_ this time. diff --git a/content/applications/finance/fiscal_localizations/singapore.rst b/content/applications/finance/fiscal_localizations/singapore.rst new file mode 100644 index 0000000000..674293e5bd --- /dev/null +++ b/content/applications/finance/fiscal_localizations/singapore.rst @@ -0,0 +1,54 @@ +========= +Singapore +========= + +Add PayNow QR codes to invoices +=============================== + +PayNow is a payment service platform that allows customers to make instant domestic payments to +individuals and merchants in Singapore dollars via online and mobile banking. + +Activate QR codes +----------------- + +Go to :menuselection:`Accounting --> Configuration --> Settings`. Under the :guilabel:`Customer +Payments` section, activate the :guilabel:`QR Codes` feature. + +PayNow bank account configuration +--------------------------------- + +Go to :menuselection:`Contacts --> Configuration --> Bank Accounts` and select the bank account for +which you want to activate PayNow. Set the :guilabel:`Proxy Type` and fill in the :guilabel:`Proxy +Value` field depending on the type you chose. + +.. important:: + - The account holder's country must be set to Singapore on its contact form. + - You could also include the invoice number in the QR code by checking the :guilabel:`Include + Reference` checkbox. + +.. image:: singapore/sg-paynow-bank-setting.png + :alt: PayNow bank account configuration + +.. seealso:: + :doc:`../accounting/bank` + +Bank journal configuration +-------------------------- + +Go to :menuselection:`Accounting --> Configuration --> Journals`, open the bank journal, then fill +out the :guilabel:`Account Number` and :guilabel:`Bank` under the :guilabel:`Journal Entries` tab. + +.. image:: singapore/sg-bank-account-journal-setting.png + :alt: Bank Account's journal configuration + +Issue invoices with PayNow QR codes +----------------------------------- + +When creating a new invoice, open the :guilabel:`Other Info` tab and set the :guilabel:`Payment +QR-code` option to *EMV Merchant-Presented QR-code*. + +.. image:: singapore/sg-qr-code-invoice-setting.png + :alt: Select EMV Merchant-Presented QR-code option + +Ensure that the :guilabel:`Recipient Bank` is the one you configured, as Odoo uses this field to +generate the PayNow QR code. diff --git a/content/applications/finance/fiscal_localizations/singapore/sg-bank-account-journal-setting.png b/content/applications/finance/fiscal_localizations/singapore/sg-bank-account-journal-setting.png new file mode 100644 index 0000000000..b2dc258b1f Binary files /dev/null and b/content/applications/finance/fiscal_localizations/singapore/sg-bank-account-journal-setting.png differ diff --git a/content/applications/finance/fiscal_localizations/singapore/sg-paynow-bank-setting.png b/content/applications/finance/fiscal_localizations/singapore/sg-paynow-bank-setting.png new file mode 100644 index 0000000000..a87ec885b4 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/singapore/sg-paynow-bank-setting.png differ diff --git a/content/applications/finance/fiscal_localizations/singapore/sg-qr-code-invoice-setting.png b/content/applications/finance/fiscal_localizations/singapore/sg-qr-code-invoice-setting.png new file mode 100644 index 0000000000..6df1d58385 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/singapore/sg-qr-code-invoice-setting.png differ diff --git a/content/applications/finance/fiscal_localizations/united_arab_emirates.rst b/content/applications/finance/fiscal_localizations/united_arab_emirates.rst index 85971eacbc..2ec613a0e6 100644 --- a/content/applications/finance/fiscal_localizations/united_arab_emirates.rst +++ b/content/applications/finance/fiscal_localizations/united_arab_emirates.rst @@ -116,7 +116,7 @@ Taxes ===== To access your taxes, go to :menuselection:`Accounting --> Configuration --> Taxes`. -Activate/deactivate, or :doc:`configure ` the +Activate/deactivate, or :doc:`configure ` the taxes relevant to your business by clicking on them. Remember to only set tax accounts on the **5%** tax group, as other groups do not need closing. To do so, enable the :doc:`developer mode <../../general/developer_mode>` and go to :menuselection:`Configuration --> Tax Groups`. Then, set a diff --git a/content/applications/finance/fiscal_localizations/united_kingdom.rst b/content/applications/finance/fiscal_localizations/united_kingdom.rst index b89f0be722..d3a096d077 100644 --- a/content/applications/finance/fiscal_localizations/united_kingdom.rst +++ b/content/applications/finance/fiscal_localizations/united_kingdom.rst @@ -61,7 +61,7 @@ To edit existing taxes or to :guilabel:`Create` a new tax, go to :menuselection: Configuration --> Accounting: Taxes`. .. seealso:: - - :doc:`taxes <../accounting/taxation/taxes>` + - :doc:`taxes <../accounting/taxes>` - Tutorial: `Tax report and return `_. diff --git a/content/applications/finance/fiscal_localizations/vietnam.rst b/content/applications/finance/fiscal_localizations/vietnam.rst new file mode 100644 index 0000000000..62cece0522 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/vietnam.rst @@ -0,0 +1,55 @@ +======= +Vietnam +======= + +Add Vietnamese QR banking codes to invoices +=========================================== + +Vietnamese QR banking is a payment service platform that allows customers to make instant domestic +payments to individuals and merchants in Vietnamese dong via online and mobile banking. + +Activate QR codes +----------------- + +Go to :menuselection:`Accounting --> Configuration --> Settings`. Under the :guilabel:`Customer +Payments` section, activate the :guilabel:`QR Codes` feature. + +Vietnamese QR banking bank account configuration +------------------------------------------------ + +Go to :menuselection:`Contacts --> Configuration --> Bank Accounts` and select the bank account for +which you want to activate Vietnamese QR banking. Set the :guilabel:`Bank Identifier Code` on the +bank. Then set the :guilabel:`Proxy Type` and fill in the :guilabel:`Proxy Value` field depending on +the type you chose. + +.. important:: + - The account holder's country must be set to Vietnam on its contact form. + - You could also include the invoice number in the QR code by checking the :guilabel:`Include + Reference` checkbox. + +.. image:: vietnam/vn-paynow-bank-setting.png + :alt: Vietnamese QR banking bank account configuration + +.. seealso:: + :doc:`../accounting/bank` + +Bank journal configuration +-------------------------- + +Go to :menuselection:`Accounting --> Configuration --> Journals`, open the bank journal, then fill +out the :guilabel:`Account Number` and :guilabel:`Bank` under the :guilabel:`Journal Entries` tab. + +.. image:: vietnam/vn-bank-account-journal-setting.png + :alt: Bank Account's journal configuration + +Issue invoices with Vietnamese QR banking QR codes +-------------------------------------------------- + +When creating a new invoice, open the :guilabel:`Other Info` tab and set the :guilabel:`Payment +QR-code` option to *EMV Merchant-Presented QR-code*. + +.. image:: vietnam/vn-qr-code-invoice-setting.png + :alt: Select EMV Merchant-Presented QR-code option + +Ensure that the :guilabel:`Recipient Bank` is the one you configured, as Odoo uses this field to +generate the Vietnamese QR banking QR code. diff --git a/content/applications/finance/fiscal_localizations/vietnam/vn-bank-account-journal-setting.png b/content/applications/finance/fiscal_localizations/vietnam/vn-bank-account-journal-setting.png new file mode 100644 index 0000000000..8906294679 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/vietnam/vn-bank-account-journal-setting.png differ diff --git a/content/applications/finance/fiscal_localizations/vietnam/vn-paynow-bank-setting.png b/content/applications/finance/fiscal_localizations/vietnam/vn-paynow-bank-setting.png new file mode 100644 index 0000000000..f5007e21a5 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/vietnam/vn-paynow-bank-setting.png differ diff --git a/content/applications/finance/fiscal_localizations/vietnam/vn-qr-code-invoice-setting.png b/content/applications/finance/fiscal_localizations/vietnam/vn-qr-code-invoice-setting.png new file mode 100644 index 0000000000..6df1d58385 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/vietnam/vn-qr-code-invoice-setting.png differ diff --git a/content/applications/finance/payment_providers.rst b/content/applications/finance/payment_providers.rst index 24acb80e20..a1a639221c 100644 --- a/content/applications/finance/payment_providers.rst +++ b/content/applications/finance/payment_providers.rst @@ -148,7 +148,7 @@ Online payment providers - - * - :doc:`Stripe ` - - The provider website + - Odoo - |V| - Full only - Full and partial @@ -159,7 +159,7 @@ Online payment providers .. note:: Some of these online payment providers can also be added as :doc:`bank accounts - <../finance/accounting/bank/setup/bank_accounts>`, but this is **not** the same process as adding + <../finance/accounting/bank>`, but this is **not** the same process as adding them as payment providers. Payment providers allow customers to pay online, and bank accounts are added and configured on your Accounting app to do a bank reconciliation, which is an accounting control process. @@ -178,10 +178,9 @@ Bank payments - | :doc:`Wire Transfer ` | When selected, Odoo displays your payment information with a payment reference. You have to approve the payment manually once you have received it on your bank account. -- | SEPA Direct Debit - | Your customers can sign a SEPA Direct Debit mandate online and get their bank account charged - directly. :doc:`Click here <../finance/accounting/receivables/customer_payments/batch_sdd>` for - more information about this payment method. +- | :doc:`SEPA Direct Debit <../finance/accounting/payments/batch_sdd>` + | Your customers can make a bank transfer to register a SEPA Direct Debit mandate and get their + bank account charged directly. .. _payment_providers/features: @@ -379,8 +378,6 @@ Countries Restrict the use of the payment provider to a selection of countries. Leave this field blank to make the payment provider available in all countries. -.. _payment_providers/journal: - Maximum Amount ************** @@ -392,6 +389,8 @@ to make the payment provider available regardless of the payment amount. amount. For example, the **Donation** snippet of the Website app, and the **Checkout** page of the **eCommerce** app when paid delivery methods are enabled. +.. _payment_providers/journal: + Payment journal *************** diff --git a/content/applications/finance/payment_providers/adyen.rst b/content/applications/finance/payment_providers/adyen.rst index f4d8a62dde..ff04a263e2 100644 --- a/content/applications/finance/payment_providers/adyen.rst +++ b/content/applications/finance/payment_providers/adyen.rst @@ -49,8 +49,10 @@ API Key and Client Key In order to retrieve the API Key and the Client Key, log into your Adyen account, go to :menuselection:`Developers --> API Credentials`. + - If you already have an API user, open it. - If you don't have an API user yet, click on **Create new credential**. + Go to :menuselection:`Server settings --> Authentification` and copy or generate your **API Key**. Be careful to copy your API key as you'll not be allowed to get it later without generating a new one. @@ -90,17 +92,32 @@ You have to save the webhook to finalize its creation. .. _adyen/urls: -URLs -~~~~ +API URLs +~~~~~~~~ -To retrieve the URLs, log into your Adyen account, go to :menuselection:`Developers --> API URLs`. -Select one of the URLs listed next to :guilabel:`Classic Recurring API` as your -:guilabel:`Recurring API URL` and one listed next to :guilabel:`Checkout API` as your -:guilabel:`Checkout API URL`. +All Adyen API URLs include a customer area-specific prefix generated by Adyen. To configure the +URLs, proceed as follows: -.. image:: adyen/adyen-api-urls.png - :align: center - :alt: Get the links for the different API. +#. Log into your Adyen account, then go to :menuselection:`Developers --> API URLs`. +#. Copy the :guilabel:`Prefix` for your live Customer area (i.e., **data center**) and save it for + later. + + .. image:: adyen/adyen-api-urls.png + :alt: Copy the prefix for the Adyen APIs + +#. In Odoo, :ref:`navigate to the payment provider Adyen `. +#. In the :guilabel:`Checkout API URL` field, enter the following URL and replace `yourprefix` with + the prefix you previously saved: + `https://yourprefix-checkout-live.adyenpayments.com/checkout` +#. In the :guilabel:`Recurring API URL` field, enter the following URL and replace `yourprefix` with + the prefix you previously saved: + `https://yourprefix-pal-live.adyenpayments.com/pal/servlet/Recurring`. + +.. note:: + If you are trying Adyen as a test, you can use the following URLs instead: + + - :guilabel:`Checkout API URL`: `https://checkout-test.adyen.com` + - :guilabel:`Recurring API URL`: `https://pal-test.adyen.com/pal/servlet/Recurring` Adyen Account ------------- diff --git a/content/applications/finance/payment_providers/adyen/adyen-api-urls.png b/content/applications/finance/payment_providers/adyen/adyen-api-urls.png index 4ad7552ab9..39ccd37f8f 100644 Binary files a/content/applications/finance/payment_providers/adyen/adyen-api-urls.png and b/content/applications/finance/payment_providers/adyen/adyen-api-urls.png differ diff --git a/content/applications/finance/payment_providers/authorize.rst b/content/applications/finance/payment_providers/authorize.rst index c2aa90e66d..3d40f19cc2 100644 --- a/content/applications/finance/payment_providers/authorize.rst +++ b/content/applications/finance/payment_providers/authorize.rst @@ -28,13 +28,11 @@ To retrieve them, log into your Authorize.Net account, go to :menuselection:`Acc Key**. .. important:: - If you are trying Authorize.Net as a test, with a *sandbox account*, change the :guilabel:`State` - to :guilabel:`Test Mode`. We recommend doing this on a test Odoo database, rather than on your - main database. + To test Authorize.Net with a *sandbox* account, change the :guilabel:`State` to :guilabel:`Test + Mode`. We recommend doing this on a test Odoo database, rather than on your main database. - If you set :guilabel:`Test Mode` on Odoo and use an authorize.net account instead of a - sandbox.authorize.net account, it results in the following error: *The merchant login ID or - password is invalid or the account is inactive*. + If you use the :guilabel:`Test Mode` with a regular account, it results in the following error: + *The merchant login ID or password is invalid or the account is inactive*. Configuration tab ----------------- @@ -42,12 +40,131 @@ Configuration tab Place a hold on a card ~~~~~~~~~~~~~~~~~~~~~~ -With Authorize.net, you can enable the :ref:`manual capture +With Authorize.Net, you can enable the :ref:`manual capture `. If enabled, the funds are reserved for 30 days on the customer's card, but not charged yet. .. warning:: - After **30 days**, the transaction is **voided automatically** by Authorize.net. + After **30 days**, the transaction is **voided automatically** by Authorize.Net. .. seealso:: - :doc:`../payment_providers` + +ACH payments (USA only) +======================= + +:abbr:`ACH (automated clearing house)` is an electronic funds transfer system used between bank +accounts in the United States. + +Configuration +------------- + +To give customers the possibility to pay using ACH, `sign up for Authorize.Net eCheck's service +`_. Once eCheck is activated, duplicate the +previously configured Authorize.Net payment provider on Odoo by going to :menuselection:`Accounting +--> Configuration --> Payment Providers --> Authorize.net`. Then, click the cog icon +(:guilabel:`⛭`) and select :guilabel:`Duplicate`. Change the provider's name to differentiate both +versions (e.g., `Authorize.net - Banks`). + +Open the :guilabel:`Configuration` tab, set the :guilabel:`Allow Payments From` field to +:guilabel:`Bank Account (USA only)`. + +When ready, change the provider's :guilabel:`State` to :guilabel:`Enabled` for a regular account or +:guilabel:`Test Mode` for a sandbox account. + +Import an Authorize.Net statement +================================= + +Export from Authorize.Net +------------------------- + +.. _authorize-import-template: + +.. admonition:: Template + + `Download the Excel import template `_ + +To export a statement: + +- Log in to Authorize.Net. +- Go to :menuselection:`Account --> Statements --> eCheck.Net Settlement Statement`. +- Define an export range using an *opening* and *closing* batch settlement. All transactions within + the two batch settlements will be exported to Odoo. +- Select all transactions within the desired range, copy them, and paste them into the + :guilabel:`Report 1 Download` sheet of the :ref:`Excel import template + `. + +.. image:: authorize/authorize-report1.png + :alt: Selecting Authorize.Net transactions to import + +.. example:: + + .. image:: authorize/authorize-settlement-batch.png + :align: center + :alt: Settlement batch of an Authorize.Net statement + + In this case, the first batch (01/01/2021) of the year belongs to the settlement of 12/31/2020, + so the **opening** settlement is from 12/31/2020. + +Once the data is in the :guilabel:`Report 1 Download` sheet: + +- Go to the :guilabel:`Transaction Search` tab on Authorize.Net. +- Under the :guilabel:`Settlement Date` section, select the previously used range of batch + settlement dates in the :guilabel:`From:` and :guilabel:`To:` fields and click :guilabel:`Search`. +- When the list has been generated, click :guilabel:`Download to File`. +- In the pop-up window, select :guilabel:`Expanded Fields with CAVV Response/Comma Separated`, + enable :guilabel:`Include Column Headings`, and click :guilabel:`Submit`. +- Open the text file, select :guilabel:`All`, copy the data, and paste it into the :guilabel:`Report + 2 Download` sheet of the :ref:`Excel import template `. +- Transit lines are automatically filled in and updated in the :guilabel:`transit for report 1` and + :guilabel:`transit for report 2` sheets of the :ref:`Excel import template + `. Make sure all entries are present, and **if not**, copy the formula + from previously filled-in lines of the :guilabel:`transit for report 1` or :guilabel:`2` sheets + and paste it into the empty lines. + +.. important:: + To get the correct closing balance, **do not remove** any line from the Excel sheets. + +Import into Odoo +---------------- + +To import the data into Odoo: + +- Open the :ref:`Excel import template `. +- Copy the data from the :guilabel:`transit for report 2` sheet and use *paste special* to only + paste the values in the :guilabel:`Odoo Import to CSV` sheet. +- Look for *blue* cells in the :guilabel:`Odoo Import to CSV` sheet. These are chargeback entries + without any reference number. As they cannot be imported as such, go to + :menuselection:`Authorize.Net --> Account --> Statements --> eCheck.Net Settlement Statement`. +- Look for :guilabel:`Charge Transaction/Chargeback`, and click it. +- Copy the invoice description, paste it into the :guilabel:`Label` cell of the :guilabel:`Odoo + Import to CSV` sheet, and add `Chargeback /` before the description. +- If there are multiple invoices, add a line into the :ref:`Excel import template + ` for each invoice and copy/paste the description into each respective + :guilabel:`Label` line. + +.. note:: + For **combined chargeback/returns** in the payouts, create a new line in the :ref:`Excel import + template ` for each invoice. + +.. example:: + + .. image:: authorize/authorize-chargeback-desc.png + :alt: Chargeback description + +- Next, delete *zero transaction* and *void transaction* line items, and change the format + of the :guilabel:`Amount` column in the :guilabel:`Odoo Import to CSV` sheet to *Number*. +- Go back to :menuselection:`eCheck.Net Settlement Statement --> Search for a Transaction` and + search again for the previously used batch settlements dates. +- Verify that the batch settlement dates on eCheck.Net match the related payments' dates found in + the :guilabel:`Date` column of the :guilabel:`Odoo Import to CSV`. +- If it does not match, replace the date with the one from eCheck.Net. Sort the column by *date*, + and make sure the format is `MM/DD/YYYY`. +- Copy the data - column headings included - from the :guilabel:`Odoo Import to CSV` sheet, paste + it into a new Excel file, and save it using the CSV format. +- Open the Accounting app, go to :menuselection:`Configuration --> Journals`, tick the + :guilabel:`Authorize.Net` box, and click :menuselection:`Favorites --> Import records --> Load + file`. Select the CSV file and upload it into Odoo. + +.. tip:: + List of `eCheck.Net return codes `_ diff --git a/content/applications/finance/payment_providers/authorize/authorize-chargeback-desc.png b/content/applications/finance/payment_providers/authorize/authorize-chargeback-desc.png new file mode 100644 index 0000000000..9b76b31477 Binary files /dev/null and b/content/applications/finance/payment_providers/authorize/authorize-chargeback-desc.png differ diff --git a/content/applications/finance/payment_providers/authorize/authorize-report1.png b/content/applications/finance/payment_providers/authorize/authorize-report1.png new file mode 100644 index 0000000000..a06e1f84ce Binary files /dev/null and b/content/applications/finance/payment_providers/authorize/authorize-report1.png differ diff --git a/content/applications/finance/payment_providers/authorize/authorize-settlement-batch.png b/content/applications/finance/payment_providers/authorize/authorize-settlement-batch.png new file mode 100644 index 0000000000..42051fb9b3 Binary files /dev/null and b/content/applications/finance/payment_providers/authorize/authorize-settlement-batch.png differ diff --git a/content/applications/finance/payment_providers/paypal.rst b/content/applications/finance/payment_providers/paypal.rst index 521f804b13..c1858d8f19 100644 --- a/content/applications/finance/payment_providers/paypal.rst +++ b/content/applications/finance/payment_providers/paypal.rst @@ -1,106 +1,82 @@ ====== -Paypal +PayPal ====== -`Paypal `_ is available and popular worldwide. It doesn't charge any -subscription fee, and creating an account is very easy. That's why we recommend it for starters in -Odoo. It works as a seamless flow where the customer is routed to the Paypal website to register the -payment. +`Paypal `_ is an American online payment provider available worldwide, and +one of the few that does not charge a subscription fee. -Settings in Odoo -================ - -.. seealso:: - - :ref:`payment_providers/add_new` - -Credentials tab ---------------- - -Odoo needs your **API Credentials** to connect with your PayPal account, which comprise: - -- **Email**: your login email address in Paypal. -- **PDT Identity Token**: the key used to verify the authenticity of transactions. +Settings in PayPal +================== -You can copy your credentials from your Paypal account and paste them into the related fields under -the **Credentials** tab. +To access your PayPal account settings, log into PayPal, open the :guilabel:`Account Settings`, and +open the :guilabel:`Website payments` menu. -To set the **PDT Identity Token**, retrieve the token by following the configuration -step :ref:`paypal/enable-pdt`. +.. image:: paypal/paypal-account.png + :align: center + :alt: PayPal account menu .. important:: - If you are trying Paypal as a test, using a :ref:`Paypal Sandbox account `, - change the **State** to *Test Mode*. We recommend doing this on a test Odoo database rather than - on your main database. + Note that for PayPal to work **in Odoo**, the options :ref:`Auto Return `, + :ref:`PDT `, and :ref:`IPN ` **must** all be enabled. -Fees tab --------- +.. _paypal/auto-return: -You can charge extra fees to your customers for paying with Paypal to cover the transaction fees -Paypal charges you. Once redirected to Paypal, your customer sees an extra amount applied to the -order amount. +Auto Return +----------- -To activate this, go to Paypal configuration's :guilabel:`Fees` tab in Odoo and activate -:guilabel:`Add Extra Fees`. +The **Auto Return** feature automatically redirects customers to Odoo once the payment is processed. -You can refer to `Paypal Fees `_ to set up fees. +From :guilabel:`Website payments`, go to :menuselection:`Website preferences --> Update --> Auto +return for website payments --> Auto return` and select :guilabel:`On`. Enter the address of your +Odoo database (e.g., `https://yourcompany.odoo.com`) in the :guilabel:`Return URL` field, and +:guilabel:`Save`. .. note:: - `Traders in the EU `_ are not allowed to charge extra fees for paying with credit cards. - -Settings in Paypal -================== - -First, set up your Paypal account to build a seamless customer experience with Odoo. + Any URL does the job. Odoo only needs the setting to be enabled since it uses another URL. -Log into your PayPal account and open the account settings. Then, go to :menuselection:`Account menu ---> Account settings --> Website payments`. +.. _paypal/pdt: -Enable Auto Return ------------------- +Payment Data Transfer (PDT) +--------------------------- -The *Auto Return* feature automatically redirects your customers to Odoo once the payment is -processed. +:abbr:`PDT (Payment Data Transfer)` allows to receive payment confirmations, displays the payment +status to the customers, and verifies the authenticity of the payments. From :menuselection:`Website +preferences --> Update`, scroll down to :guilabel:`Payment data transfer` and select :guilabel:`On`. -From the *Website payments* settings page, go to :menuselection:`Website preferences --> Update --> -Auto return for website payments` and select **On**. Enter the address of your Odoo database (e.g., -`https://yourcompany.odoo.com`) in the **Return URL** field. - -.. note:: - Any URL will do the job. Odoo only needs the setting to be enabled since it uses another URL. +.. tip:: + PayPal displays your **PDT Identity Token** as soon as :ref:`Auto return ` + and :ref:`Payment Data Transfer (PDT) ` are enabled. If you need the **PDT Identity + Token**, disable and re-enable :guilabel:`Payment data transfer` to display the token again. -.. _paypal/enable-pdt: +.. _paypal/ipn: -Enable Payment Data Transfer (PDT) +Instant Payment Notification (IPN) ---------------------------------- -Enable the *Payment Data Transfer* feature to receive payment confirmations immediately. This -feature also displays the payment status to the customers and verifies the authenticity of the -payments. +:abbr:`IPN (Instant Payment Notifications)` is similar to **PDT**, but allows for more +notifications, such as chargeback notifications. To enable **IPN**, go to :menuselection:`Website +payments --> Instant payment notifications --> Update` and click :guilabel:`Choose IPN settings`. +Enter a :guilabel:`Notification URL`, select :guilabel:`Receive IPN messages (Enabled)`, and +:guilabel:`Save`. -From the *Website payments* settings page, go to :menuselection:`Website preferences --> Update --> -Payment data transfer` and select **On**. PayPal displays your **PDT Identity Token** as soon as -the change is saved. - -Paypal Account Optional +PayPal Account Optional ----------------------- -We advise you to not prompt customers to log in with a Paypal account when they get to pay. Let them -pay with debit/credit cards as well, or you might lose some deals. Make sure this setting is turned -on. +We advise not to prompt customers to log in with a PayPal account upon payment. It is better and +more accessible for customers to pay with a debit/credit card. To disable that prompt, go to +:menuselection:`Account Settings --> Website payments --> Update` and select :guilabel:`On` for +:guilabel:`PayPal account optional`. Payment Messages Format ----------------------- -Suppose you use accented characters (or anything else than primary Latin characters) for your -customer names or addresses. In that case, you **must** configure the encoding format of the payment -request sent by Odoo to Paypal. Otherwise, some transactions fail without notice. +If you use accented characters (or anything other than primary Latin characters) for customer names +or addresses, then you **must** configure the encoding format of the payment request sent by Odoo to +PayPal. If you do not, some transactions fail without notice. To do so, go to `your production account `_. Then, click *More Options* and set the two default encoding -formats as **UTF-8**. - -Your Paypal account is ready! +?cmd=_profile-language-encoding>`_. Then, click :guilabel:`More Options` and set the two default +encoding formats as :guilabel:`UTF-8`. .. tip:: - For Encrypted Website Payments & EWP_SETTINGS error, please check the `Paypal documentation @@ -110,6 +86,33 @@ Your Paypal account is ready! `link `_ to configure the encoding format in a test environment. +Settings in Odoo +================ + +.. seealso:: + :ref:`payment_providers/add_new` + +Credentials +----------- + +Odoo needs your **API Credentials** to connect with your PayPal account. To do so, go to +:menuselection:`Accounting --> Configuration --> Payment Providers` and :guilabel:`Activate` PayPal. +Then, enter your PayPal account credentials in the :guilabel:`Credentials` tab: + +- :guilabel:`Email`: the login email address in Paypal; +- :guilabel:`PDT Identity Token`: the key used to verify the authenticity of transactions. + +Extra fees +---------- + +You can charge :ref:`extra fees ` to customers choosing to +pay with PayPal in order to cover the transaction fees PayPal charges you. + +.. note:: + - You can refer to `Paypal Fees `_ to set up + fees. + - `Traders in the EU `_ are not allowed to charge extra fees for paying with credit cards. + .. _paypal/testing: Test environment @@ -118,19 +121,20 @@ Test environment Configuration ------------- -Thanks to Paypal Sandbox accounts, you can test the entire payment flow in Odoo. +Thanks to PayPal sandbox accounts, you can test the entire payment flow in Odoo. -Log into the `Paypal Developer Site `_ using your Paypal -credentials, which creates two sandbox accounts: +Log into the `Paypal Developer Site `_ using your PayPal credentials, +which creates two sandbox accounts: - A business account (to use as merchants, e.g., - `pp.merch01-facilitator@example.com `_). + `pp.merch01-facilitator@example.com `_); - A default personal account (to use as shoppers, e.g., `pp.merch01-buyer@example.com `_). -Log into Paypal Sandbox using the merchant account and follow the same configuration instructions. -Enter your sandbox credentials in Odoo and ensure Paypal is set on *Test Mode*. We recommend doing -this on a test Odoo database rather than your main database. +Log into PayPal sandbox using the merchant account and follow the same configuration instructions. +Enter your sandbox credentials in Odoo (:menuselection:`Accounting --> Configuration --> Payment +Providers --> PayPal` in the :guilabel:`Credentials` tab, and make sure the status is set on +:guilabel:`Test Mode`. Run a test transaction from Odoo using the sandbox personal account. diff --git a/content/applications/finance/payment_providers/paypal/paypal-account.png b/content/applications/finance/payment_providers/paypal/paypal-account.png new file mode 100644 index 0000000000..836dd47b5e Binary files /dev/null and b/content/applications/finance/payment_providers/paypal/paypal-account.png differ diff --git a/content/applications/finance/payment_providers/stripe.rst b/content/applications/finance/payment_providers/stripe.rst index f28dc1a61a..e053a63428 100644 --- a/content/applications/finance/payment_providers/stripe.rst +++ b/content/applications/finance/payment_providers/stripe.rst @@ -18,13 +18,12 @@ The method to acquire your credentials depends on your hosting type: .. tabs:: .. group-tab:: Odoo Online - #. Go to the **eCommerce** or the **Sales** app and click on the *Activate Stripe* or the *Set - payments* button on the onboarding banner. + #. Go to the **eCommerce** or the **Sales** app and click the :guilabel:`Activate Stripe` or + the :guilabel:`Set payments` button on the onboarding banner. #. Fill in the requested information and submit the form. #. Confirm your email address when Stripe sends you a confirmation email. #. At the end of the process, you are redirected to Odoo. If you submitted all the requested information, you are all set and your payment provider is enabled. - #. You can continue to :ref:`stripe/local-payment-methods`. .. tip:: To use your own API keys, :ref:`activate the Developer mode ` and @@ -34,24 +33,24 @@ The method to acquire your credentials depends on your hosting type: .. group-tab:: Odoo.sh or On-premise - #. Go to the **eCommerce** or the **Sales** app and click on the *Activate Stripe* or the *Set - payments* button on the onboarding banner. + #. Go to the **eCommerce** or the **Sales** app and click the :guilabel:`Activate Stripe` or + the :guilabel:`Set payments` button on the onboarding banner. #. Fill in the requested information and submit the form. #. Confirm your email address when Stripe sends you a confirmation email. - #. At the end of the process, you are redirected to the payment provider **Stripe** on Odoo. + #. At the end of the process, you are redirected to the payment provider **Stripe** in Odoo. #. :ref:`Fill in your credentials `. #. :ref:`Generate a webhook `. #. Enable the payment provider. - #. You are all set and can continue to :ref:`stripe/local-payment-methods`. .. tip:: - To connect your Stripe account after the onboarding is already completed, go to - :menuselection:`Accounting --> Configuration --> Payment Providers --> Stripe` and click on the - *Connect Stripe* button. + To connect your Stripe account after the onboarding has already been completed, go to + :menuselection:`Accounting --> Configuration --> Payment Providers --> Stripe` and click the + :guilabel:`Connect Stripe` button. .. important:: - If you are testing Stripe (in **test mode**), change the **State** to *Test Mode*. We recommend - doing this on a test Odoo database rather than on your main database. + If you are testing Stripe (in **test mode**), change the :guilabel:`State` to + :guilabel:`Test Mode`. We recommend doing this on a test Odoo database rather than on your main + database. .. _stripe/api-keys: @@ -82,38 +81,42 @@ create a webhook either automatically or manually. .. tab:: Manage the webhook automatically Make sure your :ref:`Publishable and Secret keys ` are filled in, then click - on the :guilabel:`Generate your Webhook` button. + the :guilabel:`Generate your Webhook` button. .. tip:: - To update the webhook, click once again on the :guilabel:`Generate your Webhook` button. + To update the webhook, click once again the :guilabel:`Generate your Webhook` button. .. tab:: Manage the webhook manually Visit the `webhooks page on Stripe `_, or log into your - Stripe dashboard and go to :menuselection:`Developers --> Webhooks`. Then, click on - :guilabel:`Add endpoint` in your :guilabel:`Hosted endpoints` and insert the following data - into the pop-up form: + Stripe dashboard and go to :menuselection:`Developers --> Webhooks`. Then, click + :guilabel:`Add endpoint` and insert the following data in the + :guilabel:`Listen to Stripe events` form: - - | In the :guilabel:`Endpoint URL`, enter your Odoo database's URL followed by - | `/payment/stripe/webhook`. + - | In the :guilabel:`Endpoint URL` field, enter your Odoo database's URL followed by + `/payment/stripe/webhook`. | For example: `https://yourcompany.odoo.com/payment/stripe/webhook` - - At the bottom of the form, you can select events to listen to. Click on :guilabel:`Select - events`. Then: + - At the bottom of the form, click :guilabel:`+ Select events`, then: + - In the :guilabel:`Charge` section, select :guilabel:`charge.refunded` and + :guilabel:`charge.refund.updated`. - In the :guilabel:`Payment Intent` section, select - :guilabel:`payment_intent.amount_capturable_updated` and + :guilabel:`payment_intent.amount_capturable_updated`, + :guilabel:`payment_intent.payment_failed`, :guilabel:`payment_intent.processing` and :guilabel:`payment_intent.succeeded`. - In the :guilabel:`Setup Intent` section, select :guilabel:`setup_intent.succeeded`. + - In the :guilabel:`Charge` section, select :guilabel:`charge.refunded` and + :guilabel:`charge.refund.updated`. .. note:: It is possible to select other events, but they are currently not processed by Odoo. - When you click on :guilabel:`Add endpoint`, your Webhook is configured. Click on - :guilabel:`reveal` to display your signing secret. + Once you have selected the events, click :guilabel:`Add events`, then :guilabel:`Add endpoint` + to generate your webhook. Click :guilabel:`Reveal` to display your signing secret. .. tip:: - To update an existing webhook, click on it. Then, click on the three dots at the right side - of the **Webhook URL** and on :guilabel:`Update details`. + To update an existing webhook, click on it. Then, click the three dots at the right side + of the **Webhook URL** and select :guilabel:`Update details`. Configuration tab ----------------- @@ -127,7 +130,7 @@ Stripe allows you to **capture an amount manually** instead of having an immedia feature earmarks an amount on the customer's account for a determined period of time that depends on the payment method used. -To set it up, enable the :guilabel:`Capture Amount Manually` option on Odoo, as explained in the +To set it up, enable the :guilabel:`Capture Amount Manually` option in Odoo, as explained in the :ref:`payment providers documentation `. .. warning:: @@ -141,43 +144,10 @@ To set it up, enable the :guilabel:`Capture Amount Manually` option on Odoo, as .. seealso:: - :doc:`../payment_providers` -.. _stripe/local-payment-methods: - -Enable local payment methods -============================ - -Local payment methods are payment methods that are only available for certain merchants and -customers countries and currencies. - -Odoo supports the following local payment methods: - -- Bancontact -- EPS -- giropay -- iDEAL -- Przelewy24 (P24) - -To enable some of these local payment methods with Stripe, go to -:menuselection:`Payment Providers --> Stripe --> Configuration` and add the desired -payment methods in the **Supported Payment Methods** field. If the desired payment method is already -listed, you don't have anything to do. - -.. image:: stripe/stripe_enable_local_payment_method.png - :align: center - :alt: Select and add icons of the payment methods you want to enable - -.. note:: - - If a payment method record does not exist in the database and its related local payment method is - listed above, it is considered enabled with Stripe. - - If a local payment method is not listed above, it is not supported and cannot be enabled. - .. _stripe/express-checkout: Enable express checkout -======================= - -.. seealso:: - :ref:`payment_providers/features/express_checkout` +~~~~~~~~~~~~~~~~~~~~~~~ After ticking the :guilabel:`Allow Express Checkout` checkbox, **Google Pay** is enabled out of the box, but **Apple Pay** requires extra steps: You must register your web domain with Apple. This can @@ -187,7 +157,7 @@ be done either automatically from Odoo, or manually from Stripe. .. tab:: Register automatically from Odoo #. Navigate to your payment provider and make sure that it is :guilabel:`enabled`. - #. Go to the :guilabel:`Configuration` tab and click on the :guilabel:`Enable Apple Pay` + #. Go to the :guilabel:`Configuration` tab and click the :guilabel:`Enable Apple Pay` button. A notification shows that the web domain was successfully registered with Apple. .. tab:: Register manually from Stripe @@ -195,9 +165,12 @@ be done either automatically from Odoo, or manually from Stripe. Visit the `Apple pay web domains page on Stripe `_, or log into your Stripe dashboard and go to :menuselection:`Settings --> Payments methods --> Apple Pay --> Configure - --> Web domains`. Then, click on :guilabel:`Add new domain` and insert the web domain of your + --> Web domains`. Then, click :guilabel:`Add new domain` and insert the web domain of your Odoo database into the pop-up form. Odoo already hosts the verification file of Stripe. Click - on :guilabel:`Add` to register your web domain with Apple. + :guilabel:`Add` to register your web domain with Apple. .. important:: This operation must be repeated whenever your web domain changes. + +.. seealso:: + - :ref:`payment_providers/features/express_checkout` diff --git a/content/applications/finance/payment_providers/stripe/stripe_enable_local_payment_method.png b/content/applications/finance/payment_providers/stripe/stripe_enable_local_payment_method.png index 24959b2c0f..cba21b87c3 100644 Binary files a/content/applications/finance/payment_providers/stripe/stripe_enable_local_payment_method.png and b/content/applications/finance/payment_providers/stripe/stripe_enable_local_payment_method.png differ diff --git a/content/applications/finance/payment_providers/wire_transfer.rst b/content/applications/finance/payment_providers/wire_transfer.rst index 0961ddcc3b..1df35dd455 100644 --- a/content/applications/finance/payment_providers/wire_transfer.rst +++ b/content/applications/finance/payment_providers/wire_transfer.rst @@ -1,39 +1,54 @@ -=================================== -How to get paid with wire transfers -=================================== +============== +Wire transfers +============== -**Wire Transfer** is the default payment method available. The aim is providing your customers with -your bank details so they can pay on their own. This is very easy to start with but slow and -inefficient process-wise. Opt for payment providers as soon as you can! +The **Wire transfer** payment method allows you to provide payment instructions to your customers, +such as the bank details and communication. They are displayed: -How to provide customers with payment instructions -================================================== +- at the end of the checkout process, once the customer has selected :guilabel:`Wire transfer` as a + payment method and clicked the :guilabel:`Pay now` button: -Put your payment instructions in the **Thanks Message** of your payment method. + .. image:: wire_transfer/payment_instructions_checkout.png + :alt: Payment instructions at checkout -.. image:: wire_transfer/payment_instructions.png - :align: center +- on the customer portal: + + .. image:: wire_transfer/payment_instructions_portal.png + :alt: Payment instructions on the customer portal + +.. note:: + - While this method is very accessible and requires minimal setup, it is very inefficient + process-wise. We recommend setting up a :doc:`payment provider <../payment_providers>` instead. + - Online orders remain in the :guilabel:`Quotation sent` (i.e., unpaid order) stage until you + receive the payment and :guilabel:`Confirm` the order. -They will appear to the customers when they place an order. +.. tip:: + **Wire transfer** can be used as a template for other payment methods that are processed + manually, such as checks, by renaming or duplicating it. -.. image:: wire_transfer/payment_customer_instructions.png - :align: center +Configuration +============= -How to manage an order once you get paid -======================================== +To configure **Wire Transfer**, go to :menuselection:`Accounting / Website --> Configuration --> +Payment Providers`, and open the :guilabel:`Wire Transfer` card. Then, in the +:guilabel:`Configuration` tab: -Whenever a customer pays by wire transfer, the order stays in an intermediary stage **Quotation -Sent** (i.e. unpaid order). When you get paid, you confirm the order manually to launch the -delivery. +- Select the :guilabel:`Communication` to be used; -How to create other manual payment methods -========================================== + - :guilabel:`Based on Document Reference`: sales order or invoice number + - :guilabel:`Based on Customer ID`: customer identifier -If you manage a B2B business, you can create other manually-processed payment methods like paying by -check. To do so, just rename *Wire Transfer* or duplicate it. +- Tick the :guilabel:`Enable QR codes` check box to activate :doc:`QR code payments + <../accounting/customer_invoices/epc_qr_code>`. + +Define the payment instructions in the :guilabel:`Messages` tab: + +.. image:: wire_transfer/payment_instructions.png + :alt: Define payment instructions -.. image:: wire_transfer/payment_check.png - :align: center +If you have already defined :doc:`a bank account <../accounting/bank>`, the account number will be +automatically added to the default message generated by Odoo. You can also add it afterwards and +update the message by clicking :guilabel:`Reload pending message`. .. seealso:: - - :doc:`../payment_providers` + :ref:`payment_providers/journal` diff --git a/content/applications/finance/payment_providers/wire_transfer/payment_check.png b/content/applications/finance/payment_providers/wire_transfer/payment_check.png deleted file mode 100644 index 5cfd97c50e..0000000000 Binary files a/content/applications/finance/payment_providers/wire_transfer/payment_check.png and /dev/null differ diff --git a/content/applications/finance/payment_providers/wire_transfer/payment_customer_instructions.png b/content/applications/finance/payment_providers/wire_transfer/payment_customer_instructions.png deleted file mode 100644 index a18f10a0dc..0000000000 Binary files a/content/applications/finance/payment_providers/wire_transfer/payment_customer_instructions.png and /dev/null differ diff --git a/content/applications/finance/payment_providers/wire_transfer/payment_instructions.png b/content/applications/finance/payment_providers/wire_transfer/payment_instructions.png index f3f9375b4f..feb3d5808c 100644 Binary files a/content/applications/finance/payment_providers/wire_transfer/payment_instructions.png and b/content/applications/finance/payment_providers/wire_transfer/payment_instructions.png differ diff --git a/content/applications/finance/payment_providers/wire_transfer/payment_instructions_checkout.png b/content/applications/finance/payment_providers/wire_transfer/payment_instructions_checkout.png new file mode 100644 index 0000000000..257066b001 Binary files /dev/null and b/content/applications/finance/payment_providers/wire_transfer/payment_instructions_checkout.png differ diff --git a/content/applications/finance/payment_providers/wire_transfer/payment_instructions_portal.png b/content/applications/finance/payment_providers/wire_transfer/payment_instructions_portal.png new file mode 100644 index 0000000000..0884cc284a Binary files /dev/null and b/content/applications/finance/payment_providers/wire_transfer/payment_instructions_portal.png differ diff --git a/content/applications/finance/spreadsheet.rst b/content/applications/finance/spreadsheet.rst index 178231522c..9964d4c95d 100644 --- a/content/applications/finance/spreadsheet.rst +++ b/content/applications/finance/spreadsheet.rst @@ -9,15 +9,16 @@ Spreadsheet :titlesonly: spreadsheet/insert + spreadsheet/templates Spreadsheet lets you organize, analyze, and visualize your data in tabular form. Among others, you can: - :doc:`Insert and link your Odoo data (pivots, graphs, lists, and menus) `. -- Use default templates or create your own. -- Format your data. +- :doc:`Use default templates or create new ones `. +- Format data. - Use formulas and functions. -- Sort and filter your data. +- Sort and filter data. .. _spreadsheet/glossary: diff --git a/content/applications/finance/spreadsheet/insert.rst b/content/applications/finance/spreadsheet/insert.rst index 882196db3e..3e7a3138bd 100644 --- a/content/applications/finance/spreadsheet/insert.rst +++ b/content/applications/finance/spreadsheet/insert.rst @@ -1,6 +1,6 @@ -================= -Linking Odoo data -================= +============== +Link Odoo data +============== You can insert and link several elements from your database in your spreadsheets, namely: diff --git a/content/applications/finance/spreadsheet/templates.rst b/content/applications/finance/spreadsheet/templates.rst new file mode 100644 index 0000000000..236fdd0eec --- /dev/null +++ b/content/applications/finance/spreadsheet/templates.rst @@ -0,0 +1,138 @@ +========= +Templates +========= + +Spreadsheet templates allow you to quickly create spreadsheets without starting from scratch. + +Several pre-built templates are available when creating a new spreadsheet from the **Documents** +app, such as: + +- :ref:`budget reports `, +- :ref:`pipeline revenue reports `, or +- :ref:`sales commission report `. + +.. image:: templates/report-templates.png + :alt: View of all the default templates + +You can also :ref:`save any spreadsheet as a template ` and :ref:`manage and edit +existing templates `. + +Default templates +================= + +.. _templates/budget-reports: + +Accounting: budget reports +-------------------------- + +Budget reports compare a company's actual spending with its budget over a defined period. Two +templates are available: one uses quarterly intervals (:guilabel:`Budget Report (Quarterly)`), while +the other uses monthly intervals (:guilabel:`Budget Report (Monthly)`). + +.. image:: templates/budget-report.png + :alt: Extract of a budget report + +The cells under the :guilabel:`Actuals` column are automatically filled in with the amount of money +made and spent over the corresponding period (month or quarter). The data is taken from posted +journal items under :ref:`income and expense accounts `. + +.. warning:: + Journal items under the :guilabel:`Other Income` account type are not considered when collecting + data. + +To analyze your budget's performance, fill the cells under the :guilabel:`Budget` column with how +much money you expect to make (:guilabel:`Income` rows) and spend (:guilabel:`Expenses` rows) over +the related period and per account. Then, the performance (:guilabel:`Perf.`) column compares +:guilabel:`Actuals` data to their corresponding budget, expressed as a percentage. + +Lastly, the :guilabel:`Net Profit` row represents the total :guilabel:`Income` minus the total +:guilabel:`Expenses` for the :guilabel:`Actuals` and :guilabel:`Budget` columns. + +.. _templates/pipeline-reports: + +CRM: pipeline revenue reports +----------------------------- + +Two pipeline revenue reports are available. The :guilabel:`Pipeline Revenue Report (Monthly)` is +dedicated to one-time revenue (:abbr:`NRR (non-recurring revenue)`), while the :guilabel:`MRR/NRR +Pipeline Revenue Report (Monthly)` covers recurring and non-recurring revenue (:abbr:`MRR (monthly +recurring revenue)`). + +.. tip:: + Enable :guilabel:`Recurring Revenues` by going to :menuselection:`CRM --> Configuration --> + Settings`. + +.. image:: templates/pipeline-revenue.png + :alt: Extract of a pipeline revenue report + +The cells under the :guilabel:`Actuals` column are automatically filled in with the amount of +monthly revenue from **won** opportunities. + +To compute the revenue performance, fill in the monthly revenue targets. + +- For the :guilabel:`Revenue by Team` sheet, fill in the cells under the :guilabel:`Target` columns + for each sales team. +- For the :guilabel:`Revenue by Salesperson` sheet, open the :guilabel:`Targets` sheet and fill in + the cells next to each salesperson. Use the :guilabel:`Monthly Factor` table below to adapt the + main targets depending on the month of the year. + +Then, the performance (:guilabel:`Perf.`) column compares :guilabel:`Actuals` data to their related +budget, expressed as a percentage. + +Lastly, the :guilabel:`Forecasted` column gathers the monthly revenue of leads multiplied by their +:guilabel:`Probability` percentage. + +.. note:: + For actuals and forecasts: + + - The :guilabel:`Expected Closing` date found on leads is used to assign them to a month. + - The recurring monthly revenue is used even if the recurring plan's number of months is set to + a different value than 1 month. For example, a yearly plan's revenue is divided by 12 months. + +.. _templates/sales-commission: + +Sales: sales commission +----------------------- + +This report presents the monthly commission earned or due to each salesperson. + +.. image:: templates/sales-commission.png + :alt: Extract of a sales commission report + +The :guilabel:`Rate` column is pre-filled with the percentage rate from the :guilabel:`Rates` tab, +which can be customized for each product category according to the company's policy. Adjusting the +rate for a specific product category automatically updates the commission amount for that category. + +The :guilabel:`Invoiced` column shows the total amount of untaxed invoices grouped by salesperson +and month. + +Lastly, the :guilabel:`Comm.` column is computed by multiplying the invoiced amount with the rate +percentage. + +.. _templates/save: + +Save a spreadsheet as a template +================================ + +Any spreadsheet can be saved as a template. From the menu bar, click :menuselection:`File --> Save +as template`. Modify the default :guilabel:`Template Name` if necessary and click +:guilabel:`Confirm`. + +.. note:: + Templates are available to all users on the database. + +.. _templates/manage: + +Manage and edit templates +========================= + +Manage templates by going to :menuselection:`Documents --> Configuration --> Spreadsheet Templates`. +Remove the :guilabel:`My Templates` :ref:`filter ` to view all +templates in the database. + +To edit an existing template, click `✎ Edit` next to the desired template. Modifications are +automatically saved. + +.. tip:: + Use the download button under the :guilabel:`Data` column to export a template in JSON format. + The file can be imported into another database. diff --git a/content/applications/finance/spreadsheet/templates/budget-report.png b/content/applications/finance/spreadsheet/templates/budget-report.png new file mode 100644 index 0000000000..295bd9f3f8 Binary files /dev/null and b/content/applications/finance/spreadsheet/templates/budget-report.png differ diff --git a/content/applications/finance/spreadsheet/templates/pipeline-revenue.png b/content/applications/finance/spreadsheet/templates/pipeline-revenue.png new file mode 100644 index 0000000000..7b9d822ec1 Binary files /dev/null and b/content/applications/finance/spreadsheet/templates/pipeline-revenue.png differ diff --git a/content/applications/finance/spreadsheet/templates/report-templates.png b/content/applications/finance/spreadsheet/templates/report-templates.png new file mode 100644 index 0000000000..d927f00d8e Binary files /dev/null and b/content/applications/finance/spreadsheet/templates/report-templates.png differ diff --git a/content/applications/finance/spreadsheet/templates/sales-commission.png b/content/applications/finance/spreadsheet/templates/sales-commission.png new file mode 100644 index 0000000000..fcf0d34298 Binary files /dev/null and b/content/applications/finance/spreadsheet/templates/sales-commission.png differ diff --git a/content/applications/general/auth/azure.rst b/content/applications/general/auth/azure.rst index 82d1470d22..a89306a01e 100644 --- a/content/applications/general/auth/azure.rst +++ b/content/applications/general/auth/azure.rst @@ -2,9 +2,183 @@ Microsoft Azure sign-in authentication ====================================== -Due to specific requirements in Azure's OAuth implementation, Microsoft Azure OAuth identification -is NOT compatible with Odoo at the moment. +The Microsoft Azure OAuth sign-in authentication is a useful function that allows Odoo users to sign +in to their database with their Microsoft Azure account. + +This is particularly helpful if the organization uses Azure Workspace, and wants employees within +the organization to connect to Odoo using their Microsoft Accounts. + +.. warning:: + Databases hosted on Odoo.com should not use OAuth login for the owner or administrator of the + database as it would unlink the database from their Odoo.com account. If OAuth is set up for that + user, the database will no longer be able to be duplicated, renamed, or otherwise managed from + the Odoo.com portal. + .. seealso:: - :doc:`../../productivity/calendar/outlook` - :doc:`/administration/maintain/azure_oauth` + +Configuration +============= + +Integrating the Microsoft sign-in function requires configuration on Microsoft and Odoo. + +Odoo System Parameter +--------------------- + +First activate the :ref:`developer mode `, and then go to :menuselection:`Settings +--> Technical --> System Parameters`. + +Click :guilabel:`Create` and on the new/blank form that appears, add the following system parameter +`auth_oauth.authorization_header` to the :guilabel:`Key` field, and set the :guilabel:`Value` to +`1`. Then click :guilabel:`Save` to finish. + +Microsoft Azure dashboard +------------------------- + +Create a new application +~~~~~~~~~~~~~~~~~~~~~~~~ + +Now that the system parameters in Odoo have been set up, it's time to create a corresponding +application inside of Microsoft Azure. To get started creating the new application, go to +`Microsoft's Azure Portal `_. Log in with the :guilabel:`Microsoft +Outlook Office 365` account if there is one, otherwise, log in with a personal :guilabel:`Microsoft +account`. + +.. important:: + A user with administrative access to the *Azure Settings* must connect and perform the following + configuration steps below. + +Next, navigate to the section labeled :guilabel:`Manage Azure Active Directory`. The location of +this link is usually in the center of the page. + +Now, click on the :guilabel:`Add (+)` icon, located in the top menu, and then select :guilabel:`App +registration` from the drop-down menu. On the :guilabel:`Register an application` screen, rename the +:guilabel:`Name` field to `Odoo Login OAuth` or a similarly recognizable title. Under the +:guilabel:`Supported account types` section select the option for :guilabel:`Accounts in this +organizational directory only (Default Directory only - Single tenant)`. + +Under the :guilabel:`Redirect URL` section, select :guilabel:`Web` as the platform, and then input +`https:///auth_oauth/signin` in the :guilabel:`URL` field. The Odoo base :abbr:`URL +(Uniform Resource Locator)` is the canonical domain at which your Odoo instance can be reached (e.g. +*mydatabase.odoo.com* if you are hosted on Odoo.com) in the :guilabel:`URL` field. Then, click +:guilabel:`Register`, and the application is created. + +Authentication +~~~~~~~~~~~~~~ + +Edit the new app's authentication by clicking on the :guilabel:`Authentication` menu item in the +left menu after being redirected to the application's settings from the previous step. + +Next, the type of *tokens* needed for the OAuth authentication will be chosen. These are not +currency tokens but rather authentication tokens that are passed between Microsoft and Odoo. +Therefore, there is no cost for these tokens; they are used merely for authentication purposes +between two :abbr:`APIs (application programming interfaces)`. Select the tokens that should be +issued by the authorization endpoint by scrolling down the screen and check the boxes labeled: +:guilabel:`Access tokens (used for implicit flows)` and :guilabel:`ID tokens (used for implicit and +hybrid flows)`. + +.. image:: azure/authentication-tokens.png + :align: center + :alt: Authentication settings and endpoint tokens. + +Click :guilabel:`Save` to ensure these settings are saved. + +Gather credentials +~~~~~~~~~~~~~~~~~~ + +With the application created and authenticated in the Microsoft Azure console, credentials will be +gathered next. To do so, click on the :guilabel:`Overview` menu item in the left-hand column. Select +and copy the :guilabel:`Application (client) ID` in the window that appears. Paste this credential +to a clipboard / notepad, as this credential will be used in the Odoo configuration later. + +After finishing this step, click on :guilabel:`Endpoints` on the top menu and click the *copy icon* +next to :guilabel:`OAuth 2.0 authorization endpoint (v2)` field. Paste this value in the clipboard / +notepad. + +The value should equal `https://login.microsoftonline.com//oauth2/v2.0/authorize`. +Replace the `` with the :guilabel:`Directory (tenant) ID` under the +:guilabel:`Essentials` section of the *Overview* page if it is not already present in the :abbr:`URL +(uniform resource locator)`. + +.. example:: + Should the :guilabel:`Directory (tenant) ID` be equal to `6729e9df-afbb-4522-a876-f1408d416396` + then the new value of the :guilabel:`OAuth 2.0 authorization endpoint (v2)` :abbr:`URL (Uniform + Resource Locator)` should be: + `https://login.microsoftonline.com/6729e9df-afbb-4522-a876-f1408d416396/oauth2/v2.0/authorize`. + +.. image:: azure/overview-azure-app.png + :align: center + :alt: Application ID and OAuth 2.0 authorization endpoint (v2) credentials. + +Odoo setup +---------- + +Finally, the last step in the Microsoft Azure OAuth configuration is to configure some settings in +Odoo. Navigate to :menuselection:`Settings --> Integrations --> OAuth Authentication` and check the +box to activate the OAuth login feature. Click :guilabel:`Save` to ensure the progress is saved. +Then, sign in to the database once the login screen loads. + +Once again, navigate to :menuselection:`Settings --> Integrations --> OAuth Authentication` and +click on :guilabel:`OAuth Providers`. Now, select :guilabel:`New` in the upper-left corner and name +the provider `Azure`. + +Paste the :guilabel:`Application (client) ID` from the previous section into the :guilabel:`Client +ID` field. After completing this, paste the new :guilabel:`OAuth 2.0 authorization endpoint (v2)` +value into the :guilabel:`Authorization URL` field. + +For the :guilabel:`UserInfo URL` field, paste the following :abbr:`URL (Uniform Resource Locator)`: +`https://graph.microsoft.com/oidc/userinfo` + +In the :guilabel:`Scope` field, paste the following value: `openid profile email`. Next, the Windows +logo can be used as the CSS class on the login screen by entering the following value: `fa fa-fw +fa-windows`, in the :guilabel:`CSS class` field. + +Check the box next to the :guilabel:`Allowed` field to enable the OAuth provider. Finally, add +`Microsoft Azure` to the :guilabel:`Login button label` field. This text will appear next to the +Windows logo on the login page. + +.. image:: azure/odoo-provider-settings.png + :align: center + :alt: Odoo provider setup in the Settings application. + +:guilabel:`Save` the changes to complete the OAuth authentication setup in Odoo. + +User experience flows +--------------------- + +For a user to log in to Odoo using Microsoft Azure, the user must be on the :menuselection:`Odoo +password reset page`. This is the only way that Odoo is able to link the Microsoft Azure account and +allow the user to log in. + +.. note:: + Existing users must :ref:`reset their password ` to access the + :menuselection:`Odoo password reset page`. New Odoo users must click the new user invitation link + that was sent via email, then click on :guilabel:`Microsoft Azure`. Users should not set a new + password. + +To sign in to Odoo for the first time using the Microsoft Azure OAuth provider, navigate to the +:menuselection:`Odoo password reset page` (using the new user invitation link). A password reset +page should appear. Then, click on the option labeled :guilabel:`Microsoft Azure`. The page will +redirect to the Microsoft login page. + +.. image:: azure/odoo-login.png + :align: center + :alt: Microsoft Outlook login page. + +Enter the :guilabel:`Microsoft Email Address` and click :guilabel:`Next`. Follow the process to sign +in to the account. Should :abbr:`2FA (Two Factor Authentication)` be turned on, then an extra step +may be required. + +.. image:: azure/login-next.png + :align: center + :alt: Enter Microsoft login credentials. + +Finally, after logging in to the account, the page will redirect to a permissions page where the +user will be prompted to :guilabel:`Accept` the conditions that the Odoo application will access +their Microsoft information. + +.. image:: azure/accept-access.png + :align: center + :alt: Accept Microsoft conditions for permission access to your account information. diff --git a/content/applications/general/auth/azure/accept-access.png b/content/applications/general/auth/azure/accept-access.png new file mode 100644 index 0000000000..2b25035e13 Binary files /dev/null and b/content/applications/general/auth/azure/accept-access.png differ diff --git a/content/applications/general/auth/azure/authentication-tokens.png b/content/applications/general/auth/azure/authentication-tokens.png new file mode 100644 index 0000000000..f12bd2e7ce Binary files /dev/null and b/content/applications/general/auth/azure/authentication-tokens.png differ diff --git a/content/applications/general/auth/azure/login-next.png b/content/applications/general/auth/azure/login-next.png new file mode 100644 index 0000000000..190791d127 Binary files /dev/null and b/content/applications/general/auth/azure/login-next.png differ diff --git a/content/applications/general/auth/azure/odoo-login.png b/content/applications/general/auth/azure/odoo-login.png new file mode 100644 index 0000000000..fe4f73d37c Binary files /dev/null and b/content/applications/general/auth/azure/odoo-login.png differ diff --git a/content/applications/general/auth/azure/odoo-provider-settings.png b/content/applications/general/auth/azure/odoo-provider-settings.png new file mode 100644 index 0000000000..e095758f25 Binary files /dev/null and b/content/applications/general/auth/azure/odoo-provider-settings.png differ diff --git a/content/applications/general/auth/azure/overview-azure-app.png b/content/applications/general/auth/azure/overview-azure-app.png new file mode 100644 index 0000000000..eb121a0244 Binary files /dev/null and b/content/applications/general/auth/azure/overview-azure-app.png differ diff --git a/content/applications/general/auth/google.rst b/content/applications/general/auth/google.rst index 406d84c5b0..4b8373c3fb 100644 --- a/content/applications/general/auth/google.rst +++ b/content/applications/general/auth/google.rst @@ -8,6 +8,12 @@ database with their Google account. This is particularly helpful if the organization uses Google Workspace, and wants employees within the organization to connect to Odoo using their Google Accounts. +.. warning:: + Databases hosted on Odoo.com should not use Oauth login for the owner or administrator of the + database as it would unlink the database from their Odoo.com account. If Oauth is set up for that + user, the database will no longer be able to be duplicated, renamed or otherwise managed from + the Odoo.com portal. + .. seealso:: - :doc:`/applications/productivity/calendar/google` - :doc:`/administration/maintain/google_oauth` diff --git a/content/applications/general/email_communication/email_servers.rst b/content/applications/general/email_communication/email_servers.rst index edde7a8ec9..fc3363821b 100644 --- a/content/applications/general/email_communication/email_servers.rst +++ b/content/applications/general/email_communication/email_servers.rst @@ -271,3 +271,32 @@ By default, inbound messages are fetched every 5 minutes for on-premise database This value can be changed in :ref:`developer mode `. Go to :menuselection:`Settings --> Technical --> Automation --> Scheduled Actions` and look for :guilabel:`Mail: Fetchmail Service`. + +System parameters that prevent feedback loops +--------------------------------------------- + +There are two system parameters that help prevent email loops from occurring in Odoo. These +parameters were introduced in Odoo 16 to prevent aliases from creating too many records and to +prevent feedback loops on the catchall reply-to email address. They are present in database but not +in the *System Parameters*. To override the following defaults they need to be added in. + +The two system parameters are as follows: + +- `mail.incoming.limit.period` (60 minutes by default) +- `mail.incoming.limit.alias` (5 by default) + +Add these fields in Odoo by first enabling :ref:`developer mode `, and then +navigating to :menuselection:`Settings --> Technical Menu --> Parameters --> System Parameters`. +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`). + +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 +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. diff --git a/content/applications/general/reporting.rst b/content/applications/general/reporting.rst index 90a1fcca92..1f6f244b93 100644 --- a/content/applications/general/reporting.rst +++ b/content/applications/general/reporting.rst @@ -155,25 +155,37 @@ when they form a meaningful whole. :alt: Viewing the Sales Analysis report as a pie chart .. tip:: - For bar and line charts, you can use the stacked option when you have at least two groups, which - then appear on top of each other instead of next to each other. + For **bar** and **line** charts, you can use the stacked option when you have at least two + groups, which then appear on top of each other instead of next to each other. .. tabs:: .. tab:: Stacked bar chart - .. image:: reporting/stacked.png + .. image:: reporting/stacked-bar.png :align: center :alt: Stacked bar chart example .. tab:: Regular bar chart - .. image:: reporting/non-stacked.png + .. image:: reporting/non-stacked-bar.png :align: center :alt: Non-stacked bar chart example - For line charts, you can use the cumulative option to sum values, which is especially useful to - show the change in growth over a time period. + .. tab:: Stacked line chart + + .. image:: reporting/stacked-line.png + :align: center + :alt: Stacked line chart example + + .. tab:: Regular line chart + + .. image:: reporting/non-stacked-line.png + :align: center + :alt: Non-stacked line chart example + + For **line** charts, you can use the cumulative option to sum values, which is especially useful + to show the change in growth over a time period. .. tabs:: diff --git a/content/applications/general/reporting/non-stacked.png b/content/applications/general/reporting/non-stacked-bar.png similarity index 100% rename from content/applications/general/reporting/non-stacked.png rename to content/applications/general/reporting/non-stacked-bar.png diff --git a/content/applications/general/reporting/non-stacked-line.png b/content/applications/general/reporting/non-stacked-line.png new file mode 100644 index 0000000000..23edf44823 Binary files /dev/null and b/content/applications/general/reporting/non-stacked-line.png differ diff --git a/content/applications/general/reporting/stacked.png b/content/applications/general/reporting/stacked-bar.png similarity index 100% rename from content/applications/general/reporting/stacked.png rename to content/applications/general/reporting/stacked-bar.png diff --git a/content/applications/general/reporting/stacked-line.png b/content/applications/general/reporting/stacked-line.png new file mode 100644 index 0000000000..926d03909d Binary files /dev/null and b/content/applications/general/reporting/stacked-line.png differ diff --git a/content/applications/general/search.rst b/content/applications/general/search.rst index cebddbca76..a846dc0a5c 100644 --- a/content/applications/general/search.rst +++ b/content/applications/general/search.rst @@ -92,7 +92,7 @@ one of the **preconfigured groups**. :align: center :alt: Grouping records on the Sales Analysis report -You can also **custom groups** by using a wide selection of fields present on the model. To do so, +You can **customize groups** by using a wide selection of fields present on the model. To do so, click :menuselection:`Group By --> Add Custom Group`, select a field, and click :guilabel:`Apply`. .. note:: diff --git a/content/applications/general/users/companies.rst b/content/applications/general/users/companies.rst index 499609c1b3..333dae5242 100644 --- a/content/applications/general/users/companies.rst +++ b/content/applications/general/users/companies.rst @@ -84,11 +84,10 @@ Inter-Company Transactions First, make sure each one of your companies is properly set in relation to: -- :doc:`Chart of Accounts - <../../finance/accounting/getting_started/initial_configuration/chart_of_accounts>` -- :doc:`Taxes <../../finance/accounting/taxation/taxes/default_taxes>` -- :doc:`Fiscal Positions <../../finance/accounting/taxation/taxes/fiscal_positions>` -- :doc:`Journals <../../finance/accounting/bank/setup/bank_accounts>` +- :doc:`Chart of Accounts <../../finance/accounting/get_started/chart_of_accounts>` +- :doc:`Taxes <../../finance/accounting/taxes>` +- :doc:`Fiscal Positions <../../finance/accounting/taxes/fiscal_positions>` +- :doc:`Journals <../../finance/accounting/bank>` - :doc:`Fiscal Localizations <../../finance/fiscal_localizations>` - :doc:`Pricelists <../../sales/sales/products_prices/prices/pricing>` @@ -130,4 +129,4 @@ at an invoice/bills level or at a sales/purchase orders level. .. seealso:: - :doc:`Multi-company Guidelines ` - - :doc:`../../finance/accounting/others/multi_currency` + - :doc:`../../finance/accounting/get_started/multi_currency` diff --git a/content/applications/hr.rst b/content/applications/hr.rst index aa9b28ada2..4d2d6bf5ba 100644 --- a/content/applications/hr.rst +++ b/content/applications/hr.rst @@ -7,3 +7,5 @@ Human resources .. toctree:: hr/attendances + hr/employees + hr/payroll diff --git a/content/applications/hr/employees.rst b/content/applications/hr/employees.rst new file mode 100644 index 0000000000..68255a2a8e --- /dev/null +++ b/content/applications/hr/employees.rst @@ -0,0 +1,14 @@ +:nosearch: +:show-content: +:show-toc: + +========= +Employees +========= + +Odoo *Employees* organizes a company's employee records, contracts, and departments. + +.. toctree:: + :titlesonly: + + employees/new_employee diff --git a/content/applications/hr/employees/new_employee.rst b/content/applications/hr/employees/new_employee.rst new file mode 100644 index 0000000000..590937ba2c --- /dev/null +++ b/content/applications/hr/employees/new_employee.rst @@ -0,0 +1,266 @@ +================== +Add a new employee +================== + +When a new employee is hired, the first step is to create a new employee form. Starting in the +:menuselection:`Employees` app default view, click the :guilabel:`Create` button to access a new +employee form. Fill out the required information (underlined in bold) and any additional details, +then click :guilabel:`Save`. + +.. image:: new_employee/employee-new.png + :align: center + :alt: Create a new employee card. + +.. note:: + The current company phone number and name is populated in the :guilabel:`Work Phone` and + :guilabel:`Company` fields. + +General information +=================== + +Required fields +--------------- + +- :guilabel:`Name`: Enter the employee's name. +- :guilabel:`Company`: Select the company from the drop-down menu that the new employee is hired by, + or create a new company by typing the name in the field. +- :guilabel:`Working Hours`: In the :guilabel:`Work Information` tab, select the desired + :guilabel:`Working Hours` from the drop-down menu. + +.. image:: new_employee/working-hours.png + :align: center + :alt: Working Hours are located in the Work Information tab. + +.. note:: + :guilabel:`Working Hours` are related to a company's working times, and an employee cannot have + working hours that are outside of a company's working times. + + Each individual working time is company-specific, so for multi-company databases, each company + needs to have its own working hours set. + + If an employee's working hours are not configured as a working time for the company, new working + times can be added, or existing working times can be modified. To add or modify a working time, + go to the :menuselection:`Payroll app --> Configuration --> Working Times`, and add a new working + time or edit an existing one. + + After the new working time is created, set the working hours for the employee. + +Optional fields +--------------- + +- :guilabel:`Photo`: In the top right image box of the employee card, click on the :guilabel:`✏️ + (pencil)` edit icon to select a photo to upload. +- :guilabel:`Job Position`: Enter the employee's job position title. +- Tags: Click on a tag in the drop-down menu to add any tags applicable to the employee. Any tag can + be created in this field by typing it in. Once created, the new tag is available for all employee + cards. There is no limit to the amount of tags that can be added. +- Work Contact Information: Enter the employees :guilabel:`Work Mobile`, :guilabel:`Work Phone`, + :guilabel:`Work Email`, and/or :guilabel:`Company` name. +- :guilabel:`Department`: Select the employee's department from the drop-down menu. +- :guilabel:`Manager`: Select the employee's manager from the drop-down menu. +- :guilabel:`Coach`: Select the employee's coach from the drop-down menu. + +.. note:: + After a :guilabel:`Manager` is selected, if the :guilabel:`Coach` field is blank, the selected + manager automatically populates the :guilabel:`Coach` field. + +.. tip:: + To make edits to the selected :guilabel:`Department`, :guilabel:`Manager`, :guilabel:`Coach`, or + :guilabel:`Company`, click the :guilabel:`External Link` button next to the respective selection. + The :guilabel:`External Link` button opens the selected form, allowing for modifications. Click + :guilabel:`Save` after any edits are made. + +Additional information tabs +=========================== + +Resumé tab +---------- + +Resumé +~~~~~~ + +Next, the employee's work history is entered in the :guilabel:`Resumé` tab. Each previous experience +must be entered individually. Click :guilabel:`Create a New Entry`, and the :guilabel:`Create Resumé +lines` form appears. Enter the following information, then click the :guilabel:`Save & Close` button +if there is only one entry to add, or click the :guilabel:`Save & New` button to save the current +entry and create another line. + +.. image:: new_employee/resume-lines.png + :align: center + :alt: Add information for the previous work experience in this form. + +- :guilabel:`Name`: Type in the name of the previous work experience. +- :guilabel:`Type`: From the drop-down menu, select either :guilabel:`Experience`, + :guilabel:`Education`, :guilabel:`Internal Certification`, :guilabel:`Internal Training`, or type + in a new entry. +- :guilabel:`Display Type`: Select either :guilabel:`Classic`, :guilabel:`Certification`, or + :guilabel:`Course` from the drop-down menu. +- :guilabel:`Date Start` and :guilabel:`Date End`: Enter the start and end dates for the work + experience. To select a date, use the :guilabel:`< (left)` and :guilabel:`> (right)` arrow icons + to scroll to the desired month, then click on the day to select it. +- :guilabel:`Description`: Enter any relevant details in the field. + +Skills +~~~~~~ + +An employee's skills can be entered in the :guilabel:`Resumé` tab in the same manner a resumé line +is created. Click the :guilabel:`Create a New Entry` button under :guilabel:`Skills` and a +:guilabel:`Create Skills` form appears. Fill in the information, then click the :guilabel:`Save & +Close` button if there is only one entry to add, or click the :guilabel:`Save & New` button to save +the current entry and immediately create a new entry. + +.. image:: new_employee/create-skill.png + :align: center + :alt: Create a new skill for the employee. + +- :guilabel:`Skill Type`: Select from the drop-down menu either :guilabel:`Languages`, + :guilabel:`Dev`, :guilabel:`Music`, :guilabel:`Marketing`, or type in a new skill type. After + entering the new skill type, an option to :guilabel:`Create` the skill or :guilabel:`Create and + Edit` the skill appears. Click :guilabel:`Create and Edit`, and a pop-up for the specific skill + type appears. This can also be accessed with the :guilabel:`External Link` button next to the new + skill. This form allows for the creation of specific skills and levels. Click :guilabel:`Add a + line` and enter the information for the new skill, then repeat for all other added skills. Repeat + this process for the :guilabel:`Levels` section. Click :guilabel:`Add a line` to add each level + and progress. + + .. image:: new_employee/new-skills.png + :align: center + :alt: Add a new skill and levels. + + .. example:: + To add a math skill set, enter `Math` in the :guilabel:`Name` field. In the :guilabel:`Skills` + field, enter `Algebra`, `Calculus`, and `Trigonometry`. And, in the :guilabel:`Levels` field + enter `beginner`, `intermediate`, and `expert`. Then, either click :guilabel:`Save & Close` or + :guilabel:`Save & New`. + +- :guilabel:`Skill`: The corresponding skills associated with the selected :guilabel:`Skill Type` + appear in a drop-down menu. For example, selecting :guilabel:`Language` as the :guilabel:`Skill + Type` presents a variety of languages to select from under the :guilabel:`Skills` field. Select + the appropriate pre-configured skill, or type in a new one. +- :guilabel:`Skill Level`: Pre-defined skill levels associated with the selected :guilabel:`Skill + Type` appear in a drop-down menu. Select a level or create a new skill level by typing it in. +- :guilabel:`Progress`: Progress is automatically selected based on the selected :guilabel:`Skill + Level`. Skill levels and progress can be modified in the :guilabel:`Skill Type` pop-up form, which + is accessed via the :guilabel:`External Link` button next to :guilabel:`Skill Type` field. + +To delete any line from the :guilabel:`Resumé` tab, click the :guilabel:`🗑️ (trash can)` delete icon +to delete the entry. Add a new line by clicking the :guilabel:`ADD` button next to the corresponding +section. + +Work information tab +-------------------- + +- :guilabel:`Location`: Select the :guilabel:`Work Address` from the drop-down menu. The + :guilabel:`External Link` button opens up the selected company form in a window, and allows for + editing. The :guilabel:`Work Location` is where any specific location details should be noted, + such as a floor, or building. +- :guilabel:`Approvers`: Using the drop-down menus, select the employees responsible for approving + :guilabel:`Time Off`, :guilabel:`Expenses`, and :guilabel:`Timesheets` for the employee. The + :guilabel:`External Link` button opens a form with the approver's :guilabel:`Name`, + :guilabel:`Email Address`, :guilabel:`Company`, :guilabel:`Phone`, and :guilabel:`Mobile` fields. + These can be modified, if needed. Click :guilabel:`Save` after making any edits. +- :guilabel:`Schedule`: Select the :guilabel:`Working Hours` (required) and :guilabel:`Timezone` for + the employee. The :guilabel:`External Link` button opens up a detailed view of the specific daily + working hours. Working hours can be created, modified, or deleted here. Global time off (such as + holidays) can be entered in the :guilabel:`Global Time Off` tab. Click :guilabel:`Add a line` to + add a new global time off. +- :guilabel:`Planning`: Click on a planning role from the drop-down menu for both the + :guilabel:`Default Planning Role` and the :guilabel:`Planning Roles` fields to add a role. There + is no limit to the amount of :guilabel:`Planning Roles` that can be selected for an employee, but + there can only be one :guilabel:`Default Planning Role`. The default is the *typical* role that + the employee performs, where the :guilabel:`Planning Roles` are *all* the specific roles the + employee is able to perform. + + .. image:: new_employee/work-info.png + :align: center + :alt: Add the work information to the Work Information tab. + +Private information tab +----------------------- + +No information in the :guilabel:`Private Information` tab is required, however, some information in +this section may be critical for the company's payroll department. In order to properly process +payslips and ensure all deductions are accounted for, the employee's personal information should be +entered. + +Here, the employee's :guilabel:`Private Contact`, :guilabel:`Marital Status`, :guilabel:`Emergency +Contact`, :guilabel:`Education`, :guilabel:`Citizenship`, :guilabel:`Dependant`, and :guilabel:`Work +Permit` information is entered. Fields are entered either using a drop-down menu, clicking a check +box, or typing in the information. + +- :guilabel:`Private Contact`: Enter the :guilabel:`Address` for the employee. The selection can be + made with the drop-down menu. If the information is not available, type in the name for the new + address. To edit the new address, click the :guilabel:`External Link` button to open the address + form. On the address form, enter the necessary details, then click :guilabel:`Save`. Some other + information in the :guilabel:`Private Contact` section may auto-populate, if the address is + already listed in the drop-down menu. +- :guilabel:`Marital Status`: Select either :guilabel:`Single`, :guilabel:`Married`, + :guilabel:`Legal Cohabitant`, :guilabel:`Widower`, or :guilabel:`Divorced` from the drop-down + menu. +- :guilabel:`Emergency Contact`: Type in the name and phone number of the employee's emergency + contact. +- :guilabel:`Education`: Select the highest level of education completed by the employee from the + :guilabel:`Certificate Level` drop-down menu. Options include :guilabel:`Graduate`, + :guilabel:`Bachelor`, :guilabel:`Master`, :guilabel:`Doctor`, or :guilabel:`Other`. Type in the + :guilabel:`Field of Study`, and the name of the :guilabel:`School` in the respective fields. +- :guilabel:`Citizenship`: This section houses all the information relevant to the citizenship of + the employee. Some selections use a drop-down menu, as does the :guilabel:`Nationality (Country)`, + :guilabel:`Gender`, and :guilabel:`Country of Birth` sections. The :guilabel:`Date of Birth` uses + a calendar module to select the date. First, click on the name of the month, then the year, to + access the year ranges. Use the :guilabel:`< (left)` and :guilabel:`> (right)` arrow icons, + navigate to the correct year range, and click on the year. Next, click on the month. Last, click + on the day to select the date. Type in the information for the :guilabel:`Identification No`, + :guilabel:`Passport No`, and :guilabel:`Place of Birth` fields. If the employee is + :guilabel:`Disabled` or a :guilabel:`Nonresident`, click the check box next to the respective + fields. +- :guilabel:`Dependant`: If the employee has any dependants, that information is entered here. Type + in the number of children the employee has, and check the boxes next to :guilabel:`Disabled + Children` and/or :guilabel:`Other Dependent People` if applicable. +- :guilabel:`Work Permit`: If the employee has a work permit, enter the information in this section. + Type in the :guilabel:`Visa No` and/or :guilabel:`Work Permit No` in the corresponding fields. + Using the calendar module, select the :guilabel:`Visa Expire Date` to enter the expiration date. + +.. image:: new_employee/private-info.png + :align: center + :alt: Add the private information to the Private Information tab. + +HR settings tab +--------------- + +This tab provides various fields for different information, depending on the country the company is +located. Different fields are configured for different locations, however some sections appear +regardless. + +- :guilabel:`Status`: If applicable, select a :guilabel:`Related User`, :guilabel:`Job Position`, + and :guilabel:`Language` with the drop-down menus. Type in the :guilabel:`Registration Number of + the Employee`, and the :guilabel:`NIF Country Code` if available. +- :guilabel:`Fleet`: If the employee has access to a company car, enter the :guilabel:`Mobility + Card` information here. +- :guilabel:`Timesheets`: Enter the employee's cost per hour in a $XX.XX format. This is factored in + when the employee is working at a work center. This value affects the employee's pay, and may also + affect manufacturing costs for a product, if the value of the manufactured product is not a fixed + amount. +- :guilabel:`Attendance`: This section may only appear for Belgian companies. Enter the + :guilabel:`INSZ or BIS` number if applicable. :guilabel:`Badge ID` and a :guilabel:`PIN Code` can + be entered here, if the employee needs/has one. Click :guilabel:`Generate` next to the + :guilabel:`Badge ID` to create a badge ID. + +.. image:: new_employee/hr-settings.png + :align: center + :alt: Enter any information prompted in the HR Settings tab for the employee. + +Personal documents tab +---------------------- + +The :guilabel:`Personal Documents` tab is only displayed for certain countries. If this tab is not +visible, it is not applicable to the company's location. + +Add a file for the employee's :guilabel:`ID Card Copy`, :guilabel:`Driving License`, +:guilabel:`Mobile Subscription Invoice`, :guilabel:`SIM Card Copy`, and :guilabel:`Internet +Subscription Invoice` by clicking the :guilabel:`Upload Your File` button next to the corresponding +field. File types that can be accepted are :file:`.jpg`, :file:`.png`, and :file:`.pdf`. + +.. image:: new_employee/personal.png + :align: center + :alt: Upload personal documents for the employee in the Personal Documents tab, either a jpg, + png, or pdf. diff --git a/content/applications/hr/employees/new_employee/create-skill.png b/content/applications/hr/employees/new_employee/create-skill.png new file mode 100644 index 0000000000..2be9862cb8 Binary files /dev/null and b/content/applications/hr/employees/new_employee/create-skill.png differ diff --git a/content/applications/hr/employees/new_employee/employee-new.png b/content/applications/hr/employees/new_employee/employee-new.png new file mode 100644 index 0000000000..e216fcc43e Binary files /dev/null and b/content/applications/hr/employees/new_employee/employee-new.png differ diff --git a/content/applications/hr/employees/new_employee/employee-resume.png b/content/applications/hr/employees/new_employee/employee-resume.png new file mode 100644 index 0000000000..cba8c5ddbe Binary files /dev/null and b/content/applications/hr/employees/new_employee/employee-resume.png differ diff --git a/content/applications/hr/employees/new_employee/hr-settings.png b/content/applications/hr/employees/new_employee/hr-settings.png new file mode 100644 index 0000000000..26aacc2fe8 Binary files /dev/null and b/content/applications/hr/employees/new_employee/hr-settings.png differ diff --git a/content/applications/hr/employees/new_employee/new-skills.png b/content/applications/hr/employees/new_employee/new-skills.png new file mode 100644 index 0000000000..c7a6f56dab Binary files /dev/null and b/content/applications/hr/employees/new_employee/new-skills.png differ diff --git a/content/applications/hr/employees/new_employee/personal.png b/content/applications/hr/employees/new_employee/personal.png new file mode 100644 index 0000000000..620157c103 Binary files /dev/null and b/content/applications/hr/employees/new_employee/personal.png differ diff --git a/content/applications/hr/employees/new_employee/private-info.png b/content/applications/hr/employees/new_employee/private-info.png new file mode 100644 index 0000000000..079212ac91 Binary files /dev/null and b/content/applications/hr/employees/new_employee/private-info.png differ diff --git a/content/applications/hr/employees/new_employee/resume-lines.png b/content/applications/hr/employees/new_employee/resume-lines.png new file mode 100644 index 0000000000..062e27b47d Binary files /dev/null and b/content/applications/hr/employees/new_employee/resume-lines.png differ diff --git a/content/applications/hr/employees/new_employee/work-info.png b/content/applications/hr/employees/new_employee/work-info.png new file mode 100644 index 0000000000..6a2abcba99 Binary files /dev/null and b/content/applications/hr/employees/new_employee/work-info.png differ diff --git a/content/applications/hr/employees/new_employee/working-hours.png b/content/applications/hr/employees/new_employee/working-hours.png new file mode 100644 index 0000000000..3d17f55e70 Binary files /dev/null and b/content/applications/hr/employees/new_employee/working-hours.png differ diff --git a/content/applications/hr/payroll.rst b/content/applications/hr/payroll.rst new file mode 100644 index 0000000000..a544aab79f --- /dev/null +++ b/content/applications/hr/payroll.rst @@ -0,0 +1,359 @@ +======= +Payroll +======= + +Odoo *Payroll* is used to process work entries and create payslips for employees, including both +regular pay and commission. Payroll works in conjunction with other Odoo apps, such as *Employees*, +*Timesheets*, *Time Off*, and *Attendances*. + +The *Payroll* app helps ensure there are no issues or conflicts when validating work entries, +handles country-specific localizations to ensure that payslips follow local rules and taxes, and +allows for salary assignments. Payroll configuration is critical to ensure accurate and timely +processing of payslips. + +Settings +======== + +To access the *Settings*, go to :menuselection:`Payroll --> Configuration --> Settings`. Whether or +not payslips are posted in accounting, and whether SEPA payments are created, is selected here. + +The :guilabel:`Settings` screen is where localization settings are configured. *Localizations* are +country-specific settings pre-configured in Odoo at the creation of the database, and account for +all taxes, fees, and allowances for that particular country. The :guilabel:`Localization` section of +the :guilabel:`Settings` includes a detailed view of all benefits provided to employees. + +.. image:: payroll/payroll-settings.png + :align: center + :alt: Settings available for Payroll. + +Any country-specific localizations are set up in the :guilabel:`Localization` section of the +:guilabel:`Settings` screen. All localization items are pre-populated when the country is specified +during the creation of the database. It is not recommended to alter the localization settings unless +specifically required. + +Work entries +============ + +A *work entry* is an individual record on an employee's timesheet. Work entries can be configured to +account for all types of work and time off, such as :guilabel:`Attendance`, :guilabel:`Sick Time +Off`, :guilabel:`Training`, or :guilabel:`Public Holiday`. + +Work entry types +---------------- + +When creating a work entry in the *Payroll* application, or when an employee enters information in +the *Timesheets* application, a :guilabel:`Work Entry Type` needs to be selected. The list of +:guilabel:`Work Entry Types` is automatically created based on localization settings set in the +database. + +To view the current work entry types available, go to :menuselection:`Payroll --> Configuration --> +Work Entry Types`. + +Each work entry type has a code to aid in the creation of payslips, and ensure all taxes and fees +are correctly entered. + +.. image:: payroll/work-entry-types.png + :align: center + :alt: List of all work entry types currently available. + +New work entry type +~~~~~~~~~~~~~~~~~~~ + +To create a new work entry type, click the :guilabel:`Create` button. Enter the information on the +form: + +- :guilabel:`Work Entry Type Name`: The name should be short and descriptive, such as `Sick Time` or + `Public Holiday`. +- :guilabel:`Code`: This code appears with the work entry type on timesheets and payslips. Since the + code is used in conjunction with the *Accounting* application, it is advised to check with the + accounting department for a code to use. +- :guilabel:`Sequence`: The sequence determines the order that the work entry is computed in the + payslip list. +- Check boxes: If any of the items in the list applies to the work entry, check off the box by + clicking it. If :guilabel:`Time Off` is checked off, a :guilabel:`Time Off Type` field appears. + This field has a drop-down menu to select the specific type of time off, or a new type of time off + can be entered. + +.. image:: payroll/new-work-entry.png + :align: center + :alt: New work entry type form. + +- :guilabel:`Rounding`: The rounding method determines how timesheet entries are displayed on the + payslip. + + - :guilabel:`No Rounding`: A timesheet entry is not modified. + - :guilabel:`Half Day`: A timesheet entry is rounded to the closest half day amount. + - :guilabel:`Day`: A timesheet entry is rounded to the closest full day amount. + +.. example:: + If the working time is set to an 8-hour work day (40-hour work week), and an employee enters a + time of 5.5 hours on a timesheet, and :guilabel:`Rounding` is set to :guilabel:`No Rounding`, the + entry remains 5.5 hours. If :guilabel:`Rounding` is set to :guilabel:`Half Day`, the entry is + changed to 4 hours. If it is set to :guilabel:`Day`, it is changed to 8 hours. + +Working times +------------- + +To view the currently configured working times, go to :menuselection:`Payroll --> Configuration --> +Working Times`. The working times that are available for an employee's contracts and work entries +are found in this list. + +Working times are company-specific. Each company must identify each type of working time they use. +For example, an Odoo database containing multiple companies that use a standard 40-hour work week +needs to have a separate working time entry for each company that uses the 40-hour standard work +week. + +.. image:: payroll/working-times.png + :align: center + :alt: All working times currently set up in the database. + +New working time +~~~~~~~~~~~~~~~~ + +To create a new working time, click the :guilabel:`Create` button. Enter the information on the +form. + +.. image:: payroll/new-working-times.png + :align: center + :alt: New working type form. + +The fields are auto-populated for a regular 40-hour work week but can be modified. First, change the +name of the working time by modifying the text in the :guilabel:`Name` field. Next, make any +adjustments to the days and times that apply to the new working time. + +In the :guilabel:`Working Hours` tab, modify the :guilabel:`Day of Week`, :guilabel:`Day Period`, +and :guilabel:`Work Entry Type` selections by clicking on the drop-down menus in each column and +making the desired selection. The :guilabel:`Work From` and :guilabel:`Work To` columns are modified +by typing in the time. + +.. note:: + The :guilabel:`Work From` and :guilabel:`Work To` times must be in a 24-hour format. For example, + `2:00 PM` would be entered as `14:00`. + +If the working time should be in a two-week configuration, click the :guilabel:`Switch To 2 Week +Calendar` button. This creates entries for an :guilabel:`Even week` and an :guilabel:`Odd week`. + +Salary +====== + +.. _payroll/structure-types: + +Structure types +--------------- + +In Odoo, an employee's payslip is based on *structures* and *structure types*, which both affect how +an employee enters timesheets. Each structure type is an individual set of rules for processing a +timesheet entry, which consists of different structures nested within it. Structure types define how +often an employee gets paid, the working hours, and if wages are based on a salary (fixed) or how +many hours the employee worked (varied). + +For example, a structure type could be `Employee`, and that structure type could have two different +structures in it: a `Regular Pay` structure which includes all the separate rules for processing +regular pay, as well as a structure for an `End of Year Bonus` which includes the rules only for the +end of year bonus. Both the `Regular Pay` structure and `End of Year Bonus` structure are structures +within the `Employee` structure type. + +The different structure types can be seen by going to :menuselection:`Payroll --> Configuration --> +Structure Types`. + +There are two default structure types configured in Odoo: *Employee* and *Worker*. Typically, +*Employee* is used for salaried employees, which is why the wage type is *Monthly Fixed Wage*, and +*Worker* is typically used for employees paid by the hour, so the wage type is *Hourly Wage*. + +.. image:: payroll/structure-type.png + :align: center + :alt: List of all structure types. + +Click the :guilabel:`Create` button to make a new structure type. Most fields are pre-populated, but +all fields can be edited. Once the fields are edited, click the :guilabel:`Save` button to save the +changes, or click :guilabel:`Discard` to delete the entry. + +.. image:: payroll/new-structure.png + :align: center + :alt: New structure type box. + +Structures +---------- + +*Salary structures* are the different ways an employee gets paid within a specific *structure*, and +are specifically defined by various rules. + +The amount of structures a company needs for each structure type depends on how many different ways +employees are paid, and how their pay is calculated. For example, a common structure that could be +useful to add may be a `Bonus`. + +To view all the various structures for each structure type, go to :menuselection:`Payroll --> +Configuration --> Structures`. + +.. image:: payroll/salary-structure.png + :align: center + :alt: All available salary structures. + +Each :ref:`structure type ` lists the various structures associated with +it. Each structure contains a set of rules that define it. + +Click on a structure to view its :guilabel:`Salary Rules`. These rules are what calculate the +payslip for the employee. + +.. image:: payroll/structure-regular-pay-rules.png + :align: center + :alt: Salary structure details for Regular Pay. + +Rules +----- + +Each structure has a set of *salary rules* to follow for accounting purposes. These rules are +configured by the localization, and affect the *Accounting* application, so modifications to the +default rules, or the creation of new rules, should only be done when necessary. + +To view all the rules, go to :menuselection:`Payroll app --> Configuration --> Rules`. Click on a +structure (such as :guilabel:`Regular Pay`) to view all the rules. + +.. image:: payroll/rules.png + :align: center + :alt: Rules for each salary structure type. + +To make a new rule, click :guilabel:`Create`. A new rule form appears. Enter the information in the +fields, then click :guilabel:`Save`. + +.. image:: payroll/new-rule.png + :align: center + :alt: Enter the information for the new rule. + +The required fields for a rule are: + +- :guilabel:`Name`: Enter a name for the rule. +- :guilabel:`Category`: Select a category the rule applies to from the drop-down menu, or enter a + new one. +- :guilabel:`Code`: Enter a code to be used for this new rule. It is recommended to coordinate with + the accounting department for a code as this will affect them. +- :guilabel:`Salary Structure`: Select a salary structure the rule applies to from the drop-down + menu, or enter a new one. +- :guilabel:`Condition Based on`: In the :guilabel:`General` tab, select from the drop-down menu + whether the rule is :guilabel:`Always True` (always applies), a :guilabel:`Range` (applies to a + specific range, which is entered beneath the selection), or a :guilabel:`Python Expression` (the + code is entered beneath the selection). +- :guilabel:`Amount Type`: In the :guilabel:`General` tab, select from the drop-down menu whether + the amount is a :guilabel:`Fixed Amount`, a :guilabel:`Percentage (%)`, or a :guilabel:`Python + Code`. Depending on what is selected, the fixed amount, percentage, or Python code needs to be + entered next. + +Rule parameters +--------------- + +.. note:: + Currently, the :guilabel:`Rule Parameters` feature found inside the :menuselection:`Payroll app + --> Configuration` menu is still in development and only serves a specific use case for Belgian + markets. The documentation will be updated when this section has matured to more markets. + +Other input types +----------------- + +When creating payslips, it is sometimes necessary to add other entries for specific circumstances, +like expenses, reimbursements, or deductions. These other inputs can be configured by going to +:menuselection:`Payroll --> Configuration --> Other Input Types`. + +.. image:: payroll/other-input.png + :align: center + :alt: Other input types for payroll. + +To create a new input type, click the :guilabel:`Create` button. Enter the :guilabel:`Description`, +the :guilabel:`Code`, and which structure it applies to in the :guilabel:`Availability in Structure` +field. Click the :guilabel:`Save` button to save the changes, or click :guilabel:`Discard` to delete +the entry. + +.. image:: payroll/input-type-new.png + :align: center + :alt: Create a new Input Type. + +Salary package configurator +=========================== + +The various options under the :guilabel:`Salary Package Configurator` section of the +:menuselection:`Payroll --> Configuration` menu all affect an employee's potential salary. These +sections (:guilabel:`Advantages`, :guilabel:`Personal Info`, and :guilabel:`Resume`) specify what +benefits can be offered to an employee in their salary package. + +Depending on what information an employee enters (such as deductions, dependents, etc.), their +salary is adjusted accordingly. When an applicant applies for a job on the company website, the +sections under :guilabel:`Salary Package Configurator` directly affect what the applicant sees, and +what is populated as the applicant enters information. + +Advantages +---------- + +When offering potential employees a position, there can be certain *advantages* set in Odoo in +addition to the salary to make the offer more appealing (such as extra time off, access to a company +car, reimbursement for a phone or internet, etc.). + +To see the advantages, go to :menuselection:`Payroll --> Configuration --> Advantages`. Advantages +are grouped by :guilabel:`Structure type`. + +.. image:: payroll/advantages.png + :align: center + :alt: Settings available for payroll. + +To make a new advantage, click the :guilabel:`Create` button. Enter the information in the fields, +then click the :guilabel:`Save` button to save the changes, or click :guilabel:`Discard` to delete +the entry. + +.. image:: payroll/new-advantage.png + :align: center + :alt: List of advantages employee's can have. + +The required fields for an advantage are: + +- :guilabel:`Name`: Enter the name for the advantage. +- :guilabel:`Advantage Field`: Select from the drop-down menu what field in the payslip this + advantage appears under. +- :guilabel:`Advantage Type`: Select from the drop-down menu what type of advantage the benefit is. + Select from :guilabel:`Monthly Benefit in Kind`, :guilabel:`Monthly Advantages in Net`, + :guilabel:`Monthly Advantages in Cash`, or :guilabel:`Yearly Advantages in Cash`. +- :guilabel:`Salary Structure Type`: Select from the drop-down menu which salary structure type this + advantage applies to. + +Personal info +------------- + +Every employee in Odoo has an *employee card* that includes all of their personal information, +resume, work information, and documents. To view an employee's card, go to the main +:menuselection:`Payroll` app dashboard, and click on the employee's card, or go to +:menuselection:`Payroll --> Employees --> Employees` and click on the employee's card. Employee +cards can also be viewed by going to the :menuselection:`Employees` app. + +.. note:: + An employee card can be thought of as an employee personnel file. + +The *Personal Information* section lists all of the fields that are available to enter on the +employee's card. To access this section, go to :menuselection:`Payroll --> Configuration --> +Personal Info`. + +.. image:: payroll/personal-info.png + :align: center + :alt: Personal information that appear on employee cards to enter. + +To edit an entry, select it from the list. Then, click the :guilabel:`Edit` button, and modify the +entry. When done, click :guilabel:`Save` or :guilabel:`Discard` to save the information or cancel +the edits. + +.. image:: payroll/personal-new.png + :align: center + :alt: New personal information entry. + +The two most important fields on the personal info form are :guilabel:`Is Required` and +:guilabel:`Display Type`. Checking the :guilabel:`Is Required` box makes the field mandatory on the +employee's card. + +The :guilabel:`Display Type` drop-down menu allows for the information to be entered in a variety of +ways, from a :guilabel:`Text` box, to a customizable :guilabel:`Radio` button, a +:guilabel:`Checkbox`, a :guilabel:`Document`, and more. + +Once the information is entered, click the :guilabel:`Save` button to save the entry. + +Resume +------ + +.. note:: + Currently, the :guilabel:`Resume` feature found inside the :menuselection:`Payroll app --> + Configuration` menu is still in development and only serves a specific use case for Belgian + markets. The documentation will be updated when this section has matured to more markets. diff --git a/content/applications/hr/payroll/advantages.png b/content/applications/hr/payroll/advantages.png new file mode 100644 index 0000000000..0c0876168e Binary files /dev/null and b/content/applications/hr/payroll/advantages.png differ diff --git a/content/applications/hr/payroll/input-type-new.png b/content/applications/hr/payroll/input-type-new.png new file mode 100644 index 0000000000..1a287e8f44 Binary files /dev/null and b/content/applications/hr/payroll/input-type-new.png differ diff --git a/content/applications/hr/payroll/new-advantage.png b/content/applications/hr/payroll/new-advantage.png new file mode 100644 index 0000000000..b96fac71b3 Binary files /dev/null and b/content/applications/hr/payroll/new-advantage.png differ diff --git a/content/applications/hr/payroll/new-rule.png b/content/applications/hr/payroll/new-rule.png new file mode 100644 index 0000000000..081cdac54d Binary files /dev/null and b/content/applications/hr/payroll/new-rule.png differ diff --git a/content/applications/hr/payroll/new-structure.png b/content/applications/hr/payroll/new-structure.png new file mode 100644 index 0000000000..f5e9d8e143 Binary files /dev/null and b/content/applications/hr/payroll/new-structure.png differ diff --git a/content/applications/hr/payroll/new-work-entry.png b/content/applications/hr/payroll/new-work-entry.png new file mode 100644 index 0000000000..877c73b74d Binary files /dev/null and b/content/applications/hr/payroll/new-work-entry.png differ diff --git a/content/applications/hr/payroll/new-working-times.png b/content/applications/hr/payroll/new-working-times.png new file mode 100644 index 0000000000..69adfa67fb Binary files /dev/null and b/content/applications/hr/payroll/new-working-times.png differ diff --git a/content/applications/hr/payroll/other-input.png b/content/applications/hr/payroll/other-input.png new file mode 100644 index 0000000000..2d435d506c Binary files /dev/null and b/content/applications/hr/payroll/other-input.png differ diff --git a/content/applications/hr/payroll/payroll-settings.png b/content/applications/hr/payroll/payroll-settings.png new file mode 100644 index 0000000000..53165be393 Binary files /dev/null and b/content/applications/hr/payroll/payroll-settings.png differ diff --git a/content/applications/hr/payroll/personal-info.png b/content/applications/hr/payroll/personal-info.png new file mode 100644 index 0000000000..353495ca4f Binary files /dev/null and b/content/applications/hr/payroll/personal-info.png differ diff --git a/content/applications/hr/payroll/personal-new.png b/content/applications/hr/payroll/personal-new.png new file mode 100644 index 0000000000..2dd950aafe Binary files /dev/null and b/content/applications/hr/payroll/personal-new.png differ diff --git a/content/applications/hr/payroll/rules.png b/content/applications/hr/payroll/rules.png new file mode 100644 index 0000000000..b324da6799 Binary files /dev/null and b/content/applications/hr/payroll/rules.png differ diff --git a/content/applications/hr/payroll/salary-structure.png b/content/applications/hr/payroll/salary-structure.png new file mode 100644 index 0000000000..bbeb592475 Binary files /dev/null and b/content/applications/hr/payroll/salary-structure.png differ diff --git a/content/applications/hr/payroll/structure-regular-pay-rules.png b/content/applications/hr/payroll/structure-regular-pay-rules.png new file mode 100644 index 0000000000..5b6c501983 Binary files /dev/null and b/content/applications/hr/payroll/structure-regular-pay-rules.png differ diff --git a/content/applications/hr/payroll/structure-type.png b/content/applications/hr/payroll/structure-type.png new file mode 100644 index 0000000000..4f380975e1 Binary files /dev/null and b/content/applications/hr/payroll/structure-type.png differ diff --git a/content/applications/hr/payroll/work-entry-types.png b/content/applications/hr/payroll/work-entry-types.png new file mode 100644 index 0000000000..bb2ff3aee7 Binary files /dev/null and b/content/applications/hr/payroll/work-entry-types.png differ diff --git a/content/applications/hr/payroll/working-times.png b/content/applications/hr/payroll/working-times.png new file mode 100644 index 0000000000..cd9d47bb53 Binary files /dev/null and b/content/applications/hr/payroll/working-times.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products.rst b/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products.rst index 1d7726ec90..2efc6c2de0 100644 --- a/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products.rst +++ b/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products.rst @@ -4,35 +4,120 @@ Inventory adjustments In any warehouse management system, the recorded inventory counts in the database might not always match the actual inventory counts in the warehouse. The discrepancy between the two counts can be -due to theft, damages, human errors, or other factors. As such, inventory adjustments must be made +due to damages, human errors, theft, or other factors. As such, inventory adjustments must be made to reconcile the differences, and ensure that the recorded counts in the database match the actual counts in the warehouse. -In Odoo, inventory adjustments can be accessed through :menuselection:`Inventory --> Operations --> -Inventory Adjustments`. +Inventory Adjustments page +========================== -The :guilabel:`Inventory Adjustments` page shows all products that are currently in stock. Each -line contains the following information: +To view the *Inventory Adjustments* page, navigate to :menuselection:`Inventory app --> Operations +--> Inventory Adjustments`. -- :guilabel:`Product` -- :guilabel:`Lot/Serial Number` -- :guilabel:`On Hand Quantity` +.. image:: count_products/count-products-inventory-adjustments-page.png + :align: center + :alt: In stock products listed on the Inventory adjustments page. -Add a new line -============== +On the :guilabel:`Inventory Adjustments` page, all products that are currently in stock are listed, +with each product line containing the following information: + +- :guilabel:`Location`: the specific location in the warehouse where a product is stored. +- :guilabel:`Product`: the product whose quantity is listed on the inventory adjustment line. +- :guilabel:`Lot/Serial Number`: the tracking identifier assigned to the specific product listed. It + can contain letters, numbers, or a combination of both. + +.. note:: + If a specific product has a quantity of more than `1.00` in stock, and more than one serial + number (or lot number) assigned to it, each uniquely-identified product is displayed on its own + product line with its own lot/serial number, displayed under the :guilabel:`Lot/Serial Number` + column. + +- :guilabel:`On Hand Quantity`: the quantity of the product currently recorded in the database. +- :guilabel:`UoM`: the *unit of measure* in which the product is measured. Unless otherwise + specified (i.e., in :guilabel:`Pounds` or :guilabel:`Ounces`), the default :abbr:`UoM (Unit of + Measure)` is :guilabel:`Units`. +- :guilabel:`Counted Quantity`: the real quantity counted during an inventory count. This field is + left blank by default, but can be changed, depending on if it matches the :guilabel:`On Hand + Quantity` or not. +- :guilabel:`Difference`: the difference between the :guilabel:`On Hand Quantity` and + :guilabel:`Counted Quantity`, once an inventory adjustment is made. The difference is + automatically calculated after every inventory adjustment. +- :guilabel:`Scheduled Date`: the date at which a count should be made. If not otherwise specified, + this date will default to the 31st of December of the current year. +- :guilabel:`User`: the person assigned to the count in the database. This can either be the person + physically counting the inventory, or applying the count in the database. +- :guilabel:`Product Category`: the category assigned internally to a specific product. Unless + otherwise specified (i.e., as :guilabel:`Consumable` or :guilabel:`Rental`), the default *Product + Category* is set to :guilabel:`All`. +- :guilabel:`Available Quantity`: the quantity of a specific product that is currently available, + based on any outstanding/uncompleted sales orders, purchase orders, or manufacturing orders that + might change the available quantity once fulfilled. +- :guilabel:`Accounting Date`: the date on which the adjustments will be accounted in the Odoo + *Accounting* app. +- :guilabel:`Company`: the company whose database these inventory adjustments are being made on. The + company is listed in the top right corner of the database, next to the user currently logged in. + +.. tip:: + Some columns are hidden by default. To reveal these columns, click the :guilabel:`additional + options` button (three dots icon) to the far right of the form's top row, and select any desired + column to reveal by clicking the checkbox next to that option. + +Create an inventory adjustment +------------------------------ + +To create a new inventory adjustment from the :menuselection:`Inventory Adjustments` page, click +:guilabel:`Create`. Doing so creates a new, blank inventory adjustment line at the bottom of the +page. + +On this blank inventory adjustment line, click the drop-down menu under the :guilabel:`Product` +column, and select a product. If the selected product is tracked using either lots or serial +numbers, the desired lot or serial number can also be chosen from the drop-down menu under the +:guilabel:`Lot/Serial Number` column. + +Next, set the value in the :guilabel:`Counted Quantity` column to the quantity counted for that +product during the inventory adjustment process. + +.. note:: + The :guilabel:`Counted Quantity` for new inventory adjustments is set to `0.00` by default. An + inventory move with `0.00` :guilabel:`Quantity Done` is recorded in the product's inventory + adjustment history, so it should be set to reflect the actual quantity counted. + +To the right of the :guilabel:`Counted Quantity` column, the :guilabel:`Scheduled Date` and +:guilabel:`User` can also be changed via their respective drop-down menus. Changing the +:guilabel:`Scheduled Date` changes the date that the inventory adjustment should be processed on, +and selecting a responsible :guilabel:`User` assigns a user to the specific inventory adjustment +(for traceability purposes). + +Once all changes have been made to the new inventory adjustment line, click away from the line. +Doing so saves the adjustment, and moves the line to the top of the page. + +If the :guilabel:`Counted Quantity` is greater than the :guilabel:`On Hand Quantity`, the value in +the :guilabel:`Difference` column is **green**. If the :guilabel:`Counted Quantity` is less than the +:guilabel:`On Hand Quantity`, the value in the :guilabel:`Difference` column is **red**. If the +quantities match, and haven't been changed at all, no value appears in the :guilabel:`Difference` +column. + +.. image:: count_products/count-products-difference-column.png + :align: center + :alt: Difference column on inventory adjustments page. + +At this stage, the count (:dfn:`inventory adjustment`) is recorded, but not yet applied. This means +that the quantity on hand before the adjustment has not yet been updated to match the new, real +counted quantity. -To add an inventory adjustment line, click :guilabel:`Create` and fill in the :guilabel:`Product` -and :guilabel:`Counted Quantity` fields. Then click :guilabel:`Save`. +There are two ways to apply the new inventory adjustment. The first way is to click the +:guilabel:`Apply` button on the line at the far right of the page. The second way is to click the +checkbox on the far left of the line. Doing so reveals new button options at the top of the page, +one of which is an :guilabel:`Apply` button. Clicking this button instead causes an +:guilabel:`Inventory Adjustment Reference / Reason` pop-up window to appear. -At this stage, the count is recorded but not yet *applied*. Meaning the quantity on hand is not yet -updated to match the new :guilabel:`Counted Quantity`. +From this pop-up menu, a reference or reason can be assigned to the inventory adjustment. By +default, the :guilabel:`Inventory Reference / Reason` field is pre-populated with the date the +adjustment is being made on, but can be changed to reflect whatever reference or reason is desired. -To apply the new :guilabel:`Counted Quantity`, click :guilabel:`Apply` on the line or the -:guilabel:`Apply All` button on the top of the page. If :guilabel:`Apply All` is clicked, a -reference or reason can be entered before clicking :guilabel:`Apply`. +Once ready, click :guilabel:`Apply` to apply the inventory adjustment. -.. image:: count_products/apply-inventory-adjustment.png - :scale: 60% +.. image:: count_products/count-products-apply-inventory-adjustment.png :align: center :alt: Apply all option applies the inventory adjustment once a reason is specified. @@ -40,61 +125,111 @@ Count products ============== Counting products is a recurring activity in a warehouse. Once a count is complete, go to -:menuselection:`Inventory --> Operations --> Inventory Adjustments` to update the +:menuselection:`Inventory app --> Operations --> Inventory Adjustments` to update the :guilabel:`Counted Quantity` column for each product line. -If a count matches the :guilabel:`On Hand Quantity` recorded in the database, click on -:guilabel:`Set`, which will copy the value in the :guilabel:`On Hand Quantity` field and paste it -in the :guilabel:`Counted Quantity` field. A move with `0.00` :guilabel:`Quantity Done` will be -recorded in the product's inventory adjustment history. +On each product line, identify whether the value in the :guilabel:`On Hand Quantity` column recorded +in the database matches the newly-counted value. If the recorded value and the counted value do +match, click the :guilabel:`Set` button (target icon) at the far right of the product line. -If a count does *not* match the :guilabel:`On Hand Quantity` recorded in the database, record the -count in the :guilabel:`Counted Quantity` field. When :guilabel:`Apply` is clicked, a move with the -difference between the :guilabel:`On Hand Quantity` and :guilabel:`Counted Quantity` will be +Doing so copies the value from the :guilabel:`On Hand Quantity` column over to the +:guilabel:`Counted Quantity` column, and sets the value of the :guilabel:`Difference` column to +`0.00`. Subsequently, once applied, an inventory move with `0.00` :guilabel:`Quantity Done` is recorded in the product's inventory adjustment history. -.. image:: count_products/history-inventory-adjustments.png +.. image:: count_products/count-products-zero-move.png + :align: center + :alt: Zero count inventory adjustment move. + +If the newly-counted value for a given product does **not** match the value in the :guilabel:`On +Hand Quantity` recorded in the database, instead of clicking the :guilabel:`Set` button, record the +real value in the field in the :guilabel:`Counted Quantity` column. + +To do so, click the field in the :guilabel:`Counted Quantity` column on the specific inventory +adjustment line for the product whose count is being changed. This automatically assigns a +:guilabel:`Counted Quantity` of `0.00`. + +To change this value, type in a new value that matches the real, newly-counted value. Then, click +away from the line. Doing so saves the adjustment, and automatically adjusts the value in the +:guilabel:`Difference` column. + +If the :guilabel:`Counted Quantity` is greater than the :guilabel:`On Hand Quantity`, the value in +the :guilabel:`Difference` column is **green**. If the :guilabel:`Counted Quantity` is less than the +:guilabel:`On Hand Quantity`, the value in the :guilabel:`Difference` column is **red**. If the +quantities match, and haven't been changed at all, no value appears in the :guilabel:`Difference` +column. + +Subsequently, once applied, a move with the difference between the :guilabel:`On Hand Quantity` and +the :guilabel:`Counted Quantity` is recorded in the product's inventory adjustment history. + +.. image:: count_products/count-products-history-inventory-adjustments.png :align: center :alt: Inventory Adjustments History dashboard detailing a list of prior product moves. -.. note:: - Sometimes a count occurs, but can not be applied in the database right away. In the time between +.. important:: + Sometimes a count occurs, but cannot be applied in the database right away. In the time between the actual count and applying the inventory adjustment, product moves can occur. In that case, - the :guilabel:`On Hand Quantity` in the database can change and will not be consistent with the - counted quantity. As an extra caution measure, Odoo will ask for confirmation before applying - the inventory adjustment. + the on-hand quantity in the database can change and no longer be consistent with the counted + quantity. As an extra precaution, Odoo asks for confirmation before applying the inventory + adjustment. -Plan counts -=========== +Change inventory count frequency +================================ -Each inventory adjustment line contains the following information: +By default, the *scheduled date* for inventory adjustments are always scheduled for the 31st of +December of the current year. However, for some companies, it is crucial that they have an accurate +inventory count at all times. In such cases, the default scheduled date can be modified. -- :guilabel:`Scheduled Date`: the date at which a count should be made. -- :guilabel:`User`: the person in charge of the count. -- :guilabel:`Accounting Date`: the date at which the adjustments will be accounted. The column is - hidden by default, but can be made visible by opening the column options icon. +To modify the default scheduled date, go to :menuselection:`Inventory app --> Configuration --> +Settings`. Then, in the :guilabel:`Operations` section, locate the :guilabel:`Annual Inventory Day +and Month` setting, which includes a drop-down menu that is set to `31 December` by default. -.. important:: - In the Barcode app, users can only view counts assigned to them that are scheduled for today or - earlier. +.. image:: count_products/count-products-annual-inventory.png + :align: center + :alt: Adjust the next inventory count date with the Annual Inventory Day and Month setting. + +To change the day, click the :guilabel:`31`, and change it to a day within the range `1-31`, +depending on the desired month of the year. + +Then, to change the month, click :guilabel:`December` to reveal the drop-down menu, and select the +desired month. + +Once all desired changes have been made, click :guilabel:`Save` to save all changes. + +Plan big inventory counts +------------------------- -To plan big counts, select the desired product lines on the :guilabel:`Inventory Adjustments` page. -Then, click :guilabel:`Request a Count` and fill in the following information: +To plan big inventory counts, such as a full count of everything currently in stock, first navigate +to :menuselection:`Inventory app --> Operations --> Inventory Adjustments`. + +Then, select the desired products to be counted by clicking the checkbox on the far left of each +product line. + +.. tip:: + To request a count of **all** products currently in stock, click the checkbox at the very top of + the table, in the header row next to the :guilabel:`Location` label. This selects **all** product + lines. + +.. image:: count_products/count-products-count-popup.png + :align: center + :alt: Request a count popup on inventory adjustments page. + +Once all desired products have been selected, click the :guilabel:`Request a Count` button at the +top of the page. This causes a :guilabel:`Request a Count` pop-up window to appear. From this +pop-up, fill in the following information: - :guilabel:`Inventory Date`: the planned date of the count. - :guilabel:`User`: the user responsible for the count. - :guilabel:`Accounting Date`: the date at which the inventory adjustment will be accounted. -- :guilabel:`Count`: to leave the :guilabel:`On Hand Quantity` of each product line blank, select - :guilabel:`Leave Empty`. To prefill the :guilabel:`On Hand Quantity` of each product line with - the current value recorded in the database, select :guilabel:`Set Current Value`. +- :guilabel:`Count`: to leave the on-hand quantity of each product line blank, select + :guilabel:`Leave Empty`. To prefill the on-hand quantity of each product line with the current + value recorded in the database, select :guilabel:`Set Current Value`. -Finally, click :guilabel:`Confirm` to request the count. +Finally, once ready, click :guilabel:`Confirm` to request the count. -By default, after an inventory adjustment is applied, the scheduled date for the next count is the -31st of December of the current year. To modify the default scheduled date, go to -:menuselection:`Inventory --> Configuration --> Settings --> Operations` and change the date in the -:guilabel:`Annual Inventory Day and Month` setting. +.. important:: + In the Odoo *Barcode* app, users can only view inventory counts that are assigned to **them**, + and are scheduled for **today** or **earlier**. -.. image:: count_products/annual-inventory.png - :align: center - :alt: Adjust the next inventory count date with the Annual Inventory Day and Month setting. +.. seealso:: + :doc:`/applications/inventory_and_mrp/inventory/management/inventory_adjustments/cycle_counts` diff --git a/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/apply-inventory-adjustment.png b/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/apply-inventory-adjustment.png deleted file mode 100644 index 3978343130..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/apply-inventory-adjustment.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/annual-inventory.png b/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-annual-inventory.png similarity index 100% rename from content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/annual-inventory.png rename to content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-annual-inventory.png diff --git a/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-apply-inventory-adjustment.png b/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-apply-inventory-adjustment.png new file mode 100644 index 0000000000..a072f35326 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-apply-inventory-adjustment.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-count-popup.png b/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-count-popup.png new file mode 100644 index 0000000000..db38a4894e Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-count-popup.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-difference-column.png b/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-difference-column.png new file mode 100644 index 0000000000..ba13054ecc Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-difference-column.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/history-inventory-adjustments.png b/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-history-inventory-adjustments.png similarity index 100% rename from content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/history-inventory-adjustments.png rename to content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-history-inventory-adjustments.png diff --git a/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-inventory-adjustments-page.png b/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-inventory-adjustments-page.png new file mode 100644 index 0000000000..d852d78f59 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-inventory-adjustments-page.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-zero-move.png b/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-zero-move.png new file mode 100644 index 0000000000..421d063e60 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/inventory_adjustments/count_products/count-products-zero-move.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates.rst b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates.rst index cb06249886..6d8558e760 100644 --- a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates.rst +++ b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates.rst @@ -1,65 +1,267 @@ ================ -Expiration Dates +Expiration dates ================ -In many companies, products have expiration dates and they should be managed based on those dates. -In the food industry, for example, tracking and managing product stock based on expiration dates is -mandatory to avoid selling expired products to customers. +In Odoo, *expiration dates* can be used to manage and track the lifecycles of perishable products, +from purchase to sale. Using expiration dates reduces product loss due to unexpected expiry, and +helps to avoid sending expired products to customers. -With Odoo, you can track and manage your products based on their expiration dates, even if they are -already tracked by lots or serial numbers. +In Odoo, only products that are tracked using *lots* and *serial numbers* can be assigned expiration +information. Once a lot or serial number has been assigned, an expiration date can be set. This is +especially helpful for companies (such as food manufacturers) that consistently, or exclusively, buy +and sell perishable products. -Configuration -============= +.. seealso:: + - :doc:`/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots` + - :doc:`/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers` -Application configuration -------------------------- +Enable expiration dates +======================= -To use expiration date tracking, open the *Inventory* application and go to -:menuselection:`Configuration --> Settings` and activate the *Lots & Serial Numbers* and *Expiration -Dates* features. +To enable the use of *expiration dates*, go to :menuselection:`Inventory app --> Configuration --> +Settings`, and scroll down to the :guilabel:`Traceability` section. Then, click the checkbox to +enable the :guilabel:`Lots & Serial Numbers` feature. -.. image:: expiration_dates/expiration_dates_01.png +Once that feature is activated, a new option will appear to enable :guilabel:`Expiration Dates`. +Click that checkbox to enable the feature, and be sure to :guilabel:`Save` changes. + +.. image:: expiration_dates/expiration-dates-enabled-settings.png :align: center + :alt: Enabled lots and serial numbers and expiration dates settings. + +.. tip:: + Once the :guilabel:`Lots & Serial Numbers` feature is activated, additional features appear to + :guilabel:`Display Lots & Serial Numbers on Delivery Slips`; to :guilabel:`Display Lots & Serial + Numbers on Invoices`; and to :guilabel:`Display Expiration Dates on Delivery Slips`. Activating + these features helps with end-to-end traceability, making it easier to manage product recalls, + identify "bad" batches of products, and more. + +Configure expiration dates on products +====================================== + +Once the :guilabel:`Lots & Serial Numbers` and :guilabel:`Expiration Dates` features have been +enabled in the settings of the *Inventory* app, expiration information can be configured on +individual products. + +To do so, go to :menuselection:`Inventory app --> Products --> Products`, and select a product to +edit. Selecting a product reveals the product form for that particular item. Once on the product +form, click :guilabel:`Edit` in the upper-left corner to make changes. + +.. important:: + To be tracked using lots or serial numbers, or to configure expiration information, products + *must* have their :guilabel:`Product Type` set as :guilabel:`Storable Product` under the + :guilabel:`General Information` tab. + +Then, click the :guilabel:`Inventory` tab, and scroll down to the :guilabel:`Traceability` section. +From here, make sure that either :guilabel:`By Unique Serial Number` or :guilabel:`By Lots` is +checked. -Product configuration ---------------------- +Once it is, a new :guilabel:`Expiration Date` checkbox appears that must also be clicked. When both +are enabled, a new :guilabel:`Dates` field appears to the right. -Now, you can define different dates in the *inventory tab* of the product form: +.. note:: + If a product has stock on-hand prior to activating tracking by lots or serial numbers, an + inventory adjustment might need to be performed in order to assign lot numbers to the existing + stock. -- Product Use Time: the number of days before the goods start deteriorating, without being - dangerous. This is used to calculate the Best before date on each lot/serial number received. -- Product Life Time: the number of days before the goods may become dangerous and must not be - consumed. This is used to calculate the Expiration date on each lot/serial number received. -- Product Removal Time: shows the number of days before the goods should be removed from the stock. - This is used to calculate the Removal date on each lot/serial number received. -- Product Alert Time: refers to the number of days before an alert should be raised on the - lot/serial number. This is used to calculate the Alert date on each lot/serial number received. - Once the Alert date is reached, an Activity is assigned on the relevant lot/serial number to the - Responsible user defined on the Product. +.. tip:: + For processing large quantities of products on receipts or deliveries, it is recommended to track + using lots, so multiple products can be traced back to the same lot, if any issues arise. -.. image:: expiration_dates/expiration_dates_02.png +.. image:: expiration_dates/expiration-dates-product-configuration.png :align: center + :alt: Expiration dates configuration on the product form. -Expiration Date on Lots/Serial Numbers -====================================== +Under the :guilabel:`Dates` field, there are four categories of expiration information to configure +for the product: + +- :guilabel:`Expiration Time`: the number of days after receiving products (either from a vendor or + in stock after production) in which goods may become dangerous and should not be used or consumed. +- :guilabel:`Best Before Time`: the number of days before the expiration date in which the goods + start deteriorating, **without** necessarily being dangerous yet. +- :guilabel:`Removal Time`: the number of days before the expiration date in which the goods should + be removed from stock. +- :guilabel:`Alert Time`: the number of days before the expiration date in which an alert should be + raised on goods in a particular lot or containing a particular serial number. + +.. note:: + The values entered into these fields automatically compute the expiration date for goods entered + into stock, whether purchased from a vendor or manufactured in-house. + +Once all the expiration information has been configured, click :guilabel:`Save` to save all changes. + +.. tip:: + If the :guilabel:`Dates` field is not populated with any values for expiration information, dates + (and lots) can be manually assigned upon receipts and deliveries in and out of the warehouse. + Even when assigned, they can still be overwritten and changed manually if needed, as well. + +Set expiration dates on receipts with lots & serial numbers +=========================================================== + +Generating expiration dates for **incoming** goods can be done directly from the purchase order. To +create a purchase order, go to the :menuselection:`Purchase` app and click :guilabel:`Create` to +create a new request for quotation (RFQ). -When receiving a product into inventory, the dates will automatically be updated on the -corresponding lot/serial number. These updates will be based on the receipt date of the product and -the days set on the product form. +Then, fill out the information by adding a :guilabel:`Vendor`, and add products to the +:guilabel:`Product` lines by clicking :guilabel:`Add a product`. -.. image:: expiration_dates/expiration_dates_03.png +Choose the desired quantity to order by changing the number in the :guilabel:`Quantity` column, and +click :guilabel:`Confirm Order`. This converts the :abbr:`RFQ (request for quotation)` into a +purchase order. + +Click the :guilabel:`Receipt` smart button at the top of the purchase order to be taken to the +warehouse receipt form. + +.. note:: + Clicking :guilabel:`Validate` before assigning a serial number to the ordered product quantities + causes a :guilabel:`User Error` popup to appear. The popup requires entry of a lot or serial + number for the ordered products. The :abbr:`RFQ (request for quotation)` cannot be validated + without an assigned lot or serial number. + + .. image:: expiration_dates/expiration-dates-user-error-popup.png + :align: center + :alt: User error popup when validating an order with no lot number. + +From here, click the :guilabel:`Additional Options` menu (hamburger) icon located on the far-right +of the product line. When clicked, a :guilabel:`Detailed Operations` pop-up will appear. + +In this pop-up, click :guilabel:`Add a line`, and assign a lot or serial number under the +:guilabel:`Lot/Serial Number Name` field. + +An expiration date automatically populates, based on the configuration on the product form (if +previously configured). + +.. tip:: + If the :guilabel:`Dates` field on the product form has not been configured, this date can be + manually entered. + +After the expiration date has been established, mark the :guilabel:`Done` quantities, and click +:guilabel:`Confirm` to close the pop-up. Finally, click :guilabel:`Validate`. + +.. image:: expiration_dates/expiration-dates-detailed-operations-popup.png :align: center + :alt: Detailed operations popup showing expiration dates for ordered products. + +A :guilabel:`Traceability` smart button will appear upon validating the receipt. Click the +:guilabel:`Traceability` smart button to see the updated :guilabel:`Traceability Report`, which +includes: a :guilabel:`Reference` document; the :guilabel:`Product` being traced; the +:guilabel:`Lot/Serial #`; and more. + +Set expiration dates on manufactured products +============================================= -.. image:: expiration_dates/expiration_dates_04.png +Expiration dates can also be generated for products manufactured in-house. To assign expiration +dates to manufactured products, a manufacturing order (MO) needs to be completed. + +To create a :abbr:`MO (manufacturing order)`, go to :menuselection:`Manufacturing app --> Operations +--> Manufacturing Orders`, and click :guilabel:`Create`. Choose a product to manufacture from the +:guilabel:`Product` field drop-down menu, then select the :guilabel:`Quantity` to produce. + +.. image:: expiration_dates/expiration-dates-manufacturing-order.png :align: center + :alt: Manufacturing order for product with expiration date. + +.. note:: + To manufacture a product, there must be materials to consume in the lines in the + :guilabel:`Product` column. This can be achieved either by creating a :guilabel:`Bill of + Material` for the :guilabel:`Product`, or manually adding materials to consume by clicking + :guilabel:`Add a line`. + +Once ready, click :guilabel:`Confirm`. + +Next to :guilabel:`Lot/Serial Number`, either select an existing lot number from the drop-down menu, +or click the green :guilabel:`+` sign to automatically assign a new lot number. + +Then, select a number of units for the :guilabel:`Quantity` field, and click :guilabel:`Mark as +Done`. + +Click on the :guilabel:`External Link` icon in the assigned :guilabel:`Lot/Serial Number` field. A +pop-up appears, revealing a detail form for that specific number. + +On that pop-up, under the :guilabel:`Dates` tab, all expiration information that was previously +configured for the product is displayed. That same information is also available on the detail form +for that specific product, or by going to :menuselection:`Inventory app --> Products --> Lots/Serial +Numbers`. + +.. image:: expiration_dates/expiration-dates-dates-tab-lot-number.png + :align: center + :alt: Dates tab with expiration information for specific lot number. + +Sell products with expiration dates +=================================== + +Selling perishable products with expiration dates is done the same as any other type of product. The +first step in selling perishable products is to create a sales order. + +To do that, go to :menuselection:`Sales app --> Create` to create a new quotation, and fill out the +information on the sales order form. + +Add a :guilabel:`Customer`, click :guilabel:`Add a product` to add the desired products to the +:guilabel:`Product` lines, and set a :guilabel:`Quantity` for the products. + +Then, click the :guilabel:`Other Info` tab. Under the :guilabel:`Delivery` section, change the +:guilabel:`Delivery Date` to a date after the expected date, and click the :guilabel:`green +checkmark` icon to confirm the date. Finally, click :guilabel:`Confirm` to confirm the sales order. + +Next, click the :guilabel:`Delivery` smart button at the top of the sales order to see the warehouse +receipt form. + +On the warehouse receipt form, click :guilabel:`Validate`, and then :guilabel:`Apply` in the +accompanying pop-up window, to automatically process all :guilabel:`Done` quantities, and deliver +the products to the customer. + +If the products are delivered before the :guilabel:`Alert Date` set on the product form, then no +alerts will be created. + +.. important:: + To sell perishable products with expiration dates, the :guilabel:`Removal Strategy` for the + :guilabel:`Location` the products are stored in must be set to :abbr:`FEFO (First Expiry, First + Out)`. If there is not enough stock of perishable products in one lot, Odoo will automatically + take the remaining quantity required from a second lot with the next-soonest expiration date. + Removal strategies can also be set on :guilabel:`Product Categories`. + +.. seealso:: + :doc:`/applications/inventory_and_mrp/inventory/routes/strategies/removal` + +View expiration dates for lots & serial numbers +=============================================== + +To view (and/or group) all products with expiration dates by lot number, go to +:menuselection:`Inventory app --> Products --> Lots/Serial Numbers`. + +Once there, remove any default search filters from the :guilabel:`Search...` bar. Then, click +:guilabel:`Group By`, choose :guilabel:`Add Custom Group`, and select the :guilabel:`Expiration +Date` parameter from the drop-down menu. Finally, click :guilabel:`Apply` to apply the filter. + +Doing so breaks down all perishable products, their expiration dates, and the assigned lot number. + +.. image:: expiration_dates/expiration-dates-group-by-dates.png + :align: center + :alt: Group by expiration dates on lots and serial numbers page. + +Expiration alerts +----------------- + +To see expiration alerts, go to :menuselection:`Inventory app --> Products --> Lots/Serial Numbers`. + +Then, click into a :guilabel:`Lot/Serial Number` with perishable products. Doing so reveals the +serial number detail form. On the serial number detail form, click the :guilabel:`Dates` tab to see +all expiration information related to the products. + +To edit the form, click :guilabel:`Edit` in the upper-left corner of the form, then change the +:guilabel:`Expiration Date` to today's date (or earlier), and click :guilabel:`Save` to save +changes. + +After saving, the lot number form displays a red :guilabel:`Expiration Alert` at the top of the form +to indicate that the products in this lot are either expired or expiring soon. From here, click back +to the :guilabel:`Lots/Serial Numbers` page (via the breadcrumbs). -Expiration Alerts -================= +To see the new expiration alert, or any expiration alerts for products that are expired (or will +expire soon), remove all of the search filters from the :guilabel:`Search...` bar on the +:guilabel:`Lots/Serial Numbers` dashboard. -You can access expiration alerts from the *inventory* app. To do so, go to :menuselection:`Master -Data --> Lots/Serial Numbers`. There, you can use the pre-existing filter to show all the -lots/serial numbers that have exceeded their respective alert dates. +Then, click :guilabel:`Filters`, and choose :guilabel:`Expiration Alerts`. -.. image:: expiration_dates/expiration_dates_05.png +.. image:: expiration_dates/expiration-dates-expiration-alert.png :align: center + :alt: Expiration alert for product past the expiration date. diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-dates-tab-lot-number.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-dates-tab-lot-number.png new file mode 100644 index 0000000000..37e04a06e1 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-dates-tab-lot-number.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-detailed-operations-popup.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-detailed-operations-popup.png new file mode 100644 index 0000000000..e73eaa9421 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-detailed-operations-popup.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-enabled-settings.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-enabled-settings.png new file mode 100644 index 0000000000..0ad0fcb9f7 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-enabled-settings.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-expiration-alert.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-expiration-alert.png new file mode 100644 index 0000000000..0bded14d3f Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-expiration-alert.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-group-by-dates.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-group-by-dates.png new file mode 100644 index 0000000000..c71509d885 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-group-by-dates.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-manufacturing-order.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-manufacturing-order.png new file mode 100644 index 0000000000..2953644e24 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-manufacturing-order.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-product-configuration.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-product-configuration.png new file mode 100644 index 0000000000..00d7f9ab9a Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-product-configuration.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-user-error-popup.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-user-error-popup.png new file mode 100644 index 0000000000..cca7023b41 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration-dates-user-error-popup.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_01.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_01.png deleted file mode 100644 index e3e9be31b4..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_01.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_02.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_02.png deleted file mode 100644 index 6c77dfa5c8..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_02.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_03.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_03.png deleted file mode 100644 index bb454605d3..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_03.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_04.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_04.png deleted file mode 100644 index de9bc2d802..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_04.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_05.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_05.png deleted file mode 100644 index 0e41dc9e75..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/expiration_dates/expiration_dates_05.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots.rst b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots.rst index cc7f5a1e0a..4df192fb4b 100644 --- a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots.rst +++ b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots.rst @@ -1,137 +1,282 @@ -================================= -Manage lots of identical products -================================= +===================================== +Use lots to manage groups of products +===================================== -Lots are useful for products you receive in great quantity and for which -a lot number can help in reporting, quality controls, or any other info. -Lots will help identify a number of pieces having, for instance, a -production fault. It can be useful for a batch production of clothes or -food. +*Lots* are one of the two ways to identify and track products in Odoo. A lot usually indicates a +specific batch of an item that was received, is currently stored, or was shipped from a warehouse, +but can also pertain to a batch of products manufactured in-house, as well. -Odoo has the capacity to manage lots, ensuring compliance with the -traceability requirements imposed by the majority of industries. +Manufacturers assign lot numbers to groups of products that have common properties; this can lead to +multiple goods sharing the same lot number. This helps to identify a number of products in a single +group, and allows for end-to-end traceability of these products through each step in their +lifecycles. -The double-entry management in Odoo enables you to run very advanced -traceability. +Lots are useful for products that are manufactured or received in large quantities (such as clothes +or food), and can be used to trace a product back to a group. This is especially useful when +managing product recalls or expiration dates. -Setting Up -========== +.. seealso:: + :doc:`/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers` -Application Configuration -------------------------- +Enable lots & serial numbers +============================ -First, you need to activate the tracking of lot numbers. To do so, go to -:menuselection:`Inventory --> Configuration --> Settings` and tick *Lots & Serial -Numbers*. Then, click on save. +To track products using lots, the *Lots & Serial Numbers* feature must be enabled. Go to +the :menuselection:`Inventory app --> Configuration --> Settings`, scroll down to the +:guilabel:`Traceability` section, and click the box next to :guilabel:`Lots & Serial Numbers`. Then, +click the :guilabel:`Save` button to save changes. -.. image:: lots/lots_01.png - :align: center +.. image:: lots/lots-enabled-lots-setting.png + :align: center + :alt: Enabled lots and serial numbers feature in inventory settings. -Product Configuration ---------------------- +Track products by lots +====================== -Now, you have to configure which products you want to track by serial -numbers. +Once the :guilabel:`Lots & Serial Numbers` setting has been activated, individual products can now +be configured to be tracked using lots. To do this, go to the :menuselection:`Inventory app --> +Products --> Products`, and choose a product. -Go to :menuselection:`Master Data --> Products` and open the product of your choice. -There, click on *Edit* and select *Tracking by Lots* in the -inventory tab. +Once on the product form, click :guilabel:`Edit` to make changes to the form. Then, click the +:guilabel:`Inventory` tab. In the :guilabel:`Traceability` section, click :guilabel:`By Lots`. Then, +click :guilabel:`Save` to save changes. Existing or new lot numbers can now be assigned to +newly-received or manufactured batches of this product. -.. image:: lots/lots_02.png - :align: center +.. important:: + If a product has stock on-hand prior to activating tracking by lots or serial numbers, an + inventory adjustment might need to be performed to assign lot numbers to the existing stock. -.. image:: lots/lots_03.png - :align: center +.. image:: lots/lots-tracking-product-form.png + :align: center + :alt: Enabled tracking by lots feature on product form. -Manage Lots -=========== +Create new lots for products already in stock +--------------------------------------------- -Receipts --------- +New lots can be created for products already in stock with no assigned lot number. To do this, go to +the :menuselection:`Inventory app --> Products --> Lots/Serial Numbers`, and click +:guilabel:`Create`. Doing so reveals a separate page where a new :guilabel:`Lot/Serial Number` is +generated automatically. -In order to receive a product tracked by lots, you have to specify its -lot numbers. You have several ways of doing so: +.. tip:: + While Odoo automatically generates a new :guilabel:`Lot/Serial Number` to follow the most recent + number, it can be edited and changed to any desired number, by clicking the line under the + :guilabel:`Lot/Serial Number` field, and changing the generated number. -1. Manually assign the different lot numbers +Once the new :guilabel:`Lot/Serial Number` is generated, click the blank field next to +:guilabel:`Product` to reveal a drop-down menu. From this menu, select the product to which this new +number will be assigned. -2. Copy/paste lot numbers from an Excel file +This form also provides the option to adjust the :guilabel:`Quantity`, assign a unique +:guilabel:`Internal Reference` number (for traceability purposes), and assign this specific lot or +serial number configuration to a specific website in the :guilabel:`Website` field (if working in a +multi-website environment). -First, you need to open the detailed operations of your picking. +A detailed description of this specific lot or serial number can also be added in the +:guilabel:`Description` tab below. -.. image:: lots/lots_04.png - :align: center +When all desired configurations are complete, click the :guilabel:`Save` button to save all changes. -Manually assign the different lot numbers -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. image:: lots/lots-new-lot-number.png + :align: center + :alt: New lot number creation form with assigned product. -When opening the detailed operations, you can click on *Add a line*. -Then, you will be able to fill the lot number in. Once done, you can -click on *Add a line* again to register a new lot number. +After a new lot number has been created, saved, and assigned to the desired product, navigate back +to the product form in the :menuselection:`Inventory` app, by going to :menuselection:`Products --> +Products`, and selecting the product to which this newly-created lot number was just assigned. -.. image:: lots/lots_05.png - :align: center +On that product's detail form, click the :guilabel:`Lot/Serial Numbers` smart button to view the new +lot number. When additional quantity of this product is received or manufactured, this new lot +number can be selected and assigned to it. -Copy/paste lot number from an Excel file -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Manage lots for shipping and receiving +====================================== -Once the spreadsheet containing the lot numbers you received from your -supplier and copy the list. Then, you can paste them in the *Lot/Serial -Number Name* column for Odoo to automatically create the necessary -lines. After that, you will have to manually enter the number of -products that are contained in each one of the lots. +Lot numbers can be assigned for both **incoming** and **outgoing** goods. For incoming goods, lot +numbers are assigned directly on the purchase order form. For outgoing goods, lot numbers are +assigned directly on the sales order form. -.. image:: lots/lots_06.png - :align: center +Manage lots on receipts +----------------------- -.. image:: lots/lots_05.png - :align: center +Assigning lot numbers to **incoming** goods can be done directly from the purchase order (PO). -.. image:: lots/lots_07.png - :align: center +To create a :abbr:`PO (purchase order)`, go to :menuselection:`Purchase app --> Create`. Doing so +reveals a new, blank request for quotation (RFQ) form. -Operation Types ---------------- +On this :abbr:`RFQ (request for quotation)`, fill out the necessary information by adding a +:guilabel:`Vendor`, and adding the desired products to the :guilabel:`Product` lines, by clicking +:guilabel:`Add a product` (under the :guilabel:`Products` tab). -Of course, you also have the possibility to define how you will manage -lots for each operation type. To do so, open the *Inventory* app and -go to :menuselection:`Configuration --> Operation Types`. +Choose the desired quantity of the product to order by changing the number in the +:guilabel:`Quantity` column. -For each type (receipts, internal transfers, deliveries, …), you can -decide if you allow to create new lot numbers or only use existing ones. -By default, the creation of new lots is only allowed at product -reception, and using existing lot numbers isn’t allowed in this -operation. If you have inter-warehouse transfers and track products by -lots, it can be useful to allow using existing lot numbers in receipts -too. +Once the :abbr:`RFQ (request for quotation)` has been filled out, click :guilabel:`Confirm Order`. +When the :abbr:`RFQ (request for quotation)` is confirmed, it becomes a :guilabel:`Purchase Order`, +and a :guilabel:`Receipt` smart button appears. Click the :guilabel:`Receipt` smart button to be +taken to the warehouse receipt form. -.. image:: lots/lots_08.png - :align: center +.. note:: + Clicking :guilabel:`Validate` before assigning a lot number to the ordered product quantities + will result in a :guilabel:`User Error` pop-up. The pop-up requires entry of a lot or serial + number for the ordered products. The :abbr:`RFQ (request for quotation)` **cannot** be validated + without a lot number being assigned. + +.. image:: lots/lots-user-error-popup.png + :align: center + :alt: Add lot/serial number user error popup. + +From here, click the :guilabel:`Additional Options` menu, represented by a :guilabel:`hamburger +(four horizontal lines)` icon, located to the right of the :guilabel:`Unit of Measure` column in the +:guilabel:`Operations` tab). Clicking that icon reveals a :guilabel:`Detailed Operations` pop-up. + +In this pop-up, configure a number of different fields, including the assignation of a lot number, +under the :guilabel:`Lot/Serial Number Name` column, located at the bottom of the pop-up. + +There are two ways to assign lot numbers: **manually** and **copy/paste**. + +- **Manually assign lot numbers**: Click :guilabel:`Add a line` and choose the location the products + will be stored in under the :guilabel:`To` column. Then, type a new :guilabel:`Lot Number Name` + and set the :guilabel:`Done` quantity. + + .. image:: lots/lots-assign-lot-number-popup.png + :align: center + :alt: Assign lot number detailed operations popup. + + .. note:: + If quantities should be processed in multiple locations and lots, click :guilabel:`Add a line` + and type a new :guilabel:`Lot Number Name` for additional quantities. Repeat until the + :guilabel:`Quantity Done` matches the :guilabel:`Demand`. + +- **Copy/paste lot numbers from a spreadsheet**: Populate a spreadsheet with all of the lot numbers + received from the supplier (or manually chosen to assign upon receipt). Then, copy and paste them + in the :guilabel:`Lot/Serial Number Name` column. Odoo will automatically create the necessary + number of lines based on the amount of numbers pasted in the column. From here, the :guilabel:`To` + locations and :guilabel:`Done` quantities can be manually entered in each of the lot number lines. + + .. image:: lots/lots-excel-spreadsheet.png + :align: center + :alt: List of lot numbers copied on excel spreadsheet. + +Once all product quantities have been assigned a lot number, click :guilabel:`Confirm` to close the +pop-up. Then, click :guilabel:`Validate`. + +A :guilabel:`Traceability` smart button appears upon validating the receipt. Click the +:guilabel:`Traceability` smart button to see the updated :guilabel:`Traceability Report`, which +includes: a :guilabel:`Reference` document, the :guilabel:`Product` being traced, the +:guilabel:`Lot/Serial #` assigned, and more. + +Manage lots on delivery orders +------------------------------ + +Assigning lot numbers to **outgoing** goods can be done directly from the sales order (SO). + +To create an :abbr:`SO (sales order)`, go to the :menuselection:`Sales app --> Create`. Doing so +reveals a new, blank quotation form. + +On this blank quotation form, fill out the necessary information by adding a :guilabel:`Customer`, +and adding products to the :guilabel:`Product` lines (in the :guilabel:`Order Lines` tab) by +clicking :guilabel:`Add a product`. + +Then, choose the desired quantity to sell by changing the number in the :guilabel:`Quantity` column. + +Once the quotation has been filled out, click the :guilabel:`Confirm` button to confirm the +quotation. When the quotation is confirmed, it becomes an :abbr:`SO (sales order)`, and a +:guilabel:`Delivery` smart button appears. + +Click the :guilabel:`Delivery` smart button to view the warehouse receipt form for that specific +:abbr:`SO (sales order)`. + +From here, click the :guilabel:`Additional Options` menu, represented by a `hamburger` icon (four +horizontal lines, located to the right of the :guilabel:`Unit of Measure` column in the +:guilabel:`Operations` tab). Clicking that icon reveals a :guilabel:`Detailed Operations` pop-up. + +In the pop-up, a :guilabel:`Lot/Serial Number` will be chosen by default, with the full +:guilabel:`Reserved` quantity taken from that specific lot (if there is enough stock in that +particular lot). + +If there is insufficient stock in that lot, or if partial quantities of the :guilabel:`Demand` +should be taken from multiple lots, change the quantity in the :guilabel:`Done` column to only +include that specific part of the total quantity. + +.. note:: + The lot automatically chosen for delivery orders varies, depending on the selected removal + strategy (:abbr:`FIFO (First In, First Out)`, :abbr:`LIFO (Last In, First Out)`, or :abbr:`FEFO + (First Expiry, First Out)`). It will also depend on the quantity ordered, and if there is enough + quantity in one lot to fulfill the order. + +.. seealso:: + :doc:`/applications/inventory_and_mrp/inventory/routes/strategies/removal` + +Then, click :guilabel:`Add a line`, select an additional (different) :guilabel:`Lot/Serial Number`, +apply the rest of the :guilabel:`Done` quantities, and click :guilabel:`Confirm` to close the +pop-up. Lastly, click the :guilabel:`Validate` button to deliver the products. + +.. image:: lots/lots-detailed-operations-popup.png + :align: center + :alt: Detailed operations popup for source lot number on sales order. + +Upon validating the delivery order, a :guilabel:`Traceability` smart button appears. Click the +:guilabel:`Traceability` smart button to see the updated :guilabel:`Traceability Report`, which +includes a :guilabel:`Reference` document, the :guilabel:`Product` being traced, the +:guilabel:`Date`, and the :guilabel:`Lot/Serial #` assigned. + +The :guilabel:`Traceability Report` can also include a :guilabel:`Reference` receipt from the +previous purchase order, if the product quantities shared the same lot number. + +Manage lots for different operations types +========================================== + +In Odoo, the creation of new lots is only allowed upon **receiving** products from a purchase order, +by default. **Existing** lot numbers cannot be used. + +For sales orders, the opposite is true: new lot numbers cannot be created on the delivery order, +only existing lot numbers can be used. + +To change the ability to use new (or existing) lot numbers on any operation type, go to the +:menuselection:`Inventory app --> Configuration --> Operations Types`, and select the desired +:guilabel:`Operation Type`. + +For :guilabel:`Receipts`, found on the :menuselection:`Operations Types` page, the :guilabel:`Use +Existing Lots/Serial Numbers` option can be enabled, by clicking :guilabel:`Edit`, and then clicking +the checkbox beside the :guilabel:`Use Existing Lots/Serial Numbers` option (in the +:guilabel:`Traceability` section). Lastly, click the :guilabel:`Save` button to save the changes. + +For :guilabel:`Delivery Orders`, the :guilabel:`Create New Lots/Serial Numbers` option can be +enabled, by clicking :guilabel:`Edit`, and clicking the checkbox beside the :guilabel:`Create New +Lots/Serial Numbers` option. Be sure to click the :guilabel:`Save` button to save all changes. + +.. image:: lots/lots-operations-type-form.png + :align: center + :alt: Enabled traceability setting on operations type form. + +.. tip:: + For inter-warehouse transfers involving products tracked by lots, it can be useful to enable the + :guilabel:`Use Existing Lots/Serial Numbers` option for warehouse receipts. Lots traceability ================= -The lot number given to the products allows you to keep track of where -they were received, put in stock, to whom they were sold and where they -were shipped to. - -To track an item, open the *Inventory* module and, in :menuselection:`Master Data --> -Lots/Serial Numbers`, click on the lot number corresponding to your -search. +Manufacturers and companies can refer to traceability reports to see the entire lifecycle of a +product: where (and when) it came from, where it was stored, and who (and when) it went to. -.. image:: lots/lots_09.png - :align: center +To see the full traceability of a product, or group by lots, go to the :menuselection:`Inventory app +--> Products --> Lots/Serial Numbers`. Doing so reveals the :menuselection:`Lots/Serial Numbers` +dashboard. -When you open the *Traceability* information, you see in which -documents the lot number has been used. +From here, products with lot numbers assigned to them will be listed by default, and can be expanded +to show the lot numbers those products have assigned to them. -.. image:: lots/lots_10.png - :align: center +To group by lots (or serial numbers), begin by removing any filters in the search bar. Then, click +the :guilabel:`Group By` drop-down, select :guilabel:`Add Custom Group`, and select +:guilabel:`Lot/Serial Number` from the drop-down menu. Then, click :guilabel:`Apply`. -Now, if you want to locate the lot number, you can do so by clicking on -the *Location* stat button. +Doing so displays all existing lots and serial numbers, and can be expanded to show all quantities +of products with that assigned number. -.. image:: lots/lots_11.png - :align: center +.. image:: lots/lots-traceability-report.png + :align: center + :alt: Lots and serial numbers traceability report. -.. image:: lots/lots_12.png - :align: center +.. seealso:: + :doc:`/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/differences` diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-assign-lot-number-popup.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-assign-lot-number-popup.png new file mode 100644 index 0000000000..4750f3385e Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-assign-lot-number-popup.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-detailed-operations-popup.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-detailed-operations-popup.png new file mode 100644 index 0000000000..bef3812bbe Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-detailed-operations-popup.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-enabled-lots-setting.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-enabled-lots-setting.png new file mode 100644 index 0000000000..750345ca38 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-enabled-lots-setting.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-excel-spreadsheet.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-excel-spreadsheet.png new file mode 100644 index 0000000000..1a61585d5d Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-excel-spreadsheet.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-new-lot-number.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-new-lot-number.png new file mode 100644 index 0000000000..6acafd40f1 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-new-lot-number.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-operations-type-form.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-operations-type-form.png new file mode 100644 index 0000000000..341f5476fb Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-operations-type-form.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-traceability-report.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-traceability-report.png new file mode 100644 index 0000000000..a723f08d40 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-traceability-report.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-tracking-product-form.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-tracking-product-form.png new file mode 100644 index 0000000000..6b26298ee2 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-tracking-product-form.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-user-error-popup.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-user-error-popup.png new file mode 100644 index 0000000000..50ea3410c7 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots-user-error-popup.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_01.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_01.png deleted file mode 100644 index 8d052f3e03..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_01.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_02.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_02.png deleted file mode 100644 index 1431e42c60..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_02.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_03.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_03.png deleted file mode 100644 index 2a7367c2b3..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_03.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_04.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_04.png deleted file mode 100644 index 15646d626f..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_04.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_05.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_05.png deleted file mode 100644 index ac98717add..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_05.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_06.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_06.png deleted file mode 100644 index 60fd5ec083..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_06.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_07.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_07.png deleted file mode 100644 index 5b24a3b3c2..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_07.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_08.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_08.png deleted file mode 100644 index 50b39dfed3..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_08.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_09.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_09.png deleted file mode 100644 index 1a23ff1708..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_09.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_10.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_10.png deleted file mode 100644 index 593f2c66b9..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_10.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_11.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_11.png deleted file mode 100644 index 4525d62f3b..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_11.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_12.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_12.png deleted file mode 100644 index 2e2ed6b9ff..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots/lots_12.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers.rst b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers.rst index 9003817d8f..685103bd4a 100644 --- a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers.rst +++ b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers.rst @@ -1,147 +1,317 @@ -======================== -Work with serial numbers -======================== +==================================== +Use serial numbers to track products +==================================== -To track products with serial numbers, you can use the serial number -tracking. With them, you can track the current location of the product -and, when the products are moved from one location to another, the -system will automatically identify the current location of the product, -based on its last movement. +*Serial numbers* are one of the two ways to identify and track products in Odoo. A serial number is +a unique identifier assigned incrementally (or sequentially) to an item or product, used to +distinguish it from other items and products. -If you want to do it or run very advanced traceability, the Odoo -double-entry management is the feature you need. +Serial numbers can consist of many different types of characters: they can be strictly numerical, +they can contain letters and other typographical symbols, or they can be a mix of all of the above. -Configurations -============== +The goal of assigning serial numbers to individual products is to make sure that every item's +history is identifiable when it travels through the supply chain. This can be especially useful for +manufacturers that provide after-sales services to products that they sell and deliver. -Application configuration -------------------------- +.. seealso:: + :doc:`/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots` -First, you need to activate the serial numbers tracking. To do so, go to -:menuselection:`Configuration --> Settings` in the *Inventory* application. Then, -enable the feature and hit save. +Enable lots & serial numbers +============================ -.. image:: serial_numbers/serial_numbers_01.png - :align: center +To track products using serial numbers, the :guilabel:`Lots & Serial Numbers` feature must be +enabled. To enable this, go to :menuselection:`Inventory app --> Configuration --> Settings`, scroll +down to the :guilabel:`Traceability` section, and click the box next to :guilabel:`Lots & Serial +Numbers`. Remember to click the :guilabel:`Save` button to save changes. -Product configuration ---------------------- +.. image:: serial_numbers/serial-numbers-enabled-setting.png + :align: center + :alt: Enabled lots and serial numbers setting. -Now, you have to configure the products you want to track by serial -numbers. To do so, go to :menuselection:`Master Data --> Products` and open the product -of your choice. Edit it and select *Tracking By Unique Serial Number* -in the *Inventory tab*. Then, click on save. +Configure serial number tracking on products +============================================ -.. image:: serial_numbers/serial_numbers_02.png - :align: center +Once the :guilabel:`Lots & Serial Numbers` setting has been activated, individual products can now +be tracked using serial numbers. To configure this, go to :menuselection:`Inventory app --> Products +--> Products`, and choose a desired product to track. -.. image:: serial_numbers/serial_numbers_03.png - :align: center +Once on the product form, click :guilabel:`Edit`, and click the :guilabel:`Inventory` tab. -Manage Serial Numbers -===================== +Once on the product form, click :guilabel:`Edit`, navigate to the :guilabel:`Inventory` tab, and +scroll to the :guilabel:`Traceability` section. Then, select the :guilabel:`By Unique Serial Number` +option, and click :guilabel:`Save` to save the changes. Existing or new serial numbers can now be +selected and assigned to newly-received or manufactured batches of this product. -Receipts --------- +.. image:: serial_numbers/serial-numbers-product-tracking.png + :align: center + :alt: Enabled serial number tracking on product form. -To receive a product that is tracked by serial number, you have to -specify its serial number. Of course, you have several ways of doing so: +.. warning:: + If a product doesn't have a serial number assigned to it, a user error pop-up window will appear. + The error message states that the product(s) in stock have no lot/serial number. However, a + lot/serial number can be assigned to the product by making an inventory adjustment. -- Manual assignation +Create new serial numbers for products already in stock +------------------------------------------------------- -- Multi-assignation +New serial numbers can be created for products already in stock with no assigned serial number. To +do this, go to :menuselection:`Inventory --> Products --> Lots/Serial Numbers`, and click +:guilabel:`Create`. Doing so reveals a blank lots/serial numbers form. On this form, a new +:guilabel:`Lot/Serial Number` is generated automatically. -- Copy/pasting from an Excel file +.. tip:: + While Odoo automatically generates a new lot/serial number to follow the most recent number, it + can be edited and changed to any desired number, by clicking the line under the + :guilabel:`Lot/Serial Number` field, and changing the generated number. + +Once the :guilabel:`Lot/Serial Number` is generated, click the blank field next to +:guilabel:`Product` to reveal a drop-down menu. From this menu, select the product to which this new +number will be assigned. + +This form also provides the option to adjust the :guilabel:`Quantity`, to assign a unique +:guilabel:`Internal Reference` number (for traceability purposes), and to assign this specific +lot/serial number configuration to a specific website in the :guilabel:`Website` field (if working +in a multi-website environment). + +A detailed description of this specific lot/serial number can also be added in the +:guilabel:`Description` tab below. + +When all desired configurations are complete, click the :guilabel:`Save` button to save all changes. + +.. image:: serial_numbers/serial-numbers-new-serial-number.png + :align: center + :alt: New serial number created for existing product stock. + +After a new serial number has been created, assigned to the desired product, and saved, navigate +back to the product form, by going to :menuselection:`Products --> Products`, and selecting the +product that this newly-created serial number was just assigned to. + +On that product's detail form, click the :guilabel:`Lot/Serial Numbers` smart button to view the new +serial number. + +Manage serial numbers for shipping and receiving +================================================ + +Serial numbers can be assigned for both **incoming** and **outgoing** goods. For incoming goods, +serial numbers are assigned directly on the purchase order form. For outgoing goods, serial numbers +are assigned directly on the sales order form. -Whatever could be your favorite way to assign serial numbers, you -firstly need to open the detailed operations of your picking. +Manage serial numbers on receipts +--------------------------------- -.. image:: serial_numbers/serial_numbers_04.png - :align: center +Assigning serial numbers to **incoming** goods can be done directly from the purchase order (PO). -Manual assignation of the different serial numbers -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +To create a :abbr:`PO (purchase order)`, go to the :menuselection:`Purchase app --> Create`. Doing +so reveals a new, blank request for quotation (RFQ) form. -When opening the detailed operations, you can click on *Add a line*. -Then, you will be able to fill in the serial number field. Once done, -you can click again on *Add a line* to register a new serial number. +On this :abbr:`RFQ (request for quotation)` form, fill out the necessary information, by adding a +:guilabel:`Vendor`, and by adding the desired products to the :guilabel:`Product` lines, by clicking +:guilabel:`Add a product`, under the :guilabel:`Products` tab. -.. image:: serial_numbers/serial_numbers_05.png - :align: center +Choose the desired quantity of the product to order, by changing the number in the +:guilabel:`Quantity` column. -Multi-assignation -~~~~~~~~~~~~~~~~~ +When the necessary configurations are complete, click :guilabel:`Confirm Order`. This will convert +the :abbr:`RFQ (request for quotation)` to a purchase order. -By using the multi-assignation of serial numbers, Odoo will -automatically create the necessary lines. To do so, you have to enter -the first serial number of your set and the number of products you have -to assign a serial number to. +Then, click the :guilabel:`Receipt` smart button to be taken to the warehouse receipt form page for +that specific :abbr:`PO (purchase order)`. -Once done, click on *Assign Serial Numbers* and Odoo will do the rest. +.. warning:: + Clicking :guilabel:`Validate` before assigning a serial number to the ordered product quantities + will cause a :guilabel:`User Error` pop-up to appear. The pop-up requires entry of a lot or + serial number for the ordered products. The :abbr:`RFQ (request for quotation)` **cannot** be + validated without a serial number being assigned. -.. image:: serial_numbers/serial_numbers_06.png - :align: center +.. image:: serial_numbers/serial-numbers-user-error-popup.png + :align: center + :alt: User error popup prompting serial number entry. -.. image:: serial_numbers/serial_numbers_07.png - :align: center +From here, click the :guilabel:`Additional Options` menu, represented by a `hamburger` icon (four +horizontal lines, located to the right of the :guilabel:`Unit of Measure` column in the +:guilabel:`Operations` tab). Clicking that icon reveals a :guilabel:`Detailed Operations` pop-up. -Copy/pasting from an Excel file -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +In this pop-up, configure a number of different fields, including the assignation of a serial number +(or serial numbers) under the :guilabel:`Lot/Serial Number Name` column, located at the bottom of +the pop-up. -To use copy/pasting, open the spreadsheet containing the serial numbers -you received and copy the list. Then, past them in the *Lot/Serial -Number Name* column of the wizard. Doing so, Odoo will automatically -create the lines you need. +There are three ways to do this: manually assigning serial numbers, automatically assigning serial +numbers, and copy/pasting serial numbers from a spreadsheet. -.. image:: serial_numbers/serial_numbers_08.png - :align: center +Assign serial numbers manually +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. image:: serial_numbers/serial_numbers_09.png - :align: center +To assign serial numbers manually, click :guilabel:`Add a line` from the :guilabel:`Detailed +Operations` pop-up, and first choose the location where the product will be stored under the +:guilabel:`To` column. -.. image:: serial_numbers/serial_numbers_10.png - :align: center +Then, type a new :guilabel:`Serial Number Name`, and set the :guilabel:`Done` quantity in the +appropriate columns. -Operation types -=============== +Repeat this process for the quantity of products shown in the :guilabel:`Demand` field, and until +the :guilabel:`Quantity Done` field displays the correct (matching) number of products processed. -You also have the possibility to define how you will manage lots for -each operation type. To define it, go to :menuselection:`Configuration --> Operation Types` in the -*Inventory* app. +Assign serial numbers automatically +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -For each type, you can decide if you allow the creation of new lot -numbers or want to use existing ones. By default, the creation of new -lots is only allowed at product reception. +If a large quantity of products need individual serial numbers assigned to them, Odoo can +automatically generate and assign serial numbers to each of the individual products. -.. image:: serial_numbers/serial_numbers_11.png - :align: center +To accomplish this, start with the :guilabel:`First SN` field in the :guilabel:`Detailed Operations` +pop-up window, and type the first serial number in the desired order to be assigned. + +Then, in the :guilabel:`Number of SN` field, type the total number of items that need +newly-generated unique serial numbers assigned to them. + +Finally, click :guilabel:`Assign Serial Numbers`, and a list will populate with new serial numbers +matching the ordered quantity of products. + +.. image:: serial_numbers/serial-numbers-auto-assign-sn.png + :align: center + :alt: Automatic serial number assignment in detailed operations popup. + +Copy/paste serial numbers from a spreadsheet +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To copy and paste serial numbers from an existing spreadsheet, first populate a spreadsheet with all +of the serial numbers received from the supplier (or manually chosen upon receipt). Then, copy and +paste them in the :guilabel:`Lot/Serial Number Name` column. Odoo will automatically create the +necessary number of lines based on the amount of numbers pasted in the column. + +From here, the :guilabel:`To` locations and :guilabel:`Done` quantities can be manually entered in +each of the serial number lines. + +.. image:: serial_numbers/serial-numbers-excel-spreadsheet.png + :align: center + :alt: List of serial numbers copied in Excel spreadsheet. .. tip:: - If you have inter-warehouse transfers and track products by lots, it can - be useful to allow using existing lot numbers in receipts too. + For purchase orders that include large quantities of products to receive, the best method of + serial number assignment is to automatically assign serial numbers using the :guilabel:`Assign + Serial Numbers` button located on the :abbr:`PO (purchase order)`. This prevents any serial + numbers from being reused or duplicated, and improves traceability reporting. + +Once all product quantities have been assigned a serial number, click the :guilabel:`Confirm` button +to close the pop-up. Then, click :guilabel:`Validate`. + +A :guilabel:`Traceability` smart button appears upon validating the receipt. Click the +:guilabel:`Traceability` smart button to see the updated :guilabel:`Traceability Report`, which +includes: a :guilabel:`Reference` document, the :guilabel:`Product` being traced, the +:guilabel:`Lot/Serial #`, and more. + +Once all product quantities have been assigned a serial number, click :guilabel:`Confirm` to close +the popup, and click :guilabel:`Validate`. A :guilabel:`Traceability` smart button will appear upon +validating the receipt. Click the :guilabel:`Traceability` smart button to see the updated +:guilabel:`Traceability Report`, which includes: a :guilabel:`Reference` document, the +:guilabel:`Product` being traced, the :guilabel:`Lot/Serial #`, and more. -Serial Number traceability +Manage serial numbers on delivery orders +---------------------------------------- + +Assigning serial numbers to **outgoing** goods can be done directly from the sales order (SO). + +To create an :abbr:`SO (sales order)`, navigate to the :menuselection:`Sales` app, and click the +:guilabel:`Create` button. Doing so reveals a new, blank quotation form. On this blank quotation +form, fill out the necessary information, by adding a :guilabel:`Customer`, and adding products to +the :guilabel:`Product` lines (in the :guilabel:`Order Lines` tab), by clicking :guilabel:`Add a +product`. + +Then, choose the desired quantity to sell by changing the number in the :guilabel:`Quantity` column. + +Once the quotation has been filled out, click the :guilabel:`Confirm` button to confirm the +quotation. When the quotation is confirmed, the quotation becomes an :abbr:`SO (sales order)`, and a +:guilabel:`Delivery` smart button appears. + +Click the :guilabel:`Delivery` smart button to view the warehouse receipt form for that specific +:abbr:`SO (sales order)`. + +From here, click the :guilabel:`Additional Options` menu, represented by a `hamburger` icon (four +horizontal lines, located to the right of the :guilabel:`Unit of Measure` column in the +:guilabel:`Operations` tab). Clicking that icon reveals a :guilabel:`Detailed Operations` pop-up. + +In the pop-up, a :guilabel:`Lot/Serial Number` will be chosen by default, with each product of the +total :guilabel:`Reserved` quantity listed with their unique serial numbers (most likely listed in +sequential order). + +To manually change a product's serial number, click the drop-down menu under :guilabel:`Lot/Serial +Number`, and choose (or type) the desired serial number. Then, mark the :guilabel:`Done` quantities, +and click :guilabel:`Confirm` to close the pop-up. + +Finally, click the :guilabel:`Validate` button to deliver the products. + +.. image:: serial_numbers/serial-numbers-detailed-operations-popup.png + :align: center + :alt: Serial numbers listed in detailed operations popup. + +Upon validating the delivery order, a :guilabel:`Traceability` smart button appears. Click the +:guilabel:`Traceability` smart button to see the updated :guilabel:`Traceability Report`, which +includes: a :guilabel:`Reference` document, the :guilabel:`Product` being traced, the +:guilabel:`Date`, and the :guilabel:`Lot/Serial #` assigned. + +The :guilabel:`Traceability Report` can also include a :guilabel:`Reference` receipt from the +previous purchase order (PO), if any of the product quantities shared a serial number assigned +during receipt of that specific :abbr:`PO (purchase order)`. + +Manage serial numbers for different operations types +==================================================== + +By default in Odoo, the creation of new serial numbers is only allowed upon **receiving** products +from a purchase order. **Existing** serial numbers cannot be used. For sales orders, the opposite is +true: new serial numbers cannot be created on the delivery order, only existing serial numbers can +be used. + +To change the ability to use new (or existing) serial numbers on any operation type, go to +:menuselection:`Inventory app --> Configuration --> Operations Types`, and select the desired +:guilabel:`Operation Type`. + +For the :guilabel:`Receipts` operation type, found on the :guilabel:`Operations Types` page, the +:guilabel:`Use Existing Lots/Serial Numbers` option can be enabled, by selecting +:guilabel:`Receipts` from the :guilabel:`Operations Types` page, clicking :guilabel:`Edit`, and then +clicking the checkbox beside the :guilabel:`Use Existing Lots/Serial Numbers` option (in the +:guilabel:`Traceability` section). Lastly, click the :guilabel:`Save` button to save the changes. + +For the :guilabel:`Delivery Orders` operation type, located on the :guilabel:`Operations Types` +page, the :guilabel:`Create New Lots/Serial Numbers` option can be enabled, by selecting +:guilabel:`Delivery Orders` from the :guilabel:`Operations Types` page, clicking :guilabel:`Edit`, +and clicking the checkbox beside the :guilabel:`Create New Lots/Serial Numbers` option (in the +:guilabel:`Traceability` section). Be sure to click :guilabel:`Save` to save changes. + +.. image:: serial_numbers/serial-numbers-operations-types.png + :align: center + :alt: Enabled traceability setting in operations type form. + +Serial number traceability ========================== -Using serial numbers allows you to keep track of where the products were -received, put in stock, to whom they were sold, and where they were -shipped to. +Manufacturers and companies can refer to the traceability reports to see the entire lifecycle of a +product: where it came from (and when), where it was stored, and who it went to. -Tracking an item is easy: open the *Inventory* app, and go to :menuselection:`Master Data --> -Lots/Serial Numbers` and click on the serial number corresponding to your search. Then, open the -*Traceability* information. There, you will see in which documents the serial number has been used. +To see the full traceability of a product, or group by serial numbers, go to +:menuselection:`Inventory app --> Products --> Lots/Serial Numbers`. Doing so reveals the +:guilabel:`Lots/Serial Numbers` dashboard. -.. image:: serial_numbers/serial_numbers_12.png - :align: center +From here, products with serial numbers assigned to them will be listed by default, and can be +expanded to show what serial numbers have been specifically assigned to them. -.. image:: serial_numbers/serial_numbers_13.png - :align: center +To group by serial numbers (or lots), first remove any default filters from the search bar in the +upper-right corner. Then, click :guilabel:`Group By`, and select :guilabel:`Add Custom Group`, which +reveals a mini drop-down menu. From this mini drop-down menu, select :guilabel:`Lot/Serial Number`, +and click :guilabel:`Apply`. -And, if you want to locate a serial number, you can do so by clicking on -the *Location* button available on the serial number form. +Doing so reveals all existing serial numbers and lots, and can be expanded to show all quantities of +products with that assigned number. For unique serial numbers that are not reused, there should be +just one product per serial number. -.. image:: serial_numbers/serial_numbers_14.png - :align: center +.. image:: serial_numbers/serial-numbers-reporting-page.png + :align: center + :alt: Serial numbers reporting page with drop-down lists. -.. image:: serial_numbers/serial_numbers_15.png - :align: center +.. tip:: + For additional information regarding an individual serial number (or lot number), click the line + item for the serial number to reveal that specific serial number's :guilabel:`Serial Number` + form. From this form, click the :guilabel:`Location` and :guilabel:`Traceability` smart buttons + to see all stock on-hand using that serial number, and any operations made using that serial + number. + +.. seealso:: + :doc:`/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/differences` diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-auto-assign-sn.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-auto-assign-sn.png new file mode 100644 index 0000000000..9d433013ab Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-auto-assign-sn.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-detailed-operations-popup.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-detailed-operations-popup.png new file mode 100644 index 0000000000..44fd97b625 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-detailed-operations-popup.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-enabled-setting.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-enabled-setting.png new file mode 100644 index 0000000000..6eecf9464b Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-enabled-setting.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-excel-spreadsheet.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-excel-spreadsheet.png new file mode 100644 index 0000000000..aa97e41b2e Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-excel-spreadsheet.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-new-serial-number.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-new-serial-number.png new file mode 100644 index 0000000000..5d423fbcad Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-new-serial-number.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-operations-types.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-operations-types.png new file mode 100644 index 0000000000..937d3bb127 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-operations-types.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-product-tracking.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-product-tracking.png new file mode 100644 index 0000000000..70df11aa63 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-product-tracking.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-reporting-page.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-reporting-page.png new file mode 100644 index 0000000000..5cdfa7429f Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-reporting-page.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-user-error-popup.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-user-error-popup.png new file mode 100644 index 0000000000..d55e9374df Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial-numbers-user-error-popup.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_01.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_01.png deleted file mode 100644 index 8d052f3e03..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_01.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_02.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_02.png deleted file mode 100644 index 7b11caf660..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_02.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_03.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_03.png deleted file mode 100644 index 604698b618..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_03.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_04.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_04.png deleted file mode 100644 index edb8fc6092..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_04.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_05.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_05.png deleted file mode 100644 index 83eaae7ff0..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_05.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_06.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_06.png deleted file mode 100644 index 7d1fd08f1b..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_06.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_07.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_07.png deleted file mode 100644 index a23991a96b..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_07.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_08.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_08.png deleted file mode 100644 index 60fd5ec083..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_08.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_09.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_09.png deleted file mode 100644 index f6cdd33e14..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_09.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_10.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_10.png deleted file mode 100644 index 0ed8101e00..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_10.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_11.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_11.png deleted file mode 100644 index 50b39dfed3..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_11.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_12.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_12.png deleted file mode 100644 index e0a020badf..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_12.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_13.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_13.png deleted file mode 100644 index 38f7278e84..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_13.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_14.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_14.png deleted file mode 100644 index 420d21f1a9..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_14.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_15.png b/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_15.png deleted file mode 100644 index 52a0551e9d..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers/serial_numbers_15.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products.rst b/content/applications/inventory_and_mrp/inventory/management/products.rst index 393a034dd7..c992820ebc 100644 --- a/content/applications/inventory_and_mrp/inventory/management/products.rst +++ b/content/applications/inventory_and_mrp/inventory/management/products.rst @@ -8,6 +8,8 @@ Products :titlesonly: :glob: + products/mto products/uom products/usage products/strategies + products/reordering_rules diff --git a/content/applications/inventory_and_mrp/inventory/management/products/mto.rst b/content/applications/inventory_and_mrp/inventory/management/products/mto.rst new file mode 100644 index 0000000000..9fa2f850c2 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/management/products/mto.rst @@ -0,0 +1,122 @@ +======================== +Replenish on order (MTO) +======================== + +.. |MTO| replace:: :abbr:`MTO (make to order)` +.. |RFQ| replace:: :abbr:`RFQ (request for quotation)` +.. |BOM| replace:: :abbr:`BOM (bill of materials)` + +*Replenish on order*, also known as *MTO* (make to order), is a replenishment strategy that creates +a draft order for a product every time a sales order is created for it. For products that are +purchased from a vendor, a request for quotation (RFQ) is created, while a sales order for a product +manufactured in-house triggers the creation of a manufacturing order. The creation of a |RFQ| or +manufacturing order occurs every time a sales order is created, regardless of the current stock +level of the product being ordered. + +Unarchive the Replenish on Order (MTO) route +============================================ + +By default, Odoo sets the |MTO| route as *archived*. This is because |MTO| is a somewhat niche +workflow that is only used by certain companies. However, it is easy to unarchive the route in just +a few simple steps. + +To do so, begin by navigating to :menuselection:`Inventory --> Configuration --> Routes`. On the +:guilabel:`Routes` page, click the :guilabel:`Filters` button and select the :guilabel:`Archived` +option. This shows all routes that are currently archived. + +.. image:: mto/archived-filter.png + :align: center + :alt: The archived filter on the Routes page. + +Enable the checkbox next to :guilabel:`Replenish on Order (MTO)`, then click the :guilabel:`Action` +button to reveal a drop-down menu. From the drop-down menu, select :guilabel:`Unarchive`. + +.. image:: mto/unarchive-button.png + :align: center + :alt: The unarchive action on the Routes page. + +Finally, remove the :guilabel:`Archived` filter from the :guilabel:`Search...` bar. The +:guilabel:`Routes` page will now show all available routes, including :guilabel:`Replenish on Order +(MTO)`, which is now selectable on the inventory tab of each product page. + +.. image:: mto/unarchived-mto.png + :align: center + :alt: The MTO route appears on the Routes page after unarchiving it. + +Configure a product to use the MTO route +======================================== + +With the |MTO| route unarchived, products can now be properly configured to use replenish on order. +To do so, begin by going to :menuselection:`Inventory --> Products --> Products`, then select an +existing product, or click :guilabel:`Create` to configure a new one. + +On the product page, select the :guilabel:`Inventory` tab and enable the :guilabel:`Replenish on +Order (MTO)` route in the :guilabel:`Routes` section, along with one other route. + +.. important:: + The :guilabel:`Replenish on Order (MTO)` route **does not** work unless another route is selected + as well. This is because Odoo needs to know how to replenish the product when an order is placed + for it (buy it, manufacture it, etc.). + +.. image:: mto/select-routes.png + :align: center + :alt: Select the MTO route and a second route on the Inventory tab. + +If the product is purchased from a vendor to fulfill sales orders, enable the :guilabel:`Can be +Purchased` checkbox under the product name. Doing so makes the :guilabel:`Purchase` tab appear +alongside the other settings tabs below. + +Select the :guilabel:`Purchase` tab and specify a :guilabel:`Vendor` and the :guilabel:`Price` they +sell the product for. + +.. image:: mto/specify-vendor.png + :align: center + :alt: Enable "Can be Purchased" and specify a vendor. + +If the product is manufactured, make sure that it has a bill of materials (BOM) configured for it. +To do so, click the :guilabel:`Bill of Materials` smart button at the top of the screen, then click +:guilabel:`Create` on the :guilabel:`Bill of Materials` page to configure a new |BOM| for the +product. + +On the blank |BOM| form, add the components used to manufacture the product on the +:guilabel:`Components` tab, along with the operations required for the manufacturing workflow on the +:guilabel:`Operations` tab. + +Finally, click :guilabel:`Save` to save the |BOM|. + +Fulfill a sales order using the MTO route +========================================= + +After configuring a product to use the |MTO| route, a replenishment order is created for it every +time a sales order including the product is confirmed. The type of order created depends on the +second route selected in addition to |MTO|. + +For example, if *Buy* was the second route selected, then a purchase order is created upon +confirmation of a sales order. + +.. important:: + When the |MTO| route is enabled for a product, a replenishment order is always created upon + confirmation of a sales order. This is the case even if there is enough stock of the product + on-hand to fulfill the sales order, without buying or manufacturing additional units of it. + +While the |MTO| route can be used in unison with a variety of other routes, the *Buy* route is used +as the example for this workflow. Begin by navigating to the :menuselection:`Sales` app, then click +:guilabel:`Create`, which opens a blank quotation form. + +On the blank quotation form, add a :guilabel:`Customer`, then click :guilabel:`Add a product` under +the :guilabel:`Order Lines` tab, and enter a product that has been configured to use the *MTO* and +*Buy* routes. Click :guilabel:`Confirm` and the quotation is turned into a sales order. + +A :guilabel:`Purchase` smart button now appears in the top-right corner of the sales order. Clicking +it opens the |RFQ| associated with the sales order. + +Click :guilabel:`Confirm Order` to confirm the |RFQ|, and turn it into a purchase order. A green +:guilabel:`Receive Products` button now appears at the top of the purchase order. Once the products +are received, click :guilabel:`Receive Products` to register them into inventory. + +Return to the sales order by clicking the :guilabel:`SO` breadcrumb, or by navigating to +:menuselection:`Sales --> Orders --> Orders`, and selecting the sales order. + +Finally, click the :guilabel:`Delivery` smart button in the top-right of the order to be taken to +the delivery order. Once the products have been shipped to the customer, click :guilabel:`Validate` +to confirm the delivery. diff --git a/content/applications/inventory_and_mrp/inventory/management/products/mto/archived-filter.png b/content/applications/inventory_and_mrp/inventory/management/products/mto/archived-filter.png new file mode 100644 index 0000000000..2c6ff06611 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/products/mto/archived-filter.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/mto/select-routes.png b/content/applications/inventory_and_mrp/inventory/management/products/mto/select-routes.png new file mode 100644 index 0000000000..b27ead366a Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/products/mto/select-routes.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/mto/specify-vendor.png b/content/applications/inventory_and_mrp/inventory/management/products/mto/specify-vendor.png new file mode 100644 index 0000000000..0e6b85d81a Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/products/mto/specify-vendor.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/mto/unarchive-button.png b/content/applications/inventory_and_mrp/inventory/management/products/mto/unarchive-button.png new file mode 100644 index 0000000000..fad6335b87 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/products/mto/unarchive-button.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/mto/unarchived-mto.png b/content/applications/inventory_and_mrp/inventory/management/products/mto/unarchived-mto.png new file mode 100644 index 0000000000..5e96507ad3 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/products/mto/unarchived-mto.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules.rst b/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules.rst new file mode 100644 index 0000000000..b50c63b8f8 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules.rst @@ -0,0 +1,126 @@ +================ +Reordering rules +================ + +Reordering rules are used to keep forecasted stock levels above a certain threshold without +exceeding a specified upper limit. This is accomplished by specifying a minimum quantity that stock +should not fall below and a maximum quantity that stock should not exceed. + +Reordering rules can be configured for each product based on the route used to replenish it. If a +product uses the *Buy* route, then a Request for Quotation (RFQ) is created when the reordering rule +is triggered. If a product uses the *Manufacture* route, then a Manufacturing Order (MO) is created +instead. This is the case regardless of the selected replenishment route. + +Configure products for reordering rules +======================================= + +In order to use reordering rules for a product, it must first be correctly configured. Begin by +navigating to :guilabel:`Inventory --> Products --> Products`, then select an existing product, or +create a new one by clicking :guilabel:`Create`. + +First, on the :guilabel:`General Information` tab, make sure that the :guilabel:`Product Type` is +set to :guilabel:`Storable Product`. This is necessary because Odoo only tracks stock quantities for +storable products, and this number is used to trigger reordering rules. + +.. image:: reordering_rules/product-type.png + :align: center + :alt: Set the Product Type as Storable. + +Next, click on the :guilabel:`Inventory` tab and select one or more routes from the +:guilabel:`Routes` section. Doing so tells Odoo which route to use to replenish the product. + +.. image:: reordering_rules/select-routes.png + :align: center + :alt: Select one or more routes on the Inventory tab. + +If the product is reordered using the :guilabel:`Buy` route, confirm that the :guilabel:`Can be +Purchased` checkbox is enabled under the product name. This makes the :guilabel:`Purchase` tab +appear. Click on the :guilabel:`Purchase` tab, and specify at least one vendor, and the price that +they sell the product for, so that Odoo knows which company the product should be purchased from. + +.. image:: reordering_rules/specify-vendor.png + :align: center + :alt: Specify a vendor and price on the Purchase tab. + +If the product is replenished using the :guilabel:`Manufacture` route, it needs to have at least one +Bill of Materials (BoM) associated with it. This is necessary because Odoo only creates +manufacturing orders for products with a :abbr:`BoM (Bill of Materials)`. + +If a :abbr:`BoM (Bill of Materials)` does not already exist for the product, select the +:guilabel:`Bill of Materials` smart button at the top of the product form, then click +:guilabel:`Create` to configure a new :abbr:`BoM (Bill of Materials)`. + +.. image:: reordering_rules/bom-smart-button.png + :align: center + :alt: The Bill of Materials smart button on a product form. + +Create new reordering rules +=========================== + +To create a new reordering rule, navigate to :menuselection:`Inventory --> Configuration --> +Reordering Rules`, then click :guilabel:`Create`, and fill out the new line as follows: + +- :guilabel:`Product`: The product that is replenished by the rule. +- :guilabel:`Location`: The location where the product is stored. +- :guilabel:`Min Quantity`: The minimum quantity that can be forecasted without the rule being + triggered. When forecasted stock falls below this number, a replenishment order for the product is + created. +- :guilabel:`Max Quantity`: The maximum quantity that stock is replenished up to. +- :guilabel:`Multiple Quantity`: Specify if the product should be replenished in batches of a + certain quantity (e.g., a product could be replenished in batches of 20). +- :guilabel:`UoM`: The unit of measure used for reordering the product. This value can simply be + `Units` or a specific unit of measurement for weight, length, etc. + +.. image:: reordering_rules/reordering-rule-form.png + :align: center + :alt: The form for creating a new reordering rule. + +.. tip:: + Reordering rules can also be created from each product form. To do so, navigate to + :menuselection:`Inventory --> Products --> Products`, then select a product. Click on + :menuselection:`Reordering Rules --> Create`, then fill out the new line as detailed above. + +Once a reordering rule has been created for a product, if its forecasted quantity is below the +rule's minimum quantity when the scheduler runs, a replenishment order for the product is +automatically generated. By default, the scheduler runs once each day. + +.. tip:: + To manually trigger a reordering rule before the scheduler runs, select :menuselection:`Inventory + --> Operations --> Run Scheduler`. Then, select the green :guilabel:`Run Scheduler` button on the + pop-up that appears. Be aware that this also triggers any other scheduled actions. + +If the :guilabel:`Buy` route is selected, then an :abbr:`RFQ (Request for Quotation)` is generated. +To view and manage :abbr:`RFQs (Requests for Quotation)`, navigate to :menuselection:`Purchase --> +Orders --> Requests for Quotation`. + +If the :guilabel:`Manufacture` route is selected, then an :abbr:`MO (Manufacturing Order)` is +generated. To view and manage :abbr:`MOs (Manufacturing Orders)`, navigate to +:menuselection:`Manufacturing --> Operations --> Manufacturing Orders`. + +Set a preferred route for reordering +==================================== + +Odoo allows for multiple routes to be selected under the :guilabel:`Inventory` tab on each product +form. For instance, it is possible to select both :guilabel:`Buy` and :guilabel:`Manufacture`, thus +enabling the functionality of both routes. + +Odoo also enables users to set a preferred route for a product's reordering rule. This is the route +that the rule defaults to if multiple are selected. To select a preferred route, begin by navigating +to :menuselection:`Inventory --> Configuration --> Reordering Rules`. + +By default, the :guilabel:`Preferred Route` column is hidden on the :guilabel:`Reordering Rules` +page. Enable it by selecting the :guilabel:`⋮ (three-dot)` option button on the right side of the +page and checking the :guilabel:`Preferred Route` checkbox. Doing so reveals the +:guilabel:`Preferred Route` column. + +Click inside of the column on the row of a reordering rule and a drop-down menu shows all available +routes for that rule. Select one to set it as the preferred route. + +.. image:: reordering_rules/select-preferred-route.png + :align: center + :alt: Select a preferred route from the drop-down. + +.. important:: + If multiple routes are enabled for a product but no preferred route is set for its reordering + rule, the product is reordered using the selected route that is listed first on the + :guilabel:`Inventory` tab of the product form. diff --git a/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/bom-smart-button.png b/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/bom-smart-button.png new file mode 100644 index 0000000000..07de78f4d8 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/bom-smart-button.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/product-type.png b/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/product-type.png new file mode 100644 index 0000000000..ee5a943422 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/product-type.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/reordering-rule-form.png b/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/reordering-rule-form.png new file mode 100644 index 0000000000..1d33e9aac7 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/reordering-rule-form.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/select-preferred-route.png b/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/select-preferred-route.png new file mode 100644 index 0000000000..466a383bd4 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/select-preferred-route.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/select-routes.png b/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/select-routes.png new file mode 100644 index 0000000000..0f593cb477 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/select-routes.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/specify-vendor.png b/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/specify-vendor.png new file mode 100644 index 0000000000..49f63c0800 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/products/reordering_rules/specify-vendor.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/strategies.rst b/content/applications/inventory_and_mrp/inventory/management/products/strategies.rst index a367e938a3..b6726c12e2 100644 --- a/content/applications/inventory_and_mrp/inventory/management/products/strategies.rst +++ b/content/applications/inventory_and_mrp/inventory/management/products/strategies.rst @@ -1,11 +1,16 @@ -=============================== -Select a replenishment strategy -=============================== +================================== +Selecting a replenishment strategy +================================== -In Odoo, there are two strategies for replenishing inventory: **Reordering Rules** and the **Make -to Order (MTO)** route. Although these strategies differ slightly, they both have similar -consequences: triggering the automatic creation of a purchase or manufacturing order. The choice of -which strategy to use depends on the business's manufacturing and delivery processes. +.. |MTO| replace:: :abbr:`MTO (Make to Oder)` +.. |PO| replace:: :abbr:`PO (Purchase Order)` +.. |MO| replace:: :abbr:`MO (Manufacturing Order)` +.. |SO| replace:: :abbr:`SO (Sales Order)` + +In Odoo, there are two strategies for automatically replenishing inventory: *reordering rules* and +the *make to order (MTO)* route. Although these strategies differ slightly, they both have similar +consequences: triggering the automatic creation of a |PO| or |MO|. The choice of which strategy to +use depends on the business's manufacturing and delivery processes. Terminology =========== @@ -15,31 +20,32 @@ Replenishment report and reordering rules The replenishment report is a list of all products that have a negative forecast quantity. -Reordering rules are used to ensure that there's always a minimum amount of a product in stock in -order to manufacture products and/or fulfill sales orders. When the stock level of a product -reaches its minimum, Odoo automatically generates a purchase order with the quantity needed to -reach the maximum stock level. +*Reordering rules* are used to ensure there's always a minimum amount of a product in-stock, in +order to manufacture products and/or fulfill sales orders. When the stock level of a product reaches +its minimum, Odoo automatically generates a purchase order with the quantity needed to reach the +maximum stock level. -Reordering rules can be created and managed in the replenishment report or from the product form. +Reordering rules can be created and managed in the replenishment report, or from the product form. -Make to Order +Make to order ------------- -Make to Order (MTO) is a procurement route that creates a draft purchase order or manufacturing -order each time a sales order is confirmed, *regardless of the current stock level*. +*Make to order (MTO)* is a procurement route that creates a draft purchase order (or manufacturing +order) each time a sales order is confirmed, **regardless of the current stock level**. Unlike products replenished using reordering rules, Odoo automatically links the sales order to the -purchase order (PO) or manufacturing order (MO) generated by the MTO route. Another difference -between reordering rules and MTO is with MTO, Odoo generates a draft :abbr:`PO (Purchase Order)` or -:abbr:`MO (Manufacturing Order)` immediately after the sales order is confirmed. With reordering -rules, Odoo generates a draft :abbr:`PO (Purchase Order)` or :abbr:`MO (Manufacturing Order)` when -the product's forecasted stock falls below the set minimum quantity. In addition, Odoo will -automatically add quantities to the :abbr:`PO (Purchase Order)`/:abbr:`MO (Manufacturing Order)` as -the forecast changes, as long as the :abbr:`PO (Purchase Order)`/:abbr:`MO (Manufacturing Order)` -is not confirmed. - -The MTO route is the best replenishment strategy for products that are customized and should be -used for this purpose only. +|PO| or |MO| generated by the |MTO| route. + +Another difference between reordering rules and |MTO| is, with |MTO|, Odoo generates a draft |PO| or +|MO| immediately after the |SO| is confirmed. With reordering rules, Odoo generates a draft |PO| or +|MO| when the product's forecasted stock falls below the set minimum quantity. + +In addition, Odoo automatically adds quantities to the |PO| or |MO| as the forecast changes, so long +as the |PO| or |MO| is not confirmed. + +The |MTO| route is the best replenishment strategy for products that are customized, and/or for +products that have no stock kept on-hand. + Configuration ============= @@ -47,92 +53,143 @@ Configuration Replenishment report and reordering rules ----------------------------------------- -To access the replenishment report, go to :menuselection:`Inventory --> Operations --> -Replenishment`. By default, the replenishment report shows every product that needs to be manually -reordered. If there is no specific rule for a product, Odoo assumes that the :guilabel:`Minimum -Quantity` and :guilabel:`Maximum Quantity` stock are both `0.00`. +To access the replenishment report, go to :menuselection:`Inventory app --> Operations --> +Replenishment.` -.. image:: strategies/replenishment-report.png - :align: center - :alt: The replenishment report shows products that need to be reordered manually. +By default, the replenishment report dashboard shows every product that needs to be manually +reordered. If there is no specific rule for a product, Odoo assumes the :guilabel:`Min Quantity` and +:guilabel:`Max Quantity` stock are both `0.00` .. note:: - For products that don't have a set reordering rule, Odoo calculates the forecast as sales orders, - deliveries, and receipts are confirmed. For products that have a set reordering rule, Odoo - calculates the forecast normally, but also takes into account the purchase/manufacturing lead - time and security lead time. - -Before creating a new reordering rule, make sure the product has a vendor or a bill of materials -configured on the product form. Also, make sure the :guilabel:`Product Type` is set to `Storable -Product` on the product form. By definition, a consumable product does not have its inventory -levels tracked, so Odoo can not account for a consumable product in the stock valuation. - -To create a new reordering rule from the replenishment report, go to :menuselection:`Inventory --> -Operations --> Replenishment`, click :guilabel:`Create`, and set the :guilabel:`Product`. If -desired, set a :guilabel:`Min Quantity` and a :guilabel:`Max Quantity`. Finally, click -:guilabel:`Save`. - -To create a new reordering rule from the product form, go to :menuselection:`Inventory --> Products ---> Products`, select a product to open its product form, click the :guilabel:`Reordering Rules` -smart button, and click :guilabel:`Create`. Then, fill out the fields and save the new reordering -rule. - -By default, the quantity in the :guilabel:`To Order` field is the quantity required to reach the -set :guilabel:`Max Quantity`. However, the :guilabel:`To Order` quantity can be adjusted by -clicking on the field, changing the value, and clicking :guilabel:`Save`. To replenish a product -manually, click :guilabel:`Order Once`. - -To automate replenishment, click :guilabel:`Automate Orders`. When this button is clicked, Odoo -will automatically generate a draft :abbr:`PO (Purchase Order)`/:abbr:`MO (Manufacturing Order)` -every time the forecasted stock level falls below the set :guilabel:`Min Quantity` of the -reordering rule. - - -A reordering rule can be temporarily deactivated for a given period by using the :guilabel:`Snooze` -button. + For products that don't have a set reordering rule, Odoo calculates the forecast based on + confirmed sales orders, deliveries, and receipts. For products that have a set reordering rule, + Odoo calculates the forecast normally, but also takes into account the purchase/manufacturing + lead time and security lead time. + +.. important:: + Before creating a new reordering rule, make sure the product has a *vendor* or a *bill of + materials* configured on the product form. To check this, go to :menuselection:`Inventory app + --> Products --> Products`, and select the product to open its product form. The vendor, if + configured, is listed in the :guilabel:`Purchase` tab, and the bill on materials, if configured, + is found in the :guilabel:`Bill of Materials` smart button at the top of the form. + + The :guilabel:`Product Type`, located in the :guilabel:`General Information` tab on the product + form, **must** be set to :guilabel:`Storable Product`. By definition, a consumable product does + not have its inventory levels tracked, so Odoo cannot account for a consumable product in the + replenishment report. + +.. image:: strategies/replenishment-report-dashboard.png + :align: center + :alt: Replenishment report listing all items needing to be purchased to meet current needs. + +To create a new reordering rule from the replenishment report, go to :menuselection:`Inventory app +--> Operations --> Replenishment`, click :guilabel:`Create`, and select the desired product from the +drop-down menu in the :guilabel:`Product` column. If necessary, a :guilabel:`Min Quantity` and a +:guilabel:`Max Quantity` can be configured in the corresponding columns on the +:guilabel:`Replenishment` report page, as well. + +To create a new reordering rule from the product form, go to :menuselection:`Inventory app --> +Products --> Products`, and select a product to open its product form. Click the +:guilabel:`Reordering Rules` smart button, click :guilabel:`Create`, and fill out the fields. + +Replenishment report fields +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The following fields are on the :guilabel:`Replenishment` report. If any of these fields are not +visible, click the :guilabel:`⋮ (additional options)` icon on the far right side of the report, then +click the checkbox next to a field to make it visible. + +- :guilabel:`Product`: the product that requires a replenishment. +- :guilabel:`Location`: the specific location where the product is stored. +- :guilabel:`Warehouse`: the warehouse where the product is stored. +- :guilabel:`On Hand`: the amount of product currently available. +- :guilabel:`Forecast`: the amount of product available after all current orders (sales, + manufacturing, purchase, etc.) are taken into account. +- :guilabel:`Preferred Route`: how the product is procured, either :guilabel:`Buy`, + :guilabel:`Manufactured`, :guilabel:`Dropship`, etc. +- :guilabel:`Vendor`: the company from which the product is acquired. +- :guilabel:`Bill of Materials`: the bill of materials for the product (if one is configured). +- :guilabel:`Trigger`: how the replenishment is created, either :guilabel:`Auto` (automatically, + once the :guilabel:`On Hand` quantity goes below the :guilabel:`Min Quantity`) or + :guilabel:`Manual` (only when the replenishment is requested). +- :guilabel:`Procurement Group`: the reference number for how the product is being acquired, such as + a sales order, purchase order, or manufacturing order. +- :guilabel:`Min Quantity`: the minimum amount of product that should be available. When inventory + levels goes below this number, the replenishment is triggered. +- :guilabel:`Max Quantity`: the amount of product that should be available after replenishing the + product. +- :guilabel:`Multiple Quantity`: if the product should be ordered in specific quantities, enter the + number that should be ordered. For example, if the :guilabel:`Multiple Quantity` is set to `5`, + and only 3 are needed, 5 products are replenished. +- :guilabel:`To Order`: the amount of product that is currently needed, and will be ordered, if the + :guilabel:`Order Once` or :guilabel:`Automate Orders` button is clicked. +- :guilabel:`UoM`: the unit of measure used to acquire the product. +- :guilabel:`Company`: the company for which the product is acquired. + +By default, the quantity in the :guilabel:`To Order` field is the quantity required to reach the set +:guilabel:`Max Quantity`. However, the :guilabel:`To Order` quantity can be adjusted by clicking on +the field and changing the value. To replenish a product manually, click :guilabel:`Order Once`. + +To automate a replenishment from the :guilabel:`Replenishment` page, click :guilabel:`Automate +Orders` on the right-side of the line, represented by a :guilabel:`🔄 (circular arrow)` icon. + +When this button is clicked, Odoo will automatically generate a draft |PO|/|MO| every time the +forecasted stock level falls below the set :guilabel:`Min Quantity` of the reordering rule. + +On the :guilabel:`Replenishment` page, a reordering rule or manual replenishment can be temporarily +deactivated for a given period, by clicking the :guilabel:`🔕 (snooze)` icon on the far-right of the +line. .. image:: strategies/reordering-rule-snooze-settings.png :align: center - :alt: Snooze feature to temporarily deactivate reordering rules. + :alt: Snooze options to turn off notifications for reordering for a period of time. -A :abbr:`PO (Purchase Order)` or :abbr:`MO (Manufacturing Order)` created by a manual replenishment -will have `Replenishment Report` as the source document. A :abbr:`PO (Purchase Order)` or -:abbr:`MO (Manufacturing Order)` created by an automated reordering rule will have the sales -order(s) reference number(s) that triggered the rule as the source document. +A |PO| or |MO| created by a manual replenishment has a :guilabel:`Replenishment Report` as the +source document. A |PO| or |MO| created by an automated reordering rule has the |SO| reference +number(s) that triggered the rule as the source document. .. image:: strategies/rfq-source-document.png :align: center - :alt: Look at the source panel showing where RFQ/MFG orders originated from. + :alt: Quote request list shows which quotes are directly from the replenishment report. -Make to order -------------- +Make to order (MTO) route +========================= -Since the Make to Order (MTO) route is only recommended for customized products, the route is -hidden by default. +Since the |MTO| route is recommended for customized products, the route is hidden by default. -To activate the Make to Order (MTO) route in Odoo: +To activate the |MTO| route in Odoo: + #. Go to :menuselection:`Inventory app --> Configuration --> Settings`. + #. Activate the :guilabel:`Multi-Step Routes` setting, located under the :guilabel:`Warehouse` + section, and click :guilabel:`Save`. + #. Then, go to :menuselection:`Inventory app --> Configuration --> Routes`. + #. Click on :menuselection:`Filters --> Archived` to show archived routes. + #. Select the checkbox next to :guilabel:`Replenish on Order (MTO)`, and click on + :menuselection:`Action --> Unarchive`. -#. Go to :menuselection:`Inventory --> Configuration --> Settings --> Warehouse`. -#. Activate :guilabel:`Multi-Step Routes` setting and click :guilabel:`Save`. -#. Go to :menuselection:`Inventory --> Configuration --> Routes`. -#. Click on :menuselection:`Filters --> Archived` to show archived routes. -#. Select the checkbox next to :guilabel:`Replenish on Order (MTO)`, and click on - :menuselection:`Action --> Unarchive`. +.. note:: + Activating the :guilabel:`Multi-Step Routes` setting also activates :guilabel:`Storage + Locations`. If these features aren't applicable to the warehouse, disable these settings after + unarchiving the |MTO| route. + +To set a product's procurement route to |MTO|, go to :menuselection:`Inventory app --> Products --> +Products`, and click on the desired product to open its product form. + +Then, click the :guilabel:`Inventory` tab, and in the :guilabel:`Routes` section of options, select +:guilabel:`Replenish on Order (MTO)`. + +For products purchased directly from a vendor, make sure the :guilabel:`Buy` route is selected, in +addition to the :guilabel:`Replenish on Order (MTO)` route. Also, make sure a vendor is configured +in the :guilabel:`Purchase` tab of the product form. + +For products manufactured in-house, make sure the :guilabel:`Manufacture` route is selected, in +addition to the :guilabel:`Replenish on Order (MTO)` route. Also, make sure a bill of materials is +configured for the product, which is accessible via the :guilabel:`Bill of Materials` smart button +on the product form. .. note:: - Activating the :guilabel:`Multi-Step Routes` setting also activates :guilabel:`Storage Locations` - setting. If these features aren't applicable to the warehouse, disable these settings after - unarchiving the MTO route. - -To set a product's procurement route to MTO, go to :menuselection:`Inventory --> Products --> -Products`, click on a product to open the product form, and click :guilabel:`Edit`. Then, click on -the :guilabel:`Inventory` tab and in the :guilabel:`Routes` options, select :guilabel:`Replenish on -Order (MTO)`. For products purchased directly from a vendor, make sure the :guilabel:`Buy` route is -selected in addition to the MTO route and a vendor is configured in the :guilabel:`Purchase` tab. -For products manufactured in-house, make sure the :guilabel:`Manufacture` route is selected in -addition to the MTO route and a bill of materials is configured for the product. Finally, click -:guilabel:`Save`. - -.. image:: strategies/replenish-on-order-product-setting.png + The |MTO| route cannot be selected alone. |MTO| **only** works if the :guilabel:`Manufacture` or + :guilabel:`Buy` route is also selected. + +.. image:: strategies/acoustic-block-screen-replenish.png :align: center - :alt: Enable the Replenish on Order (MTO) route on the product settings. + :alt: Replenish on Order selected on the product form. diff --git a/content/applications/inventory_and_mrp/inventory/management/products/strategies/acoustic-block-screen-replenish.png b/content/applications/inventory_and_mrp/inventory/management/products/strategies/acoustic-block-screen-replenish.png new file mode 100644 index 0000000000..c7e01b3199 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/products/strategies/acoustic-block-screen-replenish.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/strategies/reordering-rule-snooze-settings.png b/content/applications/inventory_and_mrp/inventory/management/products/strategies/reordering-rule-snooze-settings.png index 93be8bdc51..12c95210cb 100644 Binary files a/content/applications/inventory_and_mrp/inventory/management/products/strategies/reordering-rule-snooze-settings.png and b/content/applications/inventory_and_mrp/inventory/management/products/strategies/reordering-rule-snooze-settings.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/strategies/replenish-on-order-product-setting.png b/content/applications/inventory_and_mrp/inventory/management/products/strategies/replenish-on-order-product-setting.png deleted file mode 100644 index e0599ff160..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/products/strategies/replenish-on-order-product-setting.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/strategies/replenishment-report-dashboard.png b/content/applications/inventory_and_mrp/inventory/management/products/strategies/replenishment-report-dashboard.png new file mode 100644 index 0000000000..bd5a77a93f Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/management/products/strategies/replenishment-report-dashboard.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/strategies/replenishment-report.png b/content/applications/inventory_and_mrp/inventory/management/products/strategies/replenishment-report.png deleted file mode 100644 index e2bc0cd851..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/management/products/strategies/replenishment-report.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/management/products/strategies/rfq-source-document.png b/content/applications/inventory_and_mrp/inventory/management/products/strategies/rfq-source-document.png index de92cb77d0..18403c4ce7 100644 Binary files a/content/applications/inventory_and_mrp/inventory/management/products/strategies/rfq-source-document.png and b/content/applications/inventory_and_mrp/inventory/management/products/strategies/rfq-source-document.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/reporting/inventory_valuation_config.rst b/content/applications/inventory_and_mrp/inventory/management/reporting/inventory_valuation_config.rst index b972a5f3c2..efd2953bc7 100644 --- a/content/applications/inventory_and_mrp/inventory/management/reporting/inventory_valuation_config.rst +++ b/content/applications/inventory_and_mrp/inventory/management/reporting/inventory_valuation_config.rst @@ -2,7 +2,7 @@ Inventory valuation configuration ================================= -.. _inventory/inventory_valuation_config: +.. _inventory/management/inventory_valuation_config: All of a company's stock on-hand contributes to the valuation of its inventory. That value should be reflected in the company's accounting records to accurately show the value of the company and @@ -90,11 +90,17 @@ menu (e.g. :guilabel:`Standard`, :guilabel:`Average Cost (AVCO)`, or :guilabel:` ` .. note:: - When choosing :guilabel:`Average Cost (AVCO)` as the :guilabel:`Costing Method`, the numerical - value in the :guilabel:`Cost` field for products in the respective product category will no - longer be editable, and will appear grayed out. The :guilabel:`Cost` amount will instead - automatically update based on the average purchase price both of inventory on hand and the costs - accumulated from validated purchase orders. + When choosing :guilabel:`Average Cost (AVCO)` as the :guilabel:`Costing Method`, changing the + numerical value in the :guilabel:`Cost` field for products in the respective product category + creates a new record in the *Inventory Valuation* report to adjust the value of the product. The + :guilabel:`Cost` amount will then automatically update based on the average purchase price both + of inventory on hand and the costs accumulated from validated purchase orders. + +When the :guilabel:`Costing Method` is changed, products already in stock that were using the +:guilabel:`Standard` costing method **do not** change value; rather, the existing units keep their +value, and any product moves from then on affect the average cost, and the cost of the product will +change. If the value in the :guilabel:`Cost` field on a product form is changed manually, Odoo will +generate a corresponding record in the *Inventory Valuation* report. On the same screen, the :guilabel:`Account Stock Properties` fields will appear, as they are now required fields given the change to automated inventory valuation. These accounts are defined as diff --git a/content/applications/inventory_and_mrp/inventory/management/reporting/using_inventory_valuation.rst b/content/applications/inventory_and_mrp/inventory/management/reporting/using_inventory_valuation.rst index 48d5a506e8..63a4d8e566 100644 --- a/content/applications/inventory_and_mrp/inventory/management/reporting/using_inventory_valuation.rst +++ b/content/applications/inventory_and_mrp/inventory/management/reporting/using_inventory_valuation.rst @@ -9,11 +9,17 @@ value. In Odoo, this process can be conducted manually— by warehouse employees physically counting the products— or automatically through the database. -.. seealso:: - :ref:`Inventory valuation configuration ` +Automatic inventory valuation +============================= + +To use Odoo to automatically generate a trail of inventory valuation entries, first navigate to the +:menuselection:`Product Categories` list by going to :menuselection:`Inventory app --> Configuration +--> Product Categories` and select the desired product category. On the form, set the +:guilabel:`Inventory Valuation` as :guilabel:`Automated` and the :guilabel:`Costing Method` to any +of the three options. -Understand the basics of inventory valuation -============================================ +.. seealso:: + :ref:`Set up inventory valuation ` In order to understand how moving products in and out of stock affects the company's overall value, consider the following product and stock moves scenario below. @@ -21,87 +27,87 @@ consider the following product and stock moves scenario below. Receive a product ----------------- -For example, consider an physical product, a simple *table*, which is categorized as `Office -Furniture` in the product form's :guilabel:`Product Category` field. - -Navigate to the the product category itself by going to :menuselection:`Inventory app --> -Configuration --> Product Categories`, and on the form, set the :guilabel:`Costing Method` as `First -In First Out (FIFO)` and the :guilabel:`Inventory Valuation` field as `Automated`. +To track the value of incoming products, such as a simple *table*, configure the product category on +the the product itself. To get there, navigate to :menuselection:`Inventory app --> Products --> +Products` and click the desired product. On the product form, click the :guilabel:`➡️ (right arrow)` +icon beside the :guilabel:`Product Category` field, which opens an internal link to edit the product +category. Next, set the :guilabel:`Costing Method` as :guilabel:`First In First Out (FIFO)` and +:guilabel:`Inventory Valuation` as :guilabel:`Automated`. .. tip:: - Alternatively access the :guilabel:`Product Categories` dashboard by clicking on the - :guilabel:`internal link` arrow on the individual product's form, by hovering over the - :guilabel:`Product Category` field. + Alternatively access the :guilabel:`Product Categories` dashboard by navigating to + :menuselection:`Inventory app --> Configuration --> Product Categories` and select the desired + product category. Next, assume 10 tables are purchased at a price of $10.00, each. The :abbr:`PO (Purchase Order)` for those tables will show the subtotal of the purchase as $100, plus any additional costs or taxes. .. image:: using_inventory_valuation/purchase-order.png :align: center - :alt: Purchase order with 10 tables products valued at $10 each. + :alt: Purchase order with 10 tables products valued at $10.00 each. -After selecting :guilabel:`Validate` on the :abbr:`PO (Purchase Order)`, use the -:guilabel:`Valuation` smart button to view how the value of inventory was impacted. - -.. image:: using_inventory_valuation/valuation-smart-button.png - :align: center - :alt: Valuation smart button on a receipt. +After selecting :guilabel:`Validate` on the :abbr:`PO (Purchase Order)`, the :guilabel:`Valuation` +smart button is enabled. Clicking on this button displays a report showing how the inventory +valuation for the table was affected by this purchase. .. important:: - :ref:`Developer mode ` must be turned on to see the *Valuation* smart button. + :ref:`Developer mode ` **must** be turned on to see the :guilabel:`Valuation` + smart button. .. tip:: The :doc:`consignment ` feature allows ownership to items in stock. Thus, products owned by other companies are not accounted for in the host company's inventory valuation. -The :guilabel:`Stock Valuation` dashboard then displays valuation of all products in the shipment, -along with their quantities and valuation. In the example of 10 tables being purchased, the -:guilabel:`Total Value` column of the dashboard would display a calculated valuation of $100. - -.. image:: using_inventory_valuation/stock-valuation-product.png +.. image:: using_inventory_valuation/valuation-smart-button.png :align: center - :alt: Stock valuation page depicting the products within a shipment. + :alt: See Valuation smart button on a receipt, with Developer mode enabled. -In Odoo, automatic inventory valuation records are also recorded in the *Accounting* app. To access -these accounting entries, navigate to :menuselection:`Accounting --> Journal Entries`, and look for -inventory valuation entries with the `STJ` prefix in the :guilabel:`Journal` and :guilabel:`Number` -columns, respectively. - -.. image:: using_inventory_valuation/inventory-valuation-entry.png - :align: center - :alt: Accounting entry for the inventory valuation of 10 tables. +For a comprehensive dashboard that includes the inventory valuation of all product shipments, +inventory adjustments, and warehouse operations, refer to the :ref:`stock valuation report +`. Deliver a product ----------------- In the same logic, when a table is shipped to a customer and leaves the warehouse, the stock valuation decreases. The :guilabel:`Valuation` smart button on the :abbr:`DO (Delivery Order)`, -likewise, displays the stock valuation record as it does on a :abbr:`PO (Purchase Order)` +likewise, displays the stock valuation record as it does on a :abbr:`PO (Purchase Order)`. .. image:: using_inventory_valuation/decreased-stock-valuation.png :align: center :alt: Decreased stock valuation after a product is shipped. -The inventory valuation report ------------------------------- +.. _inventory/management/reporting/valuation-report: -To view the current value of all products in the warehouse, go to :menuselection:`Inventory app --> -Reporting --> Inventory Valuation`. The records in the table are organized by product, and selecting -a product's drop-down menu displays detailed records with the :guilabel:`Date`, -:guilabel:`Quantity`, and :guilabel:`Total Value` of the inventory. +Inventory valuation report +========================== + +To view the current value of all products in the warehouse, first turn on :ref:`Developer mode +` and navigate to :menuselection:`Inventory app --> Reporting --> Valuation`. The +:guilabel:`Stock Valuation` dashboard displays detailed records of products with the +:guilabel:`Date`, :guilabel:`Quantity`, :guilabel:`Unit Value`, and :guilabel:`Total Value` of the +inventory. + +.. important:: + :ref:`Developer mode ` **must** be enabled to see the :guilabel:`Valuation` + option under :guilabel:`Reporting`. .. image:: using_inventory_valuation/inventory-valuation-products.png :align: center :alt: Inventory valuation report showing multiple products. -.. note:: - The :guilabel:`Inventory At Date` button, located in the top-left corner of the :guilabel:`Stock - Valuation` dashboard, shows the inventory valuation of products available during a prior - specified date. +The :guilabel:`Valuation At Date` button, located in the top-left corner of the :guilabel:`Stock +Valuation` page, reveals a pop-up window. In this pop-up, the inventory valuation of products +available during a prior specified date can be seen and selected. + +.. tip:: + View a detailed record of a product's inventory value, stock move, and on-hand stock by selecting + the teal :guilabel:`➡️ (right arrow)` button to the right of the :guilabel:`Reference` column + value. Update product unit price -~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------- For any company: lead times, supply chain failures, and other risk factors can contribute to invisible costs. Although Odoo attempts to accurately represent the stock value, *manual valuation* @@ -109,22 +115,60 @@ serves as an additional tool to update the unit price of products. .. important:: Manual valuation is intended for products that can be purchased and received for a cost greater - than 0, or have product categories set with :guilabel:`Costing Method` set as either `Average - Cost (AVCO)` or `First In First Out (FIFO)`. + than 0, or have product categories set with :guilabel:`Costing Method` set as either + :guilabel:`Average Cost (AVCO)` or :guilabel:`First In First Out (FIFO)`. .. image:: using_inventory_valuation/add-manual-valuation.png :align: center :alt: Add manual valuation of stock value to a product. Create manual valuation entries on the :guilabel:`Stock Valuation` dashboard by first navigating to -:menuselection:`Inventory app --> Reporting --> Inventory Valuation`, and then click the little gray -drop-down icon to the left of a product's name, to then reveal stock valuation line items below as -well as a teal :guilabel:`+ (plus)` button on the right. +:menuselection:`Inventory app --> Reporting --> Valuation`. Next, to enable the *product +revaluation* feature, select :menuselection:`Group by --> Product` to organize all the records by +product. Click on the gray :guilabel:`▶️ (drop-down triangle)` icon to reveal stock valuation line +items below, as well as a teal :guilabel:`➕ (plus)` button on the right. -Click the teal :guilabel:`+ (plus)` button to open up the :guilabel:`Product Revaluation` form, -where updates to the calculation of inventory valuation can be made, by increasing or decreasing the +Click the teal :guilabel:`+ (plus)` button to open up the :guilabel:`Product Revaluation` form. +Here, the inventory valuation for a product can be recalculated, by increasing or decreasing the unit price of each product. +.. note:: + The :guilabel:`▶️ (drop-down triangle)` and :guilabel:`➕ (plus)` buttons are only visible after + grouping entries by product. + .. image:: using_inventory_valuation/product-revaluation.png :align: center :alt: Product revaluation form adding a value of $1.00 with the reason being inflation. + +Inventory valuation journal entries +----------------------------------- + +In Odoo, automatic inventory valuation records are also recorded in the :menuselection:`Accounting +app --> Accounting --> Journal Entries` dashboard. On this comprehensive list of accounting entries, +inventory valuation records are identified by checking values in the :guilabel:`Journal` column, or +looking for the :guilabel:`Reference` column value which matches the warehouse operation reference +(e.g. `WH/IN/00014` for receipts). + +Clicking on an inventory valuation journal entry opens a *double-entry accounting* record. These +records are generated by Odoo to track the change of value in inventory valuation as products are +moved in and out of the warehouse. + +.. example:: + To view the inventory valuation of 10 *tables*, costing $10.00 each, upon reception from the + vendor, go to the :menuselection:`Journal Entries` page found in :menuselection:`Accounting app + --> Accounting --> Journal Entries`. Here, click the journal line where the :guilabel:`Reference` + column value matches the reference on the receipt, `WH/IN/00014`. + + .. image:: using_inventory_valuation/stock-valuation-product.png + :align: center + :alt: Stock valuation page depicting the products within a shipment. + + `Stock interim` is a holding account for money intended to pay vendors for the product. The + `stock valuation` account stores the value of all on-hand stock. + + .. image:: using_inventory_valuation/inventory-valuation-entry.png + :align: center + :alt: Accounting entry for the inventory valuation of 10 tables. + +.. seealso:: + `Odoo Tutorial: Inventory Valuation `_ diff --git a/content/applications/inventory_and_mrp/inventory/management/reporting/using_inventory_valuation/inventory-valuation-products.png b/content/applications/inventory_and_mrp/inventory/management/reporting/using_inventory_valuation/inventory-valuation-products.png index 189cac11a5..8123e1ccea 100644 Binary files a/content/applications/inventory_and_mrp/inventory/management/reporting/using_inventory_valuation/inventory-valuation-products.png and b/content/applications/inventory_and_mrp/inventory/management/reporting/using_inventory_valuation/inventory-valuation-products.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/reporting/using_inventory_valuation/valuation-smart-button.png b/content/applications/inventory_and_mrp/inventory/management/reporting/using_inventory_valuation/valuation-smart-button.png index 24b9bddaf6..90dea63caa 100644 Binary files a/content/applications/inventory_and_mrp/inventory/management/reporting/using_inventory_valuation/valuation-smart-button.png and b/content/applications/inventory_and_mrp/inventory/management/reporting/using_inventory_valuation/valuation-smart-button.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_one_step.rst b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_one_step.rst index 834e5b51c8..fb3956c7bf 100644 --- a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_one_step.rst +++ b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_one_step.rst @@ -20,12 +20,11 @@ Configure the warehouse If another receiving or shipping configuration is set on the warehouse, they can easily be set back to the one step setting. -Begin by navigating to :menuselection:`Inventory --> Configuration --> -Warehouses`, click on the desired warehouse, and click :guilabel:`Edit`. Next, on the -:guilabel:`Warehouse Configuration` tab, under the :guilabel:`Shipments` section, select -:guilabel:`Receive goods directly (1 step)` for :guilabel:`Incoming Shipments` and/or -:guilabel:`Deliver goods directly (1 step)` for :guilabel:`Outgoing Shipments`, and :guilabel:`Save` -the changes to finish. +Begin by navigating to :menuselection:`Inventory --> Configuration --> Warehouses`, and click on the +desired warehouse to edit. Next, on the :guilabel:`Warehouse Configuration` tab, under the +:guilabel:`Shipments` section, select :guilabel:`Receive goods directly (1 step)` for +:guilabel:`Incoming Shipments` and/or :guilabel:`Deliver goods directly (1 step)` for +:guilabel:`Outgoing Shipments`. .. image:: receipts_delivery_one_step/one-step-warehouse-config.png :align: center @@ -38,7 +37,7 @@ Create a purchase order ----------------------- On the main :menuselection:`Purchase` application dashboard, start by making a new quote by clicking -:guilabel:`Create`. Then, select (or create) a :guilabel:`Vendor` from the drop-down field, add a +:guilabel:`New`. Then, select (or create) a :guilabel:`Vendor` from the drop-down field, add a storable :guilabel:`Product` to the order lines, and click :guilabel:`Confirm Order` to finalize the quote as a new purchase order. @@ -90,8 +89,8 @@ Create a sales order -------------------- Start my navigating to the main :menuselection:`Sales` app dashboard, and make a new quote by -clicking :guilabel:`Create`. Then select (or create) a :guilabel:`Customer` from the drop-down -field, add a storable :guilabel:`Product` that is in stock to the order lines, and click +clicking :guilabel:`New`. Then select (or create) a :guilabel:`Customer` from the drop-down field, +add a storable :guilabel:`Product` that is in stock to the order lines, and click :guilabel:`Confirm` to finalize the quotation as a sales order. A :guilabel:`Receipt` smart button will appear in the top-right corner of the :abbr:`PO (purchase diff --git a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps.rst b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps.rst index 334704c9f6..fab6b16550 100644 --- a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps.rst +++ b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps.rst @@ -32,7 +32,7 @@ Configure multi-step routes =========================== First, make sure the :guilabel:`Multi-Step Routes` option is enabled in :menuselection:`Inventory ---> Configuration --> Settings`, under the ::guilabel:`Warehouse` heading. After enabling the +--> Configuration --> Settings`, under the :guilabel:`Warehouse` heading. After enabling the setting, :guilabel:`Save` the changes. .. note:: @@ -44,12 +44,12 @@ setting, :guilabel:`Save` the changes. :alt: Activate multi-step routes and storage locations in inventory settings. Next, the warehouse needs to be configured for two-step receipts and deliveries. Go to -:menuselection:`Inventory --> Configuration --> Warehouses`, and click :guilabel:`Edit` to change +:menuselection:`Inventory --> Configuration --> Warehouses`, and click on the warehouse to change the warehouse settings. Then, select :guilabel:`Receive goods in input and then stock (2 steps)` for :guilabel:`Incoming Shipments`, and :guilabel:`Send goods in output and then deliver (2 steps)` for :guilabel:`Outgoing -Shipments`. :guilabel:`Save` the changes to finish. +Shipments`. .. image:: receipts_delivery_two_steps/two-step-warehouse-config.png :align: center @@ -59,9 +59,8 @@ Shipments`. :guilabel:`Save` the changes to finish. Activating two-step receipts and deliveries will create new *input* and *output* locations, which by default, are labeled :guilabel:`WH/Input` and :guilabel:`WH/Output`, respectively, on the :guilabel:`Locations` dashboard. To rename these locations, go to :menuselection:`Configuration - --> Locations`, select the :guilabel:`Location` to change, and then click :guilabel:`Edit`. On - the location form, update the ::guilabel:`Location Name`, make any other changes (if necessary) - and :guilabel:`Save` the changes. + --> Locations`, and select the :guilabel:`Location` to change. On the location form, update the + :guilabel:`Location Name`, and make any other changes (if necessary). Process a receipt in two steps (input + stock) ============================================== @@ -70,28 +69,27 @@ Create a purchase order ----------------------- On the main :menuselection:`Purchase` application dashboard, start by making a new quote by clicking -:guilabel:`Create`. Then, select (or create) a :guilabel:`Vendor` from the drop-down field, add a +:guilabel:`New`. Then, select (or create) a :guilabel:`Vendor` from the drop-down field, add a storable :guilabel:`Product` to the order lines, and click :guilabel:`Confirm Order` to finalize the quote as a new purchase order. .. important:: For businesses with multiple warehouses that have different step configurations, the - :guilabel:`Deliver To` field on the ::abbr:`PO (Purchase Order)` form may need to be specifed as + :guilabel:`Deliver To` field on the :abbr:`PO (Purchase Order)` form may need to be specified as the correct *input location* connected to the two-step warehouse, which can be done by selecting the warehouse from the drop-down selection that includes the `Receipts` label at the end of the name. -After confirming the ::abbr:`PO (Purchase Order)`, a :guilabel:`Receipt` smart button will appear in -the top-right corner of the :abbr:`PO (Purchase Order)` form — click it to reveal the associated -receipt. +After confirming the :abbr:`PO (Purchase Order)`, a :guilabel:`Receipt` smart button will appear in +the top of the :abbr:`PO (Purchase Order)` form — click it to reveal the associated receipt. .. image:: receipts_delivery_two_steps/two-step-po-receipt.png :align: center :alt: After confirming a purchase order, a Receipt smart button will appear. .. tip:: - Purchase order receipts can also be found in the :menuselection:`Inventory` application. In - the :guilabel:`Overview` dashboard, click the :guilabel:`# to Process` smart button in the + Purchase order receipts can also be found in the :menuselection:`Inventory` application. In the + :guilabel:`Overview` dashboard, click the :guilabel:`# to Process` smart button in the :guilabel:`Receipts` kanban card. .. image:: receipts_delivery_two_steps/two-step-receipts-kanban.png @@ -142,13 +140,13 @@ Process a delivery order in two steps (pick + ship) Create a sales order -------------------- -In the :menuselection:`Sales` application, create a new quote by clicking :guilabel:`Create`. Select +In the :menuselection:`Sales` application, create a new quote by clicking :guilabel:`New`. Select (or create) a :guilabel:`Customer`, add a storable :guilabel:`Product` to the order lines, and then click :guilabel:`Confirm`. -After confirming the ::abbr:`SO (Sales Order)`, a :guilabel:`Receipt` smart button will appear in -the top-right corner of the :abbr:`PO (Sales Order)` form — click it to reveal the associated -receipt. +After confirming the :abbr:`SO (Sales Order)`, a :guilabel:`Delivery` smart button will appear in +the top, above the :abbr:`SO (Sales Order)` form. Click the :guilabel:`Delivery` smart button to +reveal the associated receipt. .. image:: receipts_delivery_two_steps/two-step-sales-quote.png :align: center @@ -168,8 +166,8 @@ Process the picking ------------------- The picking and delivery order will be created once the sales order is confirmed. When the -:guilabel:`Delivery` smart button appears, click it to arrive to the :guilabel:`Transfers` -dashboard, which lists both the picking and the delivery orders. +:guilabel:`Delivery` smart button appears, click it to reveal the :guilabel:`Transfers` dashboard, +which lists both the picking and the delivery orders. The status of the picking will be :guilabel:`Ready`, since the product must be picked from stock before it can be shipped. The status of the delivery order will be :guilabel:`Waiting Another @@ -201,8 +199,8 @@ the :guilabel:`# To Process` smart button in the :guilabel:`Delivery Orders` kan .. tip:: The delivery order associated with the :abbr:`SO (Sales Order)` can also be quickly accessed by - clicking on the ::guilabel:`Delivery` smart button again, and choosing the delivery order on the - ::guilabel:`Transfers` page (which should now be marked as ::guilabel:`Ready`). + clicking on the :guilabel:`Delivery` smart button again, and choosing the delivery order on the + :guilabel:`Transfers` page (which should now be marked as :guilabel:`Ready`). .. image:: receipts_delivery_two_steps/deliver-two-step-kanban.png :align: center @@ -217,5 +215,5 @@ Click on the delivery order associated with the :abbr:`SO (Sales Order)`, then c the customer location. Once the delivery order is validated, the product leaves the :guilabel:`WH/Output` location on the -:guilabel:`Transfers` dashboard and moves to the :guilabel:`Partners/Customers` location. Then, -the status of the document will change to :guilabel:`Done`. +:guilabel:`Transfers` dashboard and moves to the :guilabel:`Partners/Customers` location. Then, the +status of the document will change to :guilabel:`Done`. diff --git a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/deliver-two-step-kanban.png b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/deliver-two-step-kanban.png index 1a0202edd6..35163ba8ef 100644 Binary files a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/deliver-two-step-kanban.png and b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/deliver-two-step-kanban.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/transfer-two-step-kanban.png b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/transfer-two-step-kanban.png index ef4093ed0a..5b66c913fb 100644 Binary files a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/transfer-two-step-kanban.png and b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/transfer-two-step-kanban.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-pick-kanban.png b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-pick-kanban.png index c756f80961..f794c6f3a8 100644 Binary files a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-pick-kanban.png and b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-pick-kanban.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-po-receipt.png b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-po-receipt.png index 5fddc2496d..2c2dbee749 100644 Binary files a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-po-receipt.png and b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-po-receipt.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-receipts-kanban.png b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-receipts-kanban.png index 79d1d387fb..3f4eae498a 100644 Binary files a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-receipts-kanban.png and b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-receipts-kanban.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-sales-quote.png b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-sales-quote.png index f3ed6b77a2..288df3f4bc 100644 Binary files a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-sales-quote.png and b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-sales-quote.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-status.png b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-status.png index 877778ac44..fe66d58dc4 100644 Binary files a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-status.png and b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-status.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-validate-transfer.png b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-validate-transfer.png index de96942244..5f89cfdafe 100644 Binary files a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-validate-transfer.png and b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/two-step-validate-transfer.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/validate-two-step-delivery.png b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/validate-two-step-delivery.png index fc081554de..d38e3eed38 100644 Binary files a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/validate-two-step-delivery.png and b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/validate-two-step-delivery.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/validate-two-step-pick.png b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/validate-two-step-pick.png index d5a4214a5d..5406f252fe 100644 Binary files a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/validate-two-step-pick.png and b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/validate-two-step-pick.png differ diff --git a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/validate-two-step-receipt.png b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/validate-two-step-receipt.png index e81c8db6bb..4b3b748431 100644 Binary files a/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/validate-two-step-receipt.png and b/content/applications/inventory_and_mrp/inventory/management/shipments_deliveries/receipts_delivery_two_steps/validate-two-step-receipt.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/label_type.rst b/content/applications/inventory_and_mrp/inventory/shipping/operation/label_type.rst index 87ff1edd5d..6cd04cdc75 100644 --- a/content/applications/inventory_and_mrp/inventory/shipping/operation/label_type.rst +++ b/content/applications/inventory_and_mrp/inventory/shipping/operation/label_type.rst @@ -13,15 +13,15 @@ Configuration ============= In the :menuselection:`Inventory` module, go to :menuselection:`Configuration --> Delivery --> -Shipping Methods.` Choose a delivery method and click :guilabel:`Edit`. For the following example, -*FedEx International* will be used. +Shipping Methods.` Click on a delivery method to choose it. For the following example, *FedEx +International* will be used. .. image:: label_type/shipping-options.png :align: center :alt: Different shipping methods. In the :guilabel:`Configuration` tab, under :guilabel:`Label Type`, choose one of the label types -available. The availability will vary depending on the carrier. :guilabel:`Save` the changes. +available. The availability varies depending on the carrier. .. image:: label_type/label-type-dropdown.png :align: center diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack.rst b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack.rst index 7b7a5868ab..3f532d433d 100644 --- a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack.rst +++ b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack.rst @@ -1,84 +1,117 @@ -========================================================= -How to manage multiple packs for the same delivery order? -========================================================= +======================= +Multi-package shipments +======================= -Overview -======== - -By default, Odoo considers that your delivery is composed of one -package. But you can easily ship your deliveries with more than one -package. It is fully integrated with the third-party shippers. +In some cases, a delivery order with multiple items may need to be shipped in more than one package. +This may be necessary if the items are too large to ship in a single package, or if certain items +cannot be packaged together. Shipping a single delivery order in multiple packages provides +flexibility for how each item is packaged, without the need to create multiple delivery orders. Configuration ============= -To configure the use of packages, go to the menu -:menuselection:`Inventory --> Configuration --> Settings`. -Locate the **Packages** section and tick **Record -packages used on packing: pallets, boxes,...** +In order to split a delivery order across multiple packages, the *Packages* setting must be enabled. +To do so, navigate to :menuselection:`Inventory --> Configuration --> Settings`, then enable the +checkbox next to :guilabel:`Packages`. Click :guilabel:`Save` to confirm the change. -.. image:: multipack/multipack03.png +.. image:: multipack/packages-setting.png :align: center + :alt: The Packages setting on the Inventory app settings page. + +.. _inventory/shipping/multiple-packages: -Click on **Apply** when you are done. +Ship items in multiple packages +=============================== -Sale process -============ +To split items in the same delivery order across multiple packages, begin by navigating to +:menuselection:`Inventory --> Delivery Orders`, then select a delivery order that has multiple +items, a multiple quantity of the same item, or both. -Sale order ----------- +On the :guilabel:`Operations` tab, select the :guilabel:`⁞≣ (menu)` icon in the line of the product +that will be shipped in the first package. -.. image:: multipack/multipack06.png +.. image:: multipack/product-menu-icon.png :align: center + :alt: The menu icon for a product in a delivery order. -Click on a **Delivery Method** to choose the right one. +This makes a :guilabel:`Detailed Operations` pop-up window appear. In the table at the bottom of the +pop-up window, the :guilabel:`Reserved` column shows the total quantity of the product included in +the delivery order. -The price is computed when you **save** the sale order or when you click on -**Set price**. +If the full quantity will be shipped in the first package, enter the number from the +:guilabel:`Done` column in the :guilabel:`Reserved` column. If less than the full quantity will be +shipped in the first package, enter a smaller number than the one that appears in the +:guilabel:`Reserved` column. Click :guilabel:`Confirm` to confirm the :guilabel:`Done` quantities +and close the pop-up. -Multi-packages Delivery ------------------------ +.. image:: multipack/detailed-operations.png + :align: center + :alt: The Detailed Operations pop-up for a product in a delivery order. -The delivery created from the sale order will take the shipping -information from it. +Repeat the same steps for every item quantity that is included in the first package. Then, click +:guilabel:`Put In Pack` to create a package with all of the selected items. -.. image:: multipack/multipack07.png +.. image:: multipack/put-in-pack.png :align: center + :alt: The Put In Pack button on a delivery order. -From here, you can split your delivery into multiple packages. +For the next package, follow the same steps as detailed above, marking the quantity of each item to +be included in the package as :guilabel:`Done` before clicking :guilabel:`Put In Pack` on the +delivery order. Continue doing so until the full quantity of all items are added to a package. -Choose the quantity you want to put in the first pack in the **Done** -column, then click on the link **Put in Pack**. +Finally, after all of the packages have been shipped, click :guilabel:`Validate` to confirm that the +delivery order has been completed. -.. image:: multipack/multipack02.png - :align: center +.. tip:: + After one or more packages are created, a :guilabel:`Packages` smart button appears in the + top-right corner of the delivery order. Click the :guilabel:`Packages` smart button to go to the + :guilabel:`Packages` page for the delivery order, where each package can be selected to view all + of the items included in it. -It will automatically create a pack with the requested quantity. + .. image:: multipack/packages-smart-button.png + :align: center + :alt: The Packages smart button on a delivery order. -Do the same steps for the other pieces you want to pack in. +Create a backorder for items to be shipped later +================================================ -.. image:: multipack/multipack04.png - :align: center +If some items will be shipped at a later date than others, there is no need to put them in a package +until they are ready to be shipped. Instead, create a backorder for the items being shipped later. + +Begin by shipping the items that will be shipped immediately. If they will be shipped in multiple +packages, follow the :ref:`steps above ` to package them as +required. If they will be shipped in a single package, simply mark in the :guilabel:`Done` column +the quantity of each item being shipped, but **do not** click the :guilabel:`Put In Pack` button. -Click on **Validate** when you are done. +After all quantities being shipped immediately are marked as :guilabel:`Done`, click the +:guilabel:`Validate` button, and a :guilabel:`Create Backorder?` pop-up window appears. Then, click +the :guilabel:`Create Backorder` button. Doing so confirms the items being shipped immediately and +creates a new delivery order for the items that will be shipped later. -Multi-packages with a 3rd party-shipper ---------------------------------------- +.. image:: multipack/backorder-pop-up.png + :align: center + :alt: The Create Backorder? pop-up window. -Once the delivery order is validated, you will receive the tracking -number. The **carrier Tracking ref** field will automatically be filled. -Click on the **Tracking** button to check your delivery on the provider -website. +The backorder delivery order will be listed in the chatter of the original delivery order in a +message that reads :guilabel:`The backorder WH/OUT/XXXXX has been created.`. Click on +:guilabel:`WH/OUT/XXXXX` in the message to view the backorder delivery order. -.. image:: multipack/multipack05.png +.. image:: multipack/backorder-chatter.png :align: center + :alt: The backorder delivery order listed in the chatter of the original delivery order. -The **labels** to stick on your packages are available in the history -underneath: +The backorder delivery order can also be accessed by navigating to :menuselection:`Inventory`, +clicking the :guilabel:`# Back Orders` button on the :guilabel:`Delivery Orders` card, and selecting +the delivery order. -.. image:: multipack/multipack01.png +.. image:: multipack/back-orders-button.png :align: center + :alt: The Back Orders button on the Delivery Orders card. + +Once the remaining items are ready to be shipped, navigate to the backorder delivery order. The +items can be shipped in a single package by clicking :guilabel:`Validate` and selecting +:guilabel:`Apply` on the :guilabel:`Immediate Transfer?` pop-up window that appears, or shipped in +multiple packages by following the steps detailed in the section above. -.. seealso:: - * :doc:`invoicing` - * :doc:`labels` +It is also possible to ship out some of the items while creating another backorder for the rest. To +do so, simply follow the same steps used to create the first backorder. diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/back-orders-button.png b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/back-orders-button.png new file mode 100644 index 0000000000..a0b81a19f8 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/back-orders-button.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/backorder-chatter.png b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/backorder-chatter.png new file mode 100644 index 0000000000..362927b076 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/backorder-chatter.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/backorder-pop-up.png b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/backorder-pop-up.png new file mode 100644 index 0000000000..7175ed3982 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/backorder-pop-up.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/detailed-operations.png b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/detailed-operations.png new file mode 100644 index 0000000000..15ba089877 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/detailed-operations.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack01.png b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack01.png deleted file mode 100644 index 9bc9202279..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack01.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack02.png b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack02.png deleted file mode 100644 index 65e4e8df39..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack02.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack03.png b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack03.png deleted file mode 100644 index e171227aed..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack03.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack04.png b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack04.png deleted file mode 100644 index db087026ff..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack04.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack05.png b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack05.png deleted file mode 100644 index 19890ea2da..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack05.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack06.png b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack06.png deleted file mode 100644 index 0dd5b90820..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack06.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack07.png b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack07.png deleted file mode 100644 index 895e9bd1e7..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/multipack07.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/packages-setting.png b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/packages-setting.png new file mode 100644 index 0000000000..2b7d4ea2a3 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/packages-setting.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/packages-smart-button.png b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/packages-smart-button.png new file mode 100644 index 0000000000..9d7a6f383d Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/packages-smart-button.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/product-menu-icon.png b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/product-menu-icon.png new file mode 100644 index 0000000000..d7b5e99962 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/product-menu-icon.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/put-in-pack.png b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/put-in-pack.png new file mode 100644 index 0000000000..dfef666c4f Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/shipping/operation/multipack/put-in-pack.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management.rst b/content/applications/inventory_and_mrp/manufacturing/management.rst index 8c96ea2faa..466a1919e8 100644 --- a/content/applications/inventory_and_mrp/manufacturing/management.rst +++ b/content/applications/inventory_and_mrp/manufacturing/management.rst @@ -11,8 +11,8 @@ Manufacturing management management/product_variants management/kit_shipping management/sub_assemblies - management/quality_control - management/alternative_wc management/subcontracting management/use_mps management/using_work_centers + management/work_center_time_off + management/scrap_manufacturing diff --git a/content/applications/inventory_and_mrp/manufacturing/management/alternative_wc.rst b/content/applications/inventory_and_mrp/manufacturing/management/alternative_wc.rst deleted file mode 100644 index 2432a49d82..0000000000 --- a/content/applications/inventory_and_mrp/manufacturing/management/alternative_wc.rst +++ /dev/null @@ -1,58 +0,0 @@ -======================== -Alternative Work Centers -======================== - -Manufacturing several different products simultaneously at the same work center is a common issue -for manufacturing companies. Although in practice, employees can manufacture the goods at another -work center instead of waiting for one to be available, it's not always simple to have visibility -on which work center is busy and plan resources accordingly in real-time. - -With Odoo, you can configure alternative work centers to solve this issue. This automatically -checks which work center is busy and which equivalent ones are free, and schedules orders and -maintenance accordingly. - -This way, your process becomes more efficient, as work center utilisation is optimised. - -Configure your Work Centers -=========================== - -First, go to the :menuselection:`Manufacturing app --> Configuration --> Settings`. Then, enable -the :guilabel:`Work Orders` feature and hit :guilabel:`Save`. - -.. image:: alternative_wc/work-orders-setting.png - :align: center - :alt: Work order settings ticked in Odoo Manufacturing. - -Now, go to :menuselection:`Configuration --> Work Centers` and create two new work centers. Add the -second work center as an alternative to the first one and vice versa. - -.. image:: alternative_wc/alternative-wc-config.png - :align: center - :alt: Create a secondary work center as an alternate to the first. - -Next, go to :menuselection:`Products --> Bills of Materials`, choose your product, and add these -work centers to the operations of your :abbr:`BoM (Bill of Materials)`. - -.. image:: alternative_wc/wc-bom-operations.png - :align: center - :alt: Add work centers to Bill of Materials operations. - -Create your Work Orders -======================= - -Now that everything is configured, you can create your *Work Orders*. - -Go to :menuselection:`Operations --> Manufacturing Orders`, and hit :guilabel:`Create`. There, add -your product to your manufacturing order and plan it. You can then retrieve them from the -:guilabel:`Work Orders` list view, under :menuselection:`Operations > Work Orders`. - -Each new *Work Order*, which will be created before the end of the first one, will be scheduled at -the alternative work center you configured, as shown below. - -.. image:: alternative_wc/work-orders-by-wc.png - :align: center - :alt: Work order creation and scheduling. - -.. note:: - Keep in mind that, if you add time after production to your work center, you may have work - orders scheduled for your alternative work center even if the usual one is free. diff --git a/content/applications/inventory_and_mrp/manufacturing/management/alternative_wc/alternative-wc-config.png b/content/applications/inventory_and_mrp/manufacturing/management/alternative_wc/alternative-wc-config.png deleted file mode 100644 index c02a3e3624..0000000000 Binary files a/content/applications/inventory_and_mrp/manufacturing/management/alternative_wc/alternative-wc-config.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/alternative_wc/wc-bom-operations.png b/content/applications/inventory_and_mrp/manufacturing/management/alternative_wc/wc-bom-operations.png deleted file mode 100644 index d46802b4ae..0000000000 Binary files a/content/applications/inventory_and_mrp/manufacturing/management/alternative_wc/wc-bom-operations.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/alternative_wc/work-orders-by-wc.png b/content/applications/inventory_and_mrp/manufacturing/management/alternative_wc/work-orders-by-wc.png deleted file mode 100644 index f5b4aff7f1..0000000000 Binary files a/content/applications/inventory_and_mrp/manufacturing/management/alternative_wc/work-orders-by-wc.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/alternative_wc/work-orders-setting.png b/content/applications/inventory_and_mrp/manufacturing/management/alternative_wc/work-orders-setting.png deleted file mode 100644 index f887155602..0000000000 Binary files a/content/applications/inventory_and_mrp/manufacturing/management/alternative_wc/work-orders-setting.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/quality_control.rst b/content/applications/inventory_and_mrp/manufacturing/management/quality_control.rst deleted file mode 100644 index d63f25c8cb..0000000000 --- a/content/applications/inventory_and_mrp/manufacturing/management/quality_control.rst +++ /dev/null @@ -1,28 +0,0 @@ -=============== -Quality Control -=============== - -Whether you want to control the quality of your production, or the production -of your subcontractor, before registering the products into your stock, you can -rely on Odoo's Quality module. - - -To control the quality of your production, you need to set a *Quality Control Point* -on the Manufacturing Operation Type, as shown below. To create it, Go to :menuselection:`Quality ---> Quality Control --> Control Points`, and click **Create**. -If the check only applies to specific products, or product categories, you can specify these during -the setup as well. - -.. image:: quality_control/qc_1.png - :align: center - -Regarding the reception of subcontracted products, instead of the Manufacturing Operation Type, -you need to select the 'Receipts' Operation type. For the rest, the same principles apply. - -.. image:: quality_control/qc_2.png - :align: center - -By doing so, a quality check is automatically created each time a -finished product is made and/or received. Note that several Quality Check -*Types* can be chosen from the dropdown. Note also that several Quality -Check Points can be set up for the same Operation Type. diff --git a/content/applications/inventory_and_mrp/manufacturing/management/quality_control/qc_1.png b/content/applications/inventory_and_mrp/manufacturing/management/quality_control/qc_1.png deleted file mode 100644 index d4116dd0a0..0000000000 Binary files a/content/applications/inventory_and_mrp/manufacturing/management/quality_control/qc_1.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/quality_control/qc_2.png b/content/applications/inventory_and_mrp/manufacturing/management/quality_control/qc_2.png deleted file mode 100644 index a22f4a5724..0000000000 Binary files a/content/applications/inventory_and_mrp/manufacturing/management/quality_control/qc_2.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/scrap_manufacturing.rst b/content/applications/inventory_and_mrp/manufacturing/management/scrap_manufacturing.rst new file mode 100644 index 0000000000..152028cacd --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/management/scrap_manufacturing.rst @@ -0,0 +1,105 @@ +========================== +Scrap during manufacturing +========================== + +During the manufacturing process, the need to scrap manufacturing components or finished products +may arise. This can be necessary if a component or product is damaged, or unusable for any other +reason. + +By default, scrapping a component or finished product removes it from physical inventory and places +it in a virtual location titled *Virtual Locations/Scrap*. A virtual location is **not** a physical +space, but rather a designation in Odoo that is used to track items that are no longer in physical +inventory. + +Odoo *Manufacturing* allows for both components and finished products to be scrapped within a +manufacturing order. The specific type of item that can be scrapped during a manufacturing order +depends on the stage of the manufacturing process. + +.. tip:: + Scrap orders can be viewed by navigating to :menuselection:`Inventory --> Operations --> Scrap`. + Each scrap order shows the date and time the order was created, along with the product and + quantity that was scrapped. + + To view the total quantity of each item scrapped, navigate to :menuselection:`Inventory --> + Configuration --> Locations`, then remove the :guilabel:`Internal` filter from the + :guilabel:`Search...` bar to display all virtual locations. From the list, select the + :guilabel:`Virtual Locations/Scrap` location. + +Scrap manufacturing components +============================== + +To scrap components during the manufacturing process, begin by navigating to +:menuselection:`Manufacturing --> Manufacturing Orders`, then select a manufacturing order or click +:guilabel:`Create` to configure a new one. If a new manufacturing order is created, select a product +from the :guilabel:`Product` drop-down menu, then click :guilabel:`Confirm`. + +Once the manufacturing order has been confirmed, a :guilabel:`Scrap` button appears at the top of +the page. Click the button and a :guilabel:`Scrap` pop-up window appears. + +.. image:: scrap_manufacturing/scrap-button.png + :align: center + :alt: The scrap button on a manufacturing order. + +From the :guilabel:`Product` drop-down menu on the :guilabel:`Scrap` pop-up window, select the +component that is being scrapped, then enter the quantity in the :guilabel:`Quantity` field. +Finally, click :guilabel:`Done` to scrap the component. + +.. image:: scrap_manufacturing/scrap-pop-up.png + :align: center + :alt: The Scrap pop-up window. + +.. important:: + Before clicking :guilabel:`Mark As Done` on a manufacturing order, only the components of the + finished product can be scrapped, **not** the finished product itself. This is because Odoo + recognizes that the finished product cannot be scrapped before it has been manufactured. + +After scrapping a component, continue the manufacturing process using the required quantity of the +component that was scrapped. The on-hand stock count for the component that was scrapped updates to +reflect both the scrapped quantity and the quantity consumed during manufacturing. + +.. example:: + If the manufacturing of a table requires four units of a table leg, and two units of the table + leg were scrapped during the manufacturing process, the total quantity of table legs consumed + will be six: four units used to manufacture the table plus two units scrapped. + +Scrap components from tablet view +================================= + +Components can also be scrapped from the manufacturing tablet view. To do so, select the +:guilabel:`Work Orders` tab on a manufacturing order, then click the :guilabel:`📱 (tablet view)` +icon for a work order. + +.. image:: scrap_manufacturing/tablet-view-icon.png + :align: center + :alt: The tablet view icon for a work order. + +With tablet view open, click the :guilabel:`☰ (menu)` button at the top left of the screen, then +select the :guilabel:`Scrap` button on the :guilabel:`Menu` pop-up window. The :guilabel:`Scrap` +pop-up window then appears. + +.. image:: scrap_manufacturing/tablet-scrap-button.png + :align: center + :alt: The Scrap button on the Menu pop-up window of the manufacturing tablet view. + +Finally, select a component from the :guilabel:`Product` drop-down menu and enter the quantity being +scrapped in the :guilabel:`Quantity` field. Click :guilabel:`Done` to scrap the component. + +Scrap finished products +======================= + +Odoo also allows for finished products to be scrapped from a manufacturing order once the order is +completed. After clicking :guilabel:`Mark as Done`, click the :guilabel:`Scrap` button to make the +:guilabel:`Scrap` pop-up window appear. + +Since the components have been consumed to create the finished product, they will no longer appear +in the :guilabel:`Product` drop-down menu. Instead, the finished product will be available as an +option. Select the finished product and enter the quantity to be scrapped in the +:guilabel:`Quantity` field. Click :guilabel:`Done` to scrap the finished product. + +The on-hand stock count for the product that was scrapped will update to reflect both the scrapped +quantity and the quantity produced during manufacturing. + +.. example:: + If five units of a chair were manufactured, but two units were scrapped after manufacturing was + completed, then the on-hand inventory of the chair will increase by three: five units + manufactured minus two units scrapped. diff --git a/content/applications/inventory_and_mrp/manufacturing/management/scrap_manufacturing/scrap-button.png b/content/applications/inventory_and_mrp/manufacturing/management/scrap_manufacturing/scrap-button.png new file mode 100644 index 0000000000..8f2a01f8f4 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/management/scrap_manufacturing/scrap-button.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/scrap_manufacturing/scrap-pop-up.png b/content/applications/inventory_and_mrp/manufacturing/management/scrap_manufacturing/scrap-pop-up.png new file mode 100644 index 0000000000..8af64375c6 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/management/scrap_manufacturing/scrap-pop-up.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/scrap_manufacturing/tablet-scrap-button.png b/content/applications/inventory_and_mrp/manufacturing/management/scrap_manufacturing/tablet-scrap-button.png new file mode 100644 index 0000000000..e7c1db5819 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/management/scrap_manufacturing/tablet-scrap-button.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/scrap_manufacturing/tablet-view-icon.png b/content/applications/inventory_and_mrp/manufacturing/management/scrap_manufacturing/tablet-view-icon.png new file mode 100644 index 0000000000..2459f16286 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/management/scrap_manufacturing/tablet-view-icon.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/using_work_centers.rst b/content/applications/inventory_and_mrp/manufacturing/management/using_work_centers.rst index 9c6a836ba9..fb8d41ce2a 100644 --- a/content/applications/inventory_and_mrp/manufacturing/management/using_work_centers.rst +++ b/content/applications/inventory_and_mrp/manufacturing/management/using_work_centers.rst @@ -75,6 +75,8 @@ to a work center. The following information will be displayed for each piece of :guilabel:`MTBF`, :guilabel:`MTTR`, and :guilabel:`Est. Next Failure` are all calculated automatically based on past failure data, if any exists. +.. _workcenter_iot: + Integrate IoT devices --------------------- diff --git a/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off.rst b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off.rst new file mode 100644 index 0000000000..13b05d76bf --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off.rst @@ -0,0 +1,121 @@ +============================================ +Make work centers unavailable using Time Off +============================================ + +In Odoo, *work centers* are used to carry out manufacturing operations at specific locations. +However, if a work center cannot be used for some reason, work orders begin to pile up at the work +center until it is operational again. + +As a result, it is necessary to make the work center unavailable in Odoo so that the platform routes +new work orders to alternative work centers that are operational. Using Odoo *Time Off*, it is +possible to designate a work center as being unavailable for a set period of time. Doing so ensures +that manufacturing operations can continue until the impacted work center is available again. + +Configuration +============= + +Before a work center can be designated as unavailable, the Odoo platform must be properly +configured. First, it is necessary to enable :ref:`developer mode `. This allows the +:guilabel:`Time Off` smart button to appear on each work center's :guilabel:`Working Hours` pop-up +window. + +Enable developer mode by going to :menuselection:`Settings`, scrolling to the bottom of the page, +and clicking :guilabel:`Activate the developer mode` under the :guilabel:`Developer Tools` heading. + +.. image:: work_center_time_off/developer-mode-button.png + :align: center + :alt: The "Activate the developer mode" button. + +Next, install the *Time Off* app. This is the app used for assigning time off to all resources +within Odoo, including employees and work centers. Navigate to :menuselection:`Apps`, then type +`Time Off` in the :guilabel:`Search...` bar. The card for the :guilabel:`Time Off` module should be +the only one that appears on the page. Click the green :guilabel:`Install` button on the card to +install the app. + +.. image:: work_center_time_off/time-off-install-card.png + :align: center + :alt: The Time Off module installation card. + +The last step is to properly configure work centers. For this workflow, it is necessary to have at +least two work centers: one that is made unavailable and a second that receives the work orders that +the other cannot accept. If no second work center is configured, Odoo cannot route work orders away +from the unavailable work center and they will pile up in its queue. + +To create a work center, navigate to :menuselection:`Manufacturing --> Configuration --> Work +Centers --> Create`. + +Make sure that both work centers have the same equipment listed under the :guilabel:`Equipment` tab. +This ensures that operations carried out at one work center can also be performed at the other. + +.. image:: work_center_time_off/work-center-equipment-tab.png + :align: center + :alt: The equipment tab on a work center form. + +For the work center that will be made unavailable, select the second work center on the +:guilabel:`Alternative Workcenters` drop-down menu. Now, Odoo knows to send work orders to the +second work center when the first is unavailable for any reason. + +.. image:: work_center_time_off/alternative-work-center-selection.png + :align: center + :alt: A work center form configured with an alternative work center. + +Add time off for a work center +============================== + +With configuration completed, time off can now be assigned to the work center that will be made +unavailable. Begin by navigating to :menuselection:`Manufacturing --> Configuration --> Work +Centers` and selecting the affected work center. Click :guilabel:`Edit`, and then the :guilabel:`↗ +(external link)` button next to the :guilabel:`Working Hours` drop-down menu. + +.. image:: work_center_time_off/working-hours-button.png + :align: center + :alt: The Working Hours "External link" button on the work center form. + +A pop-up appears, titled :guilabel:`Open: Working Hours`. The standard working hours for the work +center are listed here, along with various other details about it. Since developer mode was enabled, +there is a :guilabel:`Time Off` button in the top right of the pop-up. Click it to be taken to the +:guilabel:`Resource Time Off` page. + +.. image:: work_center_time_off/time-off-button.png + :align: center + :alt: The Time Off button on the Working Hours pop-up. + +On this page, click :guilabel:`Create` to configure a new time-off entry. On the time-off form, note +the :guilabel:`Reason` for the work center closure (broken, maintenance, etc.), select the affected +work center as the :guilabel:`Resource`, and choose a :guilabel:`Start Date` and :guilabel:`End +Date` to specify the period during which the work center will be unavailable. Click :guilabel:`Save` +and the time off for the work center is logged in Odoo. + +.. image:: work_center_time_off/time-off-form.png + :align: center + :alt: The "Resource Time Off" form. + +Route orders to an alternative work center +========================================== + +Once a work center is within its specified time-off period, work orders sent to it can be +automatically routed to an alternative work center using the :guilabel:`Plan` button. + +Begin by creating a new manufacturing order by selecting :menuselection:`Operations --> +Manufacturing Orders --> Create`. On the manufacturing order form, specify a :guilabel:`Product` +that uses the unavailable work center for one of its operations. Click :guilabel:`Confirm` to +confirm the work order. + +On the confirmed work order, select the :guilabel:`Work Orders` tab. By default, the unavailable +work center is specified in the :guilabel:`Work Center` column. There is also a green +:guilabel:`Plan` button on the top left of the page. + +.. image:: work_center_time_off/mo-plan-button.png + :align: center + :alt: The Plan button on a manufacturing order. + +Click :guilabel:`Plan` and the work center listed under the :guilabel:`Work Orders` tab is +automatically changed to the alternative work center. + +.. image:: work_center_time_off/work-center-planning.png + :align: center + :alt: The selected work center updates automatically after clicking the Plan button. + +Once the time-off period for the unavailable work center ends, Odoo recognizes that the work center +is available again. At this point, clicking the :guilabel:`Plan` button does not route work orders +to an alternative work center unless the first one is at capacity. diff --git a/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/alternative-work-center-selection.png b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/alternative-work-center-selection.png new file mode 100644 index 0000000000..eb83866f30 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/alternative-work-center-selection.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/developer-mode-button.png b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/developer-mode-button.png new file mode 100644 index 0000000000..73c1bbd168 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/developer-mode-button.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/mo-plan-button.png b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/mo-plan-button.png new file mode 100644 index 0000000000..7eefa6a23c Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/mo-plan-button.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/time-off-button.png b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/time-off-button.png new file mode 100644 index 0000000000..e12457e89d Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/time-off-button.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/time-off-form.png b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/time-off-form.png new file mode 100644 index 0000000000..1019bbecbb Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/time-off-form.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/time-off-install-card.png b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/time-off-install-card.png new file mode 100644 index 0000000000..c638e9626e Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/time-off-install-card.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/work-center-equipment-tab.png b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/work-center-equipment-tab.png new file mode 100644 index 0000000000..a49b7338f0 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/work-center-equipment-tab.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/work-center-planning.png b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/work-center-planning.png new file mode 100644 index 0000000000..caa132fb36 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/work-center-planning.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/working-hours-button.png b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/working-hours-button.png new file mode 100644 index 0000000000..f16ac72e21 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/management/work_center_time_off/working-hours-button.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage.rst b/content/applications/inventory_and_mrp/purchase/manage_deals/manage.rst index a694f48483..8f60bc63b0 100644 --- a/content/applications/inventory_and_mrp/purchase/manage_deals/manage.rst +++ b/content/applications/inventory_and_mrp/purchase/manage_deals/manage.rst @@ -2,226 +2,251 @@ Manage vendor bills =================== -The **Purchase** application allows you to manage your purchase orders, -incoming products, and vendor bills all seamlessly in one place. +.. _inventory/purchase/manage_deals/manage: -If you want to set up a vendor bill control process, the first thing you -need to do is to have purchase data in Odoo. Knowing what has been -purchased and received is the first step towards understanding your -purchase management processes. +A *vendor bill* is an invoice received for products and/or services that a company purchases from a +vendor. Vendor bills record payables as they arrive from vendors, and can include amounts owed for +the goods and/or services purchased, sales taxes, freight and delivery charges, and more. -Here is the standard work flow in Odoo: +In Odoo, a vendor bill can be created at different points in the purchasing process, depending on +the *bill control* policy chosen in the *Purchase* app settings. -1. You begin with a **Request for Quotation (RFQ)** to send out to your - vendor(s). +Bill control policies +===================== -2. Once the vendor has accepted the RFQ, confirm the RFQ into a - **Purchase Order (PO)**. +To view and edit the default bill control policy and make changes to it, go to +:menuselection:`Purchase app --> Configuration --> Settings`, and scroll down to the +:guilabel:`Invoicing` section. -3. Confirming the PO generates an **Incoming Shipment** if you purchased - any stockable products. +Here, there are two :guilabel:`Bill Control` policy options: :guilabel:`Ordered quantities` and +:guilabel:`Received quantities`. After a policy is selected, click :guilabel:`Save` to save changes. -4. Upon receiving a **Vendor Bill** from your Vendor, validate the bill - with products received in the previous step to ensure accuracy. +.. image:: manage/manage-configuration-settings.png + :align: center + :alt: Bill control policies in purchase app settings. -This process may be done by three different people within the company, -or only one. +The policy selected will be the default for any new product created. The definition of each policy +is as follows: -Configuration -============= +- :guilabel:`Ordered quantities`: creates a vendor bill as soon as a purchase order is confirmed. + The products and quantities in the purchase order are used to generate a draft bill. +- :guilabel:`Received quantities`: a bill is only created **after** part of the total order has been + received. The products and quantities **received** are used to generate a draft bill. -Installing the Purchase and Inventory applications --------------------------------------------------- +.. tip:: + If a product needs a different control policy, the default bill control policy can be overridden + by going to the :guilabel:`Purchase` tab in a product's template, and modifying its + :guilabel:`Control Policy` field. -From the **Apps** application, search for the **Purchase** module and -install it. Due to certain dependencies, installing Purchase will -automatically install the **Inventory** and **Accounting** applications. +.. image:: manage/manage-product-form.png + :align: center + :alt: Control policy field on product form. -Creating products ------------------ +3-way matching +-------------- -Creating products in Odoo is essential for quick and efficient -purchasing within Odoo. Simply navigate to the Products submenu under -Purchase and click create. +*3-way matching* ensures vendor bills are only paid once some (or all) of the products included in +the purchase order have actually been received. -.. image:: manage/manage01.png - :align: center +To activate it, go to :menuselection:`Purchase app --> Configuration --> Settings`, and scroll down +to the :guilabel:`Invoicing` section. Then, check the box next to :guilabel:`3-way matching: +purchases, receptions, and bills`, and click :guilabel:`Save` to save changes. -When creating the product, pay attention to the **Product Type** field, -since it is important: +.. important:: + :guilabel:`3-way matching` is **only** intended to work with the :guilabel:`Bill Control` policy + set to :guilabel:`Received quantities`. -- Products that are set as **Stockable or Consumable** will allow you - to keep track of their inventory levels. These options imply - stock management and will allow for receiving these kinds of - products. + .. image:: manage/manage-three-way-matching.png + :align: center + :alt: Activated three-way matching feature in purchase settings. -- Conversely, products that are set as a **Service or Digital Product** - will not imply stock management, simply due to the fact that - there is no inventory to manage. You will not be able to receive - products under either of these designations. +Create and manage vendor bills on receipts +========================================== -.. tip:: - It is recommended that you create a **Miscellaneous** product for all purchases - that occur infrequently and do not require inventory valuation or management. - If you create such a product, it is recommended to set the product type to **Service**. +When products are received into a company's warehouse, receipts are created. Once the company +processes the received quantities, they can choose to create a vendor bill directly from the +warehouse receipt form. Depending on the bill control policy chosen in the settings, vendor bill +creation is completed at different steps of the procurement process. -Managing your Vendor Bills -========================== +With the bill control policy set to ordered quantities +------------------------------------------------------ -Purchasing products or services -------------------------------- +To create and manage vendor bills on receipts using the *ordered quantities* bill control policy, +first go to :menuselection:`Purchase app --> Configuration --> Settings`, scroll down to the +:guilabel:`Invoicing` section, and select :guilabel:`Ordered quantities` under :guilabel:`Bill +Control`. Then, click :guilabel:`Save` to save changes. -From the purchase application, you can create a purchase order with as -many products as you need. If the vendor sends you a confirmation or -quotation for an order, you may record the order reference number in the -**Vendor Reference** field. This will enable you to easily match the PO -with the the vendor bill later (as the vendor bill will probably include -the Vendor Reference) +Next, go to the :menuselection:`Purchase` app, and click :guilabel:`Create` to create a new request +for quotation (RFQ). Doing so reveals a blank :abbr:`RFQ (request for quotation)` detail form. -.. image:: manage/manage02.png - :align: center +On the blank detail form, add a vendor to the :abbr:`RFQ (request for quotation)` in the +:guilabel:`Vendor` field, and add products to the :guilabel:`Product` lines by clicking +:guilabel:`Add a line`. -Validate the purchase order and receive the products from the Inventory -application. +Then, confirm the :abbr:`RFQ (request for quotation)` by clicking the :guilabel:`Confirm Order` +button above the detail form. Doing so turns the :abbr:`RFQ (request for quotation)` into a purchase +order. -Receiving Products ------------------- +Then, click the :guilabel:`Create Bill` button to create a vendor bill for the purchase order. -If you purchased any stockable products that you manage the inventory -of, you will need to receive the products from the Inventory application -after you confirm a purchase order. From the **Inventory dashboard**, you -should see a button linking you directly to the transfer of products. -This button is outlined in red below: +Clicking the :guilabel:`Create Bill` button reveals the :guilabel:`Draft Bill` page for the purchase +order. -.. image:: manage/manage03.png - :align: center +On the :guilabel:`Draft Bill`, click the :guilabel:`Edit` button to modify the bill, and add a bill +date in the :guilabel:`Bill Date` field. If needed, add additional products to the +:guilabel:`Product` lines by clicking :guilabel:`Add a line` in the :guilabel:`Invoice Lines` tab. + +Next, confirm the bill by clicking the :guilabel:`Confirm` button on the :guilabel:`Draft Bill` +page. + +.. tip:: + Since the bill control policy is set to *ordered quantities*, the draft bill can be confirmed as + soon as it is created, before any products have been received. -Navigating this route will take you to a list of all orders waiting to -be received. +On the new :guilabel:`Vendor Bill`, add a :guilabel:`Bill Reference` number, which can be used to +match the bill with additional documents (such as the :abbr:`PO (purchase order)`). Then, click +:menuselection:`Confirm --> Register Payment`. Doing so causes a pop-up to appear, wherein a payment +:guilabel:`Journal` can be chosen; a :guilabel:`Payment Method` selected; and a :guilabel:`Recipient +Bank Account` can be selected from a drop-down menu. -.. image:: manage/manage04.png - :align: center +Additionally, the bill :guilabel:`Amount`, :guilabel:`Payment Date`, and :guilabel:`Memo` +(:dfn:`Reference Number`) can be changed from this pop-up. Once ready, click :guilabel:`Create +Payment` to finish creating the :guilabel:`Vendor Bill`. Doing so causes a green :guilabel:`In +Payment` banner to display on the :abbr:`RFQ (request for quotation)` form. -If you have a lot of awaiting orders, apply a filter using the search -bar in the upper right. With this search bar, you may filter based on -the vendor (partner), the product, or the source document (also known as -the reference of your purchase order). You can also -group the orders by different criteria under **Group By**. Selecting an -item from this list will open the following screen where you then will -receive the products. +.. image:: manage/manage-draft-vendor-bill.png + :align: center + :alt: Vendor bill form for ordered quantities control policy. -.. image:: manage/manage05.png - :align: center +.. note:: + Each vendor bill provides the option to either :guilabel:`Add Credit Note` or :guilabel:`Add + Debit Note`. A *credit note* is typically issued when a vendor or supplier of goods get some + quantity of products back from the customer to whom they were sold, while *debit notes* are + reserved for goods returned from the customer/buyer to the vendor or supplier. -Purchasing service products does not trigger a delivery order. +With the bill control policy set to received quantities +------------------------------------------------------- -Managing Vendor Bills ---------------------- +.. warning:: + If the creation of a vendor bill is attempted without receiving any quantities of a product + (while using the *received quantities* bill control policy), an error message appears, and + settings must be changed before proceeding. -When you receive a vendor bill for a previous purchase, be sure to -record it in the Purchases application under the **Control Menu**. You -need to create a new vendor bill even if you already registered a -purchase order. +To create and manage vendor bills on receipts using the *received quantities* bill control policy, +first go to :menuselection:`Purchase app --> Configuration --> Settings`, scroll down to the +:guilabel:`Invoicing` section, and select :guilabel:`Received quantities` under :guilabel:`Bill +Control`. Then, click :guilabel:`Save` to save changes. -.. image:: manage/manage06.png - :align: center +Next, go to the :menuselection:`Purchase` app, and click :guilabel:`Create` to create a new +:abbr:`RFQ (request for quotation)`. Doing so reveals a blank :abbr:`RFQ (request for quotation)` +detail form. -The first thing you will need to do upon creating a vendor bill is to -select the appropriate vendor, since doing so will also pull up any associated -accounting or pricelist information. From there, you can choose to -specify one or multiple Purchase Orders to populate the Vendor Bill -with. When you select a Purchase Order from the list, Odoo will pull any -uninvoiced products associated to that Purchase Order and automatically -populate that information below. If you are having a hard time finding -the appropriate vendor bill, you may search through the list by -inputting the vendor reference number or your internal purchase order -number. +On the blank detail form, add a vendor to the :abbr:`RFQ (request for quotation)` in the +:guilabel:`Vendor` field, and add products to the :guilabel:`Product` lines by clicking +:guilabel:`Add a line`. -.. image:: manage/manage07.png - :align: center +Then, confirm the :abbr:`RFQ (request for quotation)` by clicking the :guilabel:`Confirm Order` +button above the detail form. Doing so turns the :abbr:`RFQ (request for quotation)` into a purchase +order. -While the invoice is in a draft state, you can make any modifications you -need (i.e. remove or add product lines, modify quantities, and change -prices). +Finally, click the :guilabel:`Create Bill` button to create a bill for the purchase order. .. note:: - Your vendor may send you several bills for the same Purchase Order if: + Clicking :guilabel:`Create Bill` before any products have been received will cause a + :guilabel:`User Error` pop-up to appear. The :guilabel:`Purchase Order` requires the receipt of + at least partial quantity of the items included on the order to create a vendor bill. + +.. image:: manage/manage-user-error-popup.png + :align: center + :alt: User error pop-up for received quantities control policy. - #. Your vendor is in back-order and is sending you invoices as they ship the products. - #. Your vendor is sending you a partial bill or asking for a deposit. +Next, click the :guilabel:`Receipt` smart button to view the warehouse receipt form. -Every time you record a new vendor bill, Odoo will automatically -populate the product quantities based on what has been received from the -vendor. If this value is showing a zero, this means that you have not -yet received this product and simply serves as a reminder that the -product is not in hand and you may need to inquire further into this. At -any point in time, before you validate the Vendor Bill, you may override -this zero quantity. +On the warehouse receipt form, click :menuselection:`Validate --> Apply` to mark the +:guilabel:`Done` quantities. Then, navigate back to the :menuselection:`Purchase Order` (via the +breadcrumbs), and click the :guilabel:`Create Bill` button on the purchase order form. -Vendor Bill Matching -==================== +Doing so reveals the :guilabel:`Draft Bill` for the purchase order. On the :guilabel:`Draft Bill`, +click the :guilabel:`Edit` button, and add a :guilabel:`Bill Date`. If needed, add additional +products to the :guilabel:`Product` lines by clicking :guilabel:`Add a line`. -What to do if your vendor bill does not match what you received ---------------------------------------------------------------- +Next, click the :guilabel:`Confirm` button to confirm the :guilabel:`Draft Bill`. -If the bill you receive from the vendor has quantities that do not match -the quantities automatically populated by Odoo, this could be due to -several reasons: +.. note:: + Since the bill control policy is set to *received quantities*, the draft bill can **only** be + confirmed when at least some of the quantities are received. -- The vendor is incorrectly charging you for products and/or services - that you have not ordered. +On the new :guilabel:`Vendor Bill`, add a :guilabel:`Bill Reference` number, which can be used to +match the bill with additional documents (such as the :abbr:`PO (purchase order)`). Then, click +:menuselection:`Confirm --> Register Payment`. Doing so causes a pop-up to appear, wherein a payment +:guilabel:`Journal` can be chosen; a :guilabel:`Payment Method` selected; and a :guilabel:`Recipient +Bank Account` can be selected from a drop-down menu. -- The vendor is billing you for products that you might not have - received yet, as the invoicing control may be based on ordered or - received quantities. +Additionally, the bill :guilabel:`Amount`, :guilabel:`Payment Date`, and :guilabel:`Memo` +(:dfn:`Reference Number`) can be changed from this pop-up. Once ready, click :guilabel:`Create +Payment` to finish creating the vendor bill. Doing so causes a green **In Payment** banner to +display on the :abbr:`RFQ (request for quotation)` form. -- The vendor did not bill you for previously purchased products. +Create and manage vendor bills in Accounting +============================================ -In these instances it is recommended that you verify that the bill, and -any associated purchase order to the vendor, are accurate and that you -understand what you have ordered and what you have already received. +Vendor bills can also be created directly from the *Accounting* app, **without** having to create a +purchase order first. To do this, go to :menuselection:`Accounting app --> Vendors --> Bills`, and +click :guilabel:`Create`. Doing so reveals a blank vendor bill detail form. -If you are unable to find a purchase order related to a vendor bill, -this could be due to one of a few reasons: +On this blank vendor bill detail form, add a vendor in the :guilabel:`Vendor` field, and add +products to the :guilabel:`Product` lines (under the :guilabel:`Invoice Lines` tab), by clicking +:guilabel:`Add a line`. Then, add a bill date in the :guilabel:`Bill Date` field, and any other +necessary information. Finally, click :guilabel:`Confirm` to confirm the bill. -- The vendor has already invoiced you for this purchase order; - therefore it is not going to appear anywhere in the selection. +From here, click the :guilabel:`Journal Items` tab to view (or change) the :guilabel:`Account` +journals that were populated based on the configuration on the corresponding :guilabel:`Vendor` and +:guilabel:`Product` forms. -- Someone in the company forgot to record a purchase order for this - vendor. +Then, click :guilabel:`Add Credit Note` or :guilabel:`Add Debit Note` to add credit or debit notes +to the bill. Or, add a :guilabel:`Bill Reference` number (while in :guilabel:`Edit` mode). -- The vendor is charging you for something you did not order. +Then, when ready, click :menuselection:`Register Payment --> Create Payment` to complete the +:guilabel:`Vendor Bill`. +.. tip:: + To tie the draft bill to an existing purchase order, click the drop-down menu next to + :guilabel:`Auto-Complete`, and select a :abbr:`PO (purchase order)` from the menu. The bill will + auto-populate with the information from the :abbr:`PO (purchase order)`. + .. image:: manage/manage-auto-complete.png + :align: center + :alt: Auto-complete drop-down list on draft vendor bill. -How product quantities are managed ----------------------------------- +Batch billing +============= -By default, services are managed based on ordered quantities, while -stockables and consumables are managed based on received quantities. +Vendor bills can be processed and managed in batches in the *Accounting* app. -If you need to manage products based on ordered quantities over received -quantities, you will need to belong to the group **Purchase Manager**. -Ask your system administrator to enable these access on :menuselection:`Settings ---> Users --> Users --> Access Rights`. Once you belong to the correct group, -select the product(s) you wish to modify, and you should see a new field appear, -labeled **Control Purchase Bills**. +To do this, go to :menuselection:`Accounting app --> Vendors --> Bills`. Then, click the +:guilabel:`checkbox` at the top left of the page, beside the :guilabel:`Number` column, under the +:guilabel:`Create` button. This selects all existing vendor bills with a :guilabel:`Posted` or +:guilabel:`Draft` :guilabel:`Status`. -.. image:: manage/manage08.png - :align: center +From here, click the :guilabel:`Action` gear icon to export, delete, or send & print the bills; +click the :guilabel:`Print` icon to print the invoices or bills; or click :guilabel:`Register +Payment` to create and process payments for multiple vendor bills at once. -You can then change the default management method for the selected -product to be based on either: +When :guilabel:`Register Payment` is selected, a pop-up appears. In this pop-up window, select the +appropriate journal in the :guilabel:`Journal` field, choose a payment date in the +:guilabel:`Payment Date` field, and choose a :guilabel:`Payment Method`. There is also the option to +:guilabel:`Group Payments` on this pop-up, as well. -- Ordered quantities +When ready, click the :guilabel:`Create Payment` button, which creates a list of journal entries on +a separate page. This list of journal entries are all tied to their appropriate vendor bills. -- or Received quantities +.. image:: manage/manage-batch-billing.png + :align: center + :alt: Batch billing register payment pop-up. -Batch Billing -------------- +.. note:: + The :guilabel:`Register Payment` option for vendor bills in batches will only work for journal + entries whose :guilabel:`Status` is set to :guilabel:`Posted`. -When creating a vendor bill and selecting the appropriate purchase -order, you may continue to select additional purchase orders. Odoo -will add the additional line items from the purchase orders you select. If you -have not deleted the previous line items from the first purchase order, -the bill will be linked to all the appropriate purchase orders. +.. seealso:: + :doc:`/applications/inventory_and_mrp/purchase/manage_deals/control_bills` diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-auto-complete.png b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-auto-complete.png new file mode 100644 index 0000000000..1bac74738b Binary files /dev/null and b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-auto-complete.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-batch-billing.png b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-batch-billing.png new file mode 100644 index 0000000000..88c6874d83 Binary files /dev/null and b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-batch-billing.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-configuration-settings.png b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-configuration-settings.png new file mode 100644 index 0000000000..ab0546a66b Binary files /dev/null and b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-configuration-settings.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-draft-vendor-bill.png b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-draft-vendor-bill.png new file mode 100644 index 0000000000..46cd68d3a1 Binary files /dev/null and b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-draft-vendor-bill.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-product-form.png b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-product-form.png new file mode 100644 index 0000000000..408e9f1042 Binary files /dev/null and b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-product-form.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-three-way-matching.png b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-three-way-matching.png new file mode 100644 index 0000000000..87c2077659 Binary files /dev/null and b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-three-way-matching.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-user-error-popup.png b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-user-error-popup.png new file mode 100644 index 0000000000..452613455b Binary files /dev/null and b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-user-error-popup.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage01.png b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage01.png deleted file mode 100644 index f07620b91c..0000000000 Binary files a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage01.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage02.png b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage02.png deleted file mode 100644 index d4e2279f7f..0000000000 Binary files a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage02.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage03.png b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage03.png deleted file mode 100644 index 8f24389a8e..0000000000 Binary files a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage03.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage04.png b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage04.png deleted file mode 100644 index f06688a81a..0000000000 Binary files a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage04.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage05.png b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage05.png deleted file mode 100644 index 5d4beab5a1..0000000000 Binary files a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage05.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage06.png b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage06.png deleted file mode 100644 index 9acc678f30..0000000000 Binary files a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage06.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage07.png b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage07.png deleted file mode 100644 index eb3aa8d71c..0000000000 Binary files a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage07.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage08.png b/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage08.png deleted file mode 100644 index 32ae048e23..0000000000 Binary files a/content/applications/inventory_and_mrp/purchase/manage_deals/manage/manage08.png and /dev/null differ diff --git a/content/applications/marketing.rst b/content/applications/marketing.rst index 1c9c01802d..a988820fde 100644 --- a/content/applications/marketing.rst +++ b/content/applications/marketing.rst @@ -7,6 +7,7 @@ Marketing .. toctree:: + marketing/email_marketing marketing/marketing_automation marketing/sms_marketing marketing/events diff --git a/content/applications/marketing/email_marketing.rst b/content/applications/marketing/email_marketing.rst new file mode 100644 index 0000000000..170bdc0c22 --- /dev/null +++ b/content/applications/marketing/email_marketing.rst @@ -0,0 +1,436 @@ +:show-content: +:show-toc: + +=============== +Email marketing +=============== + +Emails are an effective, fully-customizable form of communication that are able to reach any target +audience - large or small. The success of an email is easily measurable, especially when a creative +call-to-action is involved. + +Odoo *Email Marketing* provides professional-grade email design tools, templates, and features, +designed to simplify the otherwise complex process required to create engaging emails, build +successful campaigns, and track their overall effectiveness in a single application. + +.. seealso:: + - :doc:`/applications/marketing/email_marketing/mailing_lists` + - :doc:`/applications/marketing/email_marketing/unsubscriptions` + +Email marketing dashboard +========================= + +To get started, click on the :menuselection:`Email Marketing` app icon, located on the main Odoo +dashboard, which leads to the main :guilabel:`Email Marketing` dashboard (in the default kanban +view). + +To see all the mailings in the database, remove the default :guilabel:`My Mailings` filter from the +search bar. + +.. image:: email_marketing/dashboard.png + :align: center + :alt: View of the main dashboard of the Odoo Email Marketing application. + +.. note:: + In the search bar, by default, the filter: :guilabel:`My Mailings` is present. That means the + only information being seen (at that time) on the :guilabel:`Email Marketing` dashboard are + emails that the current user has created, sent, or is responsible for. + + This filter can be removed by clicking the :guilabel:`X` next to :guilabel:`My Mailings` in the + search bar. Doing so, reveals all the information for every email in the database. + +Default kanban view and stages +------------------------------ + +The four kanban columns each represent the various stages of emails that have been built or sent +within the *Email Marketing* application. + +The stages are: :guilabel:`Draft`, :guilabel:`In Queue`, :guilabel:`Sending`, :guilabel:`Sent`. + +- :guilabel:`Draft`: means the email is still being written/created. +- :guilabel:`In Queue`: means the email is scheduled, and sent at a later date. +- :guilabel:`Sending`: means the email is currently being sent to its recipients. +- :guilabel:`Sent`: means the email has already been sent to its recipients. + +In each stage, there are drag-and-drop cards representing the email campaigns that have been +created, and the stage they are in represents the current status of that mailing. + +Each mailing block on the :guilabel:`Email Marketing` dashboard provides key information related to +that specific email. + +When the cursor hovers over the upper-right corner of an email campaign card, three vertical dots +(:guilabel:`⋮`) appear. When clicked, a mini drop-down menu reveals the option to color-code the +email :guilabel:`Delete` the email altogether, or :guilabel:`Archive` the message for potential +future use. + +.. image:: email_marketing/three-dot-dropdown.png + :align: center + :alt: View of the three-dot drop-down menu on the Odoo Email Marketing dashboard. + +In the upper-right corner of the main :guilabel:`Email Marketing` dashboard, there are other view +options to choose from: :guilabel:`List` and :guilabel:`Graph`. + +List view +--------- + +The :guilabel:`List` view (represented by the :guilabel:`☰ (three vertical lines)` icon) provides +the same key information, but in a classic list format. + +.. image:: email_marketing/list-view.png + :align: center + :alt: How the List view appears in the Odoo Email Marketing application. + +Graph view +---------- + +The :guilabel:`Graph` view (represented by the :guilabel:`📊 (bar graph)` icon) provides the same +key information, but in a variety of customizable graph (and chart) layouts. + +.. image:: email_marketing/graph-view.png + :align: center + :alt: How the Graph view appears in the Odoo Email Marketing application. + +In the upper-left corner, there is a :guilabel:`Measures` menu, providing even more filter options +to further customize the graph views. + +Those :guilabel:`Measures` options are: :guilabel:`A/B Testing percentage`, :guilabel:`Color Index`, +and :guilabel:`Count` (which is selected, by default). + +Filters, Group By, and Favorites search options +----------------------------------------------- + +Regardless of the view chosen for the :guilabel:`Email Marketing` dashboard, the +:guilabel:`Filters`, :guilabel:`Group by`, and :guilabel:`Favorites` options are always available. + +These options provide various ways to specify and organize the information seen on the +:guilabel:`Email Marketing` dashboard. + +.. tabs:: + + .. tab:: Filters + + This drop-down menu provides different ways to filter email campaigns on the dashboard. The + options are: :guilabel:`My Mailings`, :guilabel:`Sent Date`, :guilabel:`Archived`, and + :guilabel:`Add Custom Filter`. If :guilabel:`Add Custom Filter` is selected, Odoo reveals an + additional drop-down menu, with three customizable fields to fill in, in order to retrieve + results that fit more specific criteria. + + .. image:: email_marketing/filters-dropdown.png + :alt: View of filters drop-down menu options on the Odoo Email Marketing dashboard. + + .. tab:: Group By + + This drop-down menu provides different ways to filter email information on the dashboard. The + options are: :guilabel:`My Mailings`, :guilabel:`Sent Date`, :guilabel:`Archived`, and + :guilabel:`Add Custom Filter`. If :guilabel:`Add Custom Filter` is selected, Odoo reveals an + additional drop-down menu, with three customizable fields to fill in, and Odoo reveals the + appropriate results that fit that specific criteria. + + .. image:: email_marketing/group-by-dropdown.png + :alt: View of the Group By drop-down menu on the Odoo Email Marketing application. + + .. tab:: Favorites + + This drop-down menu provides different ways to incorporate past search filters and other + record-related options to customize the dashboard. The options are: :guilabel:`Save current + search`, :guilabel:`Import records`, :guilabel:`Add to my dashboard`, and :guilabel:`Add to + Google Spreadsheet`. + + .. image:: email_marketing/favorites-dropdown.png + :alt: View of the Favorites drop-down menu on the Odoo Email Marketing application. + +Settings +======== + +To view (and modify) the *Email Marketing* settings, navigate to :menuselection:`Email Marketing +application --> Configuration --> Settings`. + +.. image:: email_marketing/settings-page.png + :align: center + :alt: View of the Settings page in the Odoo Email Marketing application. + +On this :guilabel:`Settings` page, there are three features available. The features are: +:guilabel:`Mailing Campaigns`, :guilabel:`Blacklist Option when Unsubscribing`, and +:guilabel:`Dedicated Server`. + +- :guilabel:`Mailing Campaigns`: enables the option to manage mass mailing campaigns. +- :guilabel:`Blacklist Option when Unsubscribing`: allows recipients to blacklist themselves from + future mailings during the unsubscribing process. +- :guilabel:`Dedicated Server`: provides the option to utilize a separate, dedicated server for + mailings. When enabled, Odoo reveals a new field (and link), in which the specific server + configurations must be entered, in order for it to connect properly to Odoo. + +Create an email +=============== + +To create an email, open the :menuselection:`Email Marketing` application, and click the +:guilabel:`Create` button in the upper-left corner. + +Clicking :guilabel:`Create` reveals a blank email detail form. + +.. image:: email_marketing/blank-email-detail-form.png + :align: center + :alt: View of a blank email detail form in Odoo Email Marketing application. + +First, enter a :guilabel:`Subject` to the email. The :guilabel:`Subject` is visible in the +recipients' inbox, allowing them to get quickly see what the message is about. + +.. note:: + The :guilabel:`Subject` field is mandatory. An email can not be sent without a + :guilabel:`Subject`. + +.. tip:: + The :guilabel:`☺ (smiley face)` icon at the end of the :guilabel:`Subject` field (and + :guilabel:`Preview Text` field) represents emojis. Click that :guilabel:`☺ (smiley face)` icon to + reveal a menu of emojis that can be used in either field. + +Next, there is the option to enter some :guilabel:`Preview Text`. This text is a catchy preview +sentence that encourages recipients to open the message. In most inboxes, this is displayed next to +the subject. + +.. tip:: + Keep the :guilabel:`Preview Text` empty to show the first characters of the email content, + instead. + +Recipients +---------- + +After that, it's time to choose the recipients of this email, which can be completed in the +:guilabel:`Recipients` field. + +.. image:: email_marketing/recipients-dropdown.png + :align: center + :alt: View of recipients drop-down menu in the Odoo Email Marketing application. + +The default option is :guilabel:`Mailing List`. If :guilabel:`Mailing List` option is selected, a +specific :guilabel:`Mailing List` needs to be chosen from the adjacent :guilabel:`Select mailing +lists` field drop-down menu. + +Then, Odoo will only send this email to contacts on that specific mailing list. + +.. seealso:: + :doc:`/applications/marketing/email_marketing/mailing_lists` + +When the :guilabel:`Recipients` field is clicked, a drop-down menu of other options is revealed. +Each option provides different ways Odoo can create a target audience for the email. + +Those options (excluding the default :guilabel:`Mailing List`) provide the option to create a more +specified recipient filter, in an equation-like format. + +The :guilabel:`Recipients` field options are as follows: + +- :guilabel:`Applicant`: filter focuses on specific job applicants in the database. +- :guilabel:`Contact`: filter focuses on specific contacts in the database. +- :guilabel:`Event Registration`: filter focuses on people in the database who purchased event + registrations. +- :guilabel:`Event Track`: filter focuses on people in the database who hosted a specific talk + (track) at an event. +- :guilabel:`Lead/Opportunity`: filter focuses on leads or opportunities in the database. +- :guilabel:`Mailing Contact`: filter focuses on specific mailing contacts in the database. +- :guilabel:`Sales Order`: filter focuses on a specific sales orders in the database. + +If the specified recipient fields don't automatically reveal themselves, simply click the +:guilabel:`Add Filter` button beneath the :guilabel:`Recipients` field, and Odoo reveals the +necessary equation fields to further drill down the target recipients for this mailing. + +Add a recipient filter +---------------------- + +To add a more specified recipient filter, select any recipient option (other than :guilabel:`Mailing +List`), and clicking :guilabel:`Add Filter`, if needed, to reveal three fields, formatted like an +equation. + +To reveal the sub-menu options, click each field, and make the desired selections, until the +preferred configuration has been achieved. The number of :guilabel:`Records` that match the rule(s) +are indicated to the right of the :guilabel:`Recipients` field, in green. + +.. image:: email_marketing/add-filter-button.png + :align: center + :alt: View of how recipient filters can be customized in Odoo Email Marketing. + +.. note:: + Some sub-menu options in the first rule field allow for a second choice to provide even more + specificity. + +To the right of each rule, are :guilabel:`× (Delete node)`, :guilabel:`+ (Add node)`, and +:guilabel:`⋯ (Add branch)` icons. + +The :guilabel:`× (Delete node)` icon deletes a specific node (line) of the rule. The :guilabel:`+ +(Add node)` icon adds a node (line) to the rule. And, the :guilabel:`⋯ (Add branch)` icon adds a +branch to the node. A branch means two additional, indented sub-nodes are added to the rule, +providing even more specificity to the line above it. + +Mail body tab +------------- + +At the bottom of the email form are two tabs: :guilabel:`Mail Body` and :guilabel:`Settings`. Let's +focus on :guilabel:`Mail Body` tab first. + +In the :guilabel:`Mail Body` tab, there are a number of pre-configured message templates to choose +from. Select the desired template, and modify every element of its design details with Odoo's +drag-and-drop building blocks, located on the right sidebar. Each building block provides unique +features and professional design elements. + +.. image:: email_marketing/mail-blocks.png + :align: center + :alt: View of the building blocks used to create mailings in Odoo Email Marketing application. + +.. tip:: + To build an email from scratch, select the :guilabel:`Plain Text` template, and Odoo provides a + blank email canvas, which can be customized in a number of ways - either by using the front-end + rich text editor that accepts slash (:guilabel:`/`) commands, or with the XML code editor when + :ref:`Developer Mode (debug mode) ` is engaged, and the :guilabel:`` icon is + clicked. + +Settings tab +------------ + +To the right of the :guilabel:`Mail Body` tab is the :guilabel:`Settings` tab. + +.. note:: + The options available in the :guilabel:`Settings` tab will be different, depending on if the + :guilabel:`Mailing Campaigns` feature is activated in the :guilabel:`Settings` page of the + :menuselection:`Email Marketing` application (:menuselection:`Email Marketing --> Configuration + --> Settings`). + +Without the :guilabel:`Mailing Campaigns` feature activated, the :guilabel:`Settings` tab on the +email detail form looks like this: + +.. image:: email_marketing/settings-without-features.png + :align: center + :alt: View of settings tab in Odoo Email Marketing app, without settings activated. + +- :guilabel:`Responsible`: choose an employee (in the database) to be responsible for this + particular email. +- :guilabel:`Send From`: designate an email alias that'll display as the sender of this particular + email. +- :guilabel:`Reply To`: designate an email alias to whom all the replies to this particular email + will be sent. +- :guilabel:`Attachments`: if any specific documents are required (or helpful) for this event + invite, they can be sent along with this email, by clicking :guilabel:`ATTACH A FILE`, and adding + the appropriate document(s). + +When the :guilabel:`Mailing Campaigns` feature *is* activated, additional :guilabel:`Marketing` +options appear in the :guilabel:`Settings` tab, which look like this: + +.. image:: email_marketing/settings-tab-with-settings.png + :align: center + :alt: View of settings tab in Odoo Email Marketing when settings are activated. + +The additional features are: :guilabel:`Mailing Campaign`, :guilabel:`Allow A/B Testing`, and +:guilabel:`A/B Testing percentage`. + +Mailing campaigns +================= + +The :guilabel:`Mailing Campaign` field provides the option to add this particular email to a +previously-made email campaign in the database. Click the empty field to reveal a drop-down menu +containing all previously-made mailing campaigns in the database. + +.. image:: email_marketing/mailing-campaign-dropdown.png + :align: center + :alt: View of a mailing campaign drop-down menu in Odoo Email Marketing application. + +If the desired campaign isn't available in the initial drop-down menu, select :guilabel:`Search +More` to reveal a complete list of all mailing campaigns in the database. Or, type the name of the +desired mailing campaign in the :guilabel:`Mailing Campaign` field, until Odoo reveals the desired +campaign in the drop-down menu. Then, select the desired campaign. + +Create new mailing campaign (from Settings tab) +----------------------------------------------- + +To create a new campaign from this :guilabel:`Mailing Campaign` field, start typing the name of this +new campaign, and select :guilabel:`Create [Campaign Name]` or :guilabel:`Create and Edit...`. + +Click :guilabel:`Create` to add this new mailing campaign to the database, and modify its settings +in the future. And click :guilabel:`Create and Edit...` to add this new mailing campaign to the +database, and Odoo reveals a pop-up window. + +.. image:: email_marketing/mailing-campaign-popup.png + :align: center + :alt: View of the email mailing campaign pop-up window in Odoo Email Marketing application. + +Here, the new mailing campaign can be further customized. Adjust the :guilabel:`Campaign Name`, +assign a :guilabel:`Responsible`, and add :guilabel:`Tags`. + +The top row of the :guilabel:`Create: Mailing Campaign` pop-up window is filled with analytical +smart buttons. Each of which displays various metrics related to the campaign. When clicked, Odoo +reveals a separate, more detailed page with even more in-depth statistics. + +The option to instantly a new communication from this pop-up window is available in the upper-left +corner. The adjustable status bar is located in the upper-right. + +When all modifications are ready to be finalized, click :guilabel:`Save`. To delete the entire +campaign, click :guilabel:`Discard`. + +Create new mailing campaign (from Campaigns page) +------------------------------------------------- + +When the :guilabel:`Mailing Campaigns` feature is activated, a new :guilabel:`Campaigns` option +appears in the header of the *Email Marketing* application. Campaigns can also be created on this +:guilabel:`Campaigns` page in the *Email Marketing* app. + +To do that, navigate to :menuselection:`Email Marketing app --> Campaigns --> Create`. When that's +clicked, a pop-up window appears, in which the :guilabel:`Campaign Name`, :guilabel:`Responsible`, +and :guilabel:`Tags` can be added directly on the :guilabel:`Campaigns` dashboard. + +.. image:: email_marketing/campaigns-page-popup.png + :align: center + :alt: View of the campaign pop-up window in Odoo Email Marketing. + +Click :guilabel:`Add` to add the campaign to the database, and freely edit it later on. Or, click +:guilabel:`Edit` and Odoo reveals the campaign template form on a separate page, providing the +opportunity to further edit the campaign, send communications related to the campaign, and analyze +various metrics related to the campaign, via the smart buttons at the top of the form. + +A/B testing +=========== + +Back in the :guilabel:`Settings` tab of the mailing, if the :guilabel:`Allow A/B Testing` box is +checked, recipients are only be mailed to once. This allows different mailings to be sent to +randomly selected recipients. This tests the overall effectiveness of the mailing, and eliminates +the need for duplicate messages. + +The :guilabel:`A/B Testing percentage` field represents the percentage of contacts in the database +that this message will be mailed to, as a part of the :guilabel:`A/B Testing`. Enter a number +between `1-100`. The recipients are randomly chosen. + +Send, schedule, or test +======================= + +After finalizing the mailing, Odoo provides the following options in the upper-left corner of the +email template page. Those options are: :guilabel:`Send`, :guilabel:`Schedule`, and +:guilabel:`Test`. + +While in :guilabel:`Edit` mode, there are also buttons to :guilabel:`Save` or :guilabel:`Discard` +the mailing, as well. + +- :guilabel:`Send` - Click to have Odoo send the email to the desired recipients. When Odoo has sent + the mailing, the status changes to *Sent*. +- :guilabel:`Schedule` - Click to reveal a pop-up window, in which a future date-time is chosen. + Odoo sends the mailing to the desired recipients at that specified date-time. When a date-time is + chosen, the status of the mailing changes to *In Queue*. +- :guilabel:`Test` - Click to reveal a pop-up window, in which Odoo allows a sample email to be sent + for testing purposes. Enter the desired recipient's email address in the :guilabel:`Recipients` + field, and click :guilabel:`Send Sample Mail`. +- :guilabel:`Save` - Click to save the mailing as a draft, which can be edited (and sent) at a later + date. When clicked, the status of the mailing stays as :guilabel:`Draft`. +- :guilabel:`Discard` - Click to discard any changes that have been made since the last save. + +.. tip:: + When :guilabel:`Save` or :guilabel:`Discard` is selected (while in :guilabel:`Edit` mode), those + options are replaced with an :guilabel:`Edit` button and a :guilabel:`Create` button. Click + :guilabel:`Edit` to re-enter :guilabel:`Edit` mode. Click :guilabel:`Create` to start creating a + new mailing. + +.. note:: + By default, there's a daily limit applied for **all emails** sent throughout *all* applications. + So, if there are remaining emails to be sent after a limit has been reached, those mailings *will + not* be sent automatically the next day. The sending needs to be forced, by opening the email and + clicking :guilabel:`Retry`. + +.. toctree:: + :titlesonly: + + email_marketing/mailing_lists + email_marketing/unsubscriptions diff --git a/content/applications/marketing/email_marketing/add-filter-button.png b/content/applications/marketing/email_marketing/add-filter-button.png new file mode 100644 index 0000000000..3063aae8de Binary files /dev/null and b/content/applications/marketing/email_marketing/add-filter-button.png differ diff --git a/content/applications/marketing/email_marketing/blank-email-detail-form.png b/content/applications/marketing/email_marketing/blank-email-detail-form.png new file mode 100644 index 0000000000..f475265b6c Binary files /dev/null and b/content/applications/marketing/email_marketing/blank-email-detail-form.png differ diff --git a/content/applications/marketing/email_marketing/campaigns-page-popup.png b/content/applications/marketing/email_marketing/campaigns-page-popup.png new file mode 100644 index 0000000000..1ba7f94bb3 Binary files /dev/null and b/content/applications/marketing/email_marketing/campaigns-page-popup.png differ diff --git a/content/applications/marketing/email_marketing/dashboard.png b/content/applications/marketing/email_marketing/dashboard.png new file mode 100644 index 0000000000..38059a2c85 Binary files /dev/null and b/content/applications/marketing/email_marketing/dashboard.png differ diff --git a/content/applications/marketing/email_marketing/favorites-dropdown.png b/content/applications/marketing/email_marketing/favorites-dropdown.png new file mode 100644 index 0000000000..fb840269ef Binary files /dev/null and b/content/applications/marketing/email_marketing/favorites-dropdown.png differ diff --git a/content/applications/marketing/email_marketing/filters-dropdown.png b/content/applications/marketing/email_marketing/filters-dropdown.png new file mode 100644 index 0000000000..547bae2f77 Binary files /dev/null and b/content/applications/marketing/email_marketing/filters-dropdown.png differ diff --git a/content/applications/marketing/email_marketing/graph-view.png b/content/applications/marketing/email_marketing/graph-view.png new file mode 100644 index 0000000000..1375f40725 Binary files /dev/null and b/content/applications/marketing/email_marketing/graph-view.png differ diff --git a/content/applications/marketing/email_marketing/group-by-dropdown.png b/content/applications/marketing/email_marketing/group-by-dropdown.png new file mode 100644 index 0000000000..44acb1e309 Binary files /dev/null and b/content/applications/marketing/email_marketing/group-by-dropdown.png differ diff --git a/content/applications/marketing/email_marketing/list-view.png b/content/applications/marketing/email_marketing/list-view.png new file mode 100644 index 0000000000..b94ed052a0 Binary files /dev/null and b/content/applications/marketing/email_marketing/list-view.png differ diff --git a/content/applications/marketing/email_marketing/mail-blocks.png b/content/applications/marketing/email_marketing/mail-blocks.png new file mode 100644 index 0000000000..d9372d37d0 Binary files /dev/null and b/content/applications/marketing/email_marketing/mail-blocks.png differ diff --git a/content/applications/marketing/email_marketing/mailing-campaign-dropdown.png b/content/applications/marketing/email_marketing/mailing-campaign-dropdown.png new file mode 100644 index 0000000000..793c4a2e55 Binary files /dev/null and b/content/applications/marketing/email_marketing/mailing-campaign-dropdown.png differ diff --git a/content/applications/marketing/email_marketing/mailing-campaign-popup.png b/content/applications/marketing/email_marketing/mailing-campaign-popup.png new file mode 100644 index 0000000000..e59813c4d6 Binary files /dev/null and b/content/applications/marketing/email_marketing/mailing-campaign-popup.png differ diff --git a/content/applications/marketing/email_marketing/mailing_lists.rst b/content/applications/marketing/email_marketing/mailing_lists.rst new file mode 100644 index 0000000000..6f403388c8 --- /dev/null +++ b/content/applications/marketing/email_marketing/mailing_lists.rst @@ -0,0 +1,136 @@ +============= +Mailing lists +============= + +Mailing lists are important for a number of reasons. Mailing lists can provide valuable leads for +sales teams, communicate with focus groups participants, contact consumers directly for useful +feedback, and more. + +Create mailing lists +==================== + +To create a mailing list in the *Email Marketing* application, navigate to :menuselection:`Mailing +lists --> Mailing lists --> Create`. Clicking :guilabel:`Create` reveals a pop-up window. + +.. image:: mailing_lists/new-mailing-list-popup.png + :align: center + :alt: View of the mailing list pop-up in the Odoo Email Marketing application. + +In the pop-up, name the mailing list and designate if the mailing list should be public with the +:guilabel:`Is Public` checkbox. + +The :guilabel:`Is Public` option allows the mailing list to be accessible by recipients in the +unsubscription page, making it possible for them to update their subscription preferences. + +After those options have been configured, click :guilabel:`Create` to create the mailing list, which +Odoo automatically adds to the :guilabel:`Mailing Lists` page. + +Add contacts to a mailing list +============================== + +After a mailing list has been created (and added to the :guilabel:`Mailing Lists` dashboard), click +on the desired mailing list to add contacts to the list. + +Clicking the desired mailing list reveals a separate :guilabel:`Mailing List Contacts` page, in +which contacts can be added to this specific list by clicking :guilabel:`Create`, and adding contact +information directly on a separate contact detail form. + +Or, while in the :menuselection:`Email Marketing` application, navigate to :menuselection:`Mailing +Lists --> Mailing List Contacts`. Doing so reveals a separate page with all the mailing list +contacts in the database. + +From here, click :guilabel:`Create`, and add a contact with the same previous steps. Or, click the +:guilabel:`Import` icon (to the right of the :guilabel:`Create` button) to import contacts into the +database. + +Once contacts are in the database, click into the desired contact's detail form, and add the +preferred mailing list in the :guilabel:`Mailing List` tab (at the bottom of the contact detail +form), by clicking :guilabel:`Add a line`, and selecting the desired mailing list. Multiple mailing +lists can be added to a single contact's detail form. + +.. image:: mailing_lists/contact-form-mailing-list-tab.png + :align: center + :alt: View of a contact detail form with mailing list tab in Odoo Email Marketing. + +Create new mailing list from contact detail form +------------------------------------------------ + +To create a mailing list from a contact detail form, click :guilabel:`Add a line`, and type in the +name of a new mailing list in the empty field that appears. Then, select either :guilabel:`Create` +or :guilabel:`Create and Edit...`. + +.. image:: mailing_lists/new-list-dropdown-create-options.png + :align: center + :alt: View of the new mailing list drop-down on contact form in Odoo Email Marketing. + +The :guilabel:`Create` option quickly creates the mailing list to the contact detail form, and the +list can be configured at a later date. The :guilabel:`Create and Edit...` option creates the +mailing list, and reveals a pop-up window, in which the new mailing list can be configured right +away. + +.. image:: mailing_lists/create-and-edit-mailing-list-popup.png + :align: center + :alt: View of the create and edit mailing list pop-up in Odoo Email Marketing. + +Link a mailing list to website (Newsletter blocks) +================================================== + +When a mailing list is created in the database, Odoo provides the option to directly link the +mailing list on the Odoo-built website (created via Odoo's :guilabel:`Website` application). + +To link a mailing list to a website, navigate to the front-end of the website, and enter +:guilabel:`Edit` mode by clicking :guilabel:`Edit` in the upper-right corner. When clicked, Odoo +reveals a right-sidebar, filled with drag-and-drop *Building Blocks* that are packed with various +features, options, and design elements. + +Then, to add a *subscription field* for a specific mailing list onto a website, drag-and-drop any of +the :guilabel:`Newsletter` options (:guilabel:`Newsletter Block`, :guilabel:`Newsletter Popup`, or +:guilabel:`Newsletter`). + +.. tip:: + To quickly locate the :guilabel:`Newsletter` building block options (while in :guilabel:`Edit` + mode on the front-end of the website), type `Newsletter` into the search bar, located in the + right sidebar, under the :guilabel:`Blocks` tab, and Odoo reveals the three different + :guilabel:`Newsletter` block options. + + .. image:: mailing_lists/newsletter-block-search.png + :align: center + :alt: View of how to quickly search for Newsletter blocks in the Odoo Website application. + +When a :guilabel:`Newsletter` block is dragged onto the body of the website, Odoo reveals a pop-up +window, in which the desired mailing list is selected from a drop-down menu (and linked) to this +block on the website. + +.. image:: mailing_lists/add-mailing-list-popup-website.png + :align: center + :alt: View of the add mailing list subscription pop-up on an Odoo Website. + +- :guilabel:`Newsletter Block` - Adds a block onto the webpage, providing visitors with the + option to add their email address to this mailing list, and subscribe to future communications. + + Here's an example of a :guilabel:`Newsletter Block`. + + .. image:: mailing_lists/newsletter-block-sample.png + :alt: View of a sample newsletter block in the Odoo Website application. + +- :guilabel:`Newsletter Popup` - Tells Odoo to reveal a subscription pop-up window to occur at + a certain part of the webpage. When the visitor scrolls to this predetermined point, a pop-up + subscription window appears, asking for their email address to subscribe to the mailing list. + The pop-up window can be edited further to fit any business needs. + + Here's an example of a :guilabel:`Newsletter Popup`. + + .. image:: mailing_lists/newsletter-popup-sample.png + :alt: View of a sample newsletter pop-up sample on an Odoo Website. + +- :guilabel:`Newsletter` - Provides visitors with a simple field to add their email address to the + mailing list, and subscribe to future mailings in the footer (or anywhere else on the page). + + Here's an example of a :guilabel:`Newsletter` dynamic block. + + .. image:: mailing_lists/newsletter-footer-block-sample.png + :alt: View of a Newsletter dynamic block on an Odoo Website. + +.. seealso:: + - :doc:`/applications/marketing/email_marketing` + - :doc:`/applications/marketing/email_marketing/unsubscriptions` diff --git a/content/applications/marketing/email_marketing/mailing_lists/add-mailing-list-popup-website.png b/content/applications/marketing/email_marketing/mailing_lists/add-mailing-list-popup-website.png new file mode 100644 index 0000000000..ed94044871 Binary files /dev/null and b/content/applications/marketing/email_marketing/mailing_lists/add-mailing-list-popup-website.png differ diff --git a/content/applications/marketing/email_marketing/mailing_lists/contact-form-mailing-list-tab.png b/content/applications/marketing/email_marketing/mailing_lists/contact-form-mailing-list-tab.png new file mode 100644 index 0000000000..780ef30e5f Binary files /dev/null and b/content/applications/marketing/email_marketing/mailing_lists/contact-form-mailing-list-tab.png differ diff --git a/content/applications/marketing/email_marketing/mailing_lists/create-and-edit-mailing-list-popup.png b/content/applications/marketing/email_marketing/mailing_lists/create-and-edit-mailing-list-popup.png new file mode 100644 index 0000000000..f974f21716 Binary files /dev/null and b/content/applications/marketing/email_marketing/mailing_lists/create-and-edit-mailing-list-popup.png differ diff --git a/content/applications/marketing/email_marketing/mailing_lists/new-list-dropdown-create-options.png b/content/applications/marketing/email_marketing/mailing_lists/new-list-dropdown-create-options.png new file mode 100644 index 0000000000..b20bb9eb43 Binary files /dev/null and b/content/applications/marketing/email_marketing/mailing_lists/new-list-dropdown-create-options.png differ diff --git a/content/applications/marketing/email_marketing/mailing_lists/new-mailing-list-popup.png b/content/applications/marketing/email_marketing/mailing_lists/new-mailing-list-popup.png new file mode 100644 index 0000000000..fd8e47d315 Binary files /dev/null and b/content/applications/marketing/email_marketing/mailing_lists/new-mailing-list-popup.png differ diff --git a/content/applications/marketing/email_marketing/mailing_lists/newsletter-block-sample.png b/content/applications/marketing/email_marketing/mailing_lists/newsletter-block-sample.png new file mode 100644 index 0000000000..a683c8a42b Binary files /dev/null and b/content/applications/marketing/email_marketing/mailing_lists/newsletter-block-sample.png differ diff --git a/content/applications/marketing/email_marketing/mailing_lists/newsletter-block-search.png b/content/applications/marketing/email_marketing/mailing_lists/newsletter-block-search.png new file mode 100644 index 0000000000..ee2f2143e6 Binary files /dev/null and b/content/applications/marketing/email_marketing/mailing_lists/newsletter-block-search.png differ diff --git a/content/applications/marketing/email_marketing/mailing_lists/newsletter-footer-block-sample.png b/content/applications/marketing/email_marketing/mailing_lists/newsletter-footer-block-sample.png new file mode 100644 index 0000000000..7716a6899d Binary files /dev/null and b/content/applications/marketing/email_marketing/mailing_lists/newsletter-footer-block-sample.png differ diff --git a/content/applications/marketing/email_marketing/mailing_lists/newsletter-popup-sample.png b/content/applications/marketing/email_marketing/mailing_lists/newsletter-popup-sample.png new file mode 100644 index 0000000000..1e17924575 Binary files /dev/null and b/content/applications/marketing/email_marketing/mailing_lists/newsletter-popup-sample.png differ diff --git a/content/applications/marketing/email_marketing/recipients-dropdown.png b/content/applications/marketing/email_marketing/recipients-dropdown.png new file mode 100644 index 0000000000..a7a6ea71cc Binary files /dev/null and b/content/applications/marketing/email_marketing/recipients-dropdown.png differ diff --git a/content/applications/marketing/email_marketing/settings-page.png b/content/applications/marketing/email_marketing/settings-page.png new file mode 100644 index 0000000000..0990d8d262 Binary files /dev/null and b/content/applications/marketing/email_marketing/settings-page.png differ diff --git a/content/applications/marketing/email_marketing/settings-tab-with-settings.png b/content/applications/marketing/email_marketing/settings-tab-with-settings.png new file mode 100644 index 0000000000..f9b838e5f9 Binary files /dev/null and b/content/applications/marketing/email_marketing/settings-tab-with-settings.png differ diff --git a/content/applications/marketing/email_marketing/settings-without-features.png b/content/applications/marketing/email_marketing/settings-without-features.png new file mode 100644 index 0000000000..03477f4ccc Binary files /dev/null and b/content/applications/marketing/email_marketing/settings-without-features.png differ diff --git a/content/applications/marketing/email_marketing/three-dot-dropdown.png b/content/applications/marketing/email_marketing/three-dot-dropdown.png new file mode 100644 index 0000000000..f989a56f20 Binary files /dev/null and b/content/applications/marketing/email_marketing/three-dot-dropdown.png differ diff --git a/content/applications/marketing/email_marketing/unsubscriptions.rst b/content/applications/marketing/email_marketing/unsubscriptions.rst new file mode 100644 index 0000000000..739d002a2f --- /dev/null +++ b/content/applications/marketing/email_marketing/unsubscriptions.rst @@ -0,0 +1,74 @@ +================================== +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). + +Enable the Blacklist feature +============================ + +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`. + +.. 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. + +.. 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. + +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. + +.. note:: + The mailing list has to be configured as *Public* in order to be visible for users. + +To view a complete collection of 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. + +.. 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). + +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. + +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. + +.. image:: unsubscriptions/unblacklist-popup.png + :align: center + :alt: View of the unblacklist pop-up window in the Odoo Email Marketing application. + +After filling in the fields, click :guilabel:`Confirm` to officially remove that particular contact +from the blacklist. + +.. seealso:: + - :doc:`/applications/marketing/email_marketing` + - :doc:`/applications/marketing/email_marketing/mailing_lists` diff --git a/content/applications/marketing/email_marketing/unsubscriptions/blacklist-feature.png b/content/applications/marketing/email_marketing/unsubscriptions/blacklist-feature.png new file mode 100644 index 0000000000..1b9bcf4fd5 Binary files /dev/null and b/content/applications/marketing/email_marketing/unsubscriptions/blacklist-feature.png differ diff --git a/content/applications/marketing/email_marketing/unsubscriptions/blacklisted-contact-form.png b/content/applications/marketing/email_marketing/unsubscriptions/blacklisted-contact-form.png new file mode 100644 index 0000000000..c4574c2888 Binary files /dev/null and b/content/applications/marketing/email_marketing/unsubscriptions/blacklisted-contact-form.png differ diff --git a/content/applications/marketing/email_marketing/unsubscriptions/blacklisted-email-addresses.png b/content/applications/marketing/email_marketing/unsubscriptions/blacklisted-email-addresses.png new file mode 100644 index 0000000000..5fed45ee03 Binary files /dev/null and b/content/applications/marketing/email_marketing/unsubscriptions/blacklisted-email-addresses.png differ diff --git a/content/applications/marketing/email_marketing/unsubscriptions/manage3.png b/content/applications/marketing/email_marketing/unsubscriptions/manage3.png new file mode 100644 index 0000000000..7457c8f2a9 Binary files /dev/null and b/content/applications/marketing/email_marketing/unsubscriptions/manage3.png differ diff --git a/content/applications/marketing/email_marketing/unsubscriptions/unblacklist-popup.png b/content/applications/marketing/email_marketing/unsubscriptions/unblacklist-popup.png new file mode 100644 index 0000000000..4779dc4dc0 Binary files /dev/null and b/content/applications/marketing/email_marketing/unsubscriptions/unblacklist-popup.png differ diff --git a/content/applications/marketing/marketing_automation/advanced/understanding_metrics.rst b/content/applications/marketing/marketing_automation/advanced/understanding_metrics.rst index 22e84b9e80..6415c6d9e8 100644 --- a/content/applications/marketing/marketing_automation/advanced/understanding_metrics.rst +++ b/content/applications/marketing/marketing_automation/advanced/understanding_metrics.rst @@ -2,79 +2,86 @@ Understanding metrics ===================== -Metrics are detailed statistics that measure the progress (and success) of marketing campaigns. -When creating marketing activities in a workflow, Odoo will visually display various metrics -related to the campaign with graphs and data. +Metrics are detailed statistics that measure the progress and success of marketing campaigns. When +creating marketing activities in a workflow, Odoo visually displays various metrics related to the +campaign with detailed graphs and in-depth data. -Consider the following example: +.. example:: + A typical line graph in a marketing automation workflow showcasing the success rate of an email. -.. image:: understanding_metrics/commercial-prospection-campaign-example.png - :align: center - :alt: An example of a marketing automation campaign in Odoo. + .. image:: understanding_metrics/commercial-prospection-campaign-example.png + :align: center + :alt: An example of a marketing automation campaign in Odoo. -In this case, the :guilabel:`Target` of this campaign is set to :guilabel:`Lead/Opportunity` and -was narrowed down to only focus on the Leads (or Opportunities) whose :guilabel:`Tag Name` contain -a value of `product` and they *also* have an email address set up in the database. +In this case, the :guilabel:`Target` of this campaign is set to :guilabel:`Lead/Opportunity`, and +was narrowed down to *only* focus on the leads (or opportunities) whose :guilabel:`Tag Name` +contains a value of `product` — and *also* have an email address set up in the database. -Beneath the filter nodes, Odoo will display how many records in the database fall into the -previously-specified criteria filter. In this example, there are 18 records in the database that -match the criteria. +Beneath the filter nodes, Odoo displays how many records in the database fall into the +previously-specified criteria filter. -.. image:: understanding_metrics/marketing-automation-lead-filters.png - :align: center - :alt: Lead generation filters used to refine records on marketing automation campaigns in Odoo. +.. example:: + Below, there are 18 records in the database that match the criteria. -At the top of the marketing automation form, there are a series of smart buttons. The + .. image:: understanding_metrics/marketing-automation-lead-filters.png + :align: center + :alt: Lead generation filters used to refine records on automation campaigns in Odoo. + +At the top of the marketing automation campaign form, there are a series of smart buttons. The :guilabel:`Participations` smart button in this example indicates that, out of those 18 records, 25 have become participants. In other words, they have matched the criteria, and have already interacted with the campaign in one way or another. .. note:: :guilabel:`Records` represent a real-time number. Therefore, while the workflow is running, - changes in opportunity records (deletions, additions, adjustments) may occur. This means there - will be real-time updates to the number of :guilabel:`Records`, but such updates do *not* change - the number of :guilabel:`Participants`, as the metric *will not* exclude opportunities that have - already been set as :guilabel:`Participants` before - Odoo will just add new ones. That's why - the number of :guilabel:`Records` can be different from the number of :guilabel:`Participants` - from time to time. + changes in opportunity records (deletions, additions, or adjustments) may occur. + + This means there will be real-time updates to the number of :guilabel:`Records`, but such updates + do *not* change the number of :guilabel:`Participants`, as the metric *will not* exclude + opportunities that have already been set as :guilabel:`Participants` before — Odoo just adds new + ones. + + That's why the number of :guilabel:`Records` can be different from the number of + :guilabel:`Participants` from time to time. .. image:: understanding_metrics/campaign-records-vs-participants.png :align: center :alt: Difference between real-time record count and total participants on a markeing campaign. Whenever the system runs, updating numbers and triggering actions, it will look at the -:guilabel:`Target` model, and check if new :guilabel:`Records` have been added (or modified), -which always keeps the flow up-to-date. +:guilabel:`Target` model, and check if new :guilabel:`Records` have been added (or modified), which +always keeps the flow up-to-date. .. note:: - The filter here is applied to *all* activities. Leads that lose that specific :guilabel:`Tag` - in the meantime will be excluded from later activities. + The :guilabel:`Filter` here is applied to *all* activities. Leads that lose that specific tag + (`product`) in the meantime will be excluded from later activities. .. tip:: Filters can also be applied to individual activities, in the :guilabel:`Domain` section of the - activity pop-up form. Use this feature to specify an individual filter that will only be - performed if the records satisfy *both* filter criteria - the activity filter and its specific - domain filter. + :guilabel:`Activity` pop-up form. Use this feature to specify an individual filter that will + *only* be performed if the records satisfy *both* filter criteria — the activity filter and its + specific domain filter. - (*Example*: when configuring an SMS activity, make sure a certain phone number is set, - in order to avoid triggering a SMS that would never be sent.) +.. example:: + When configuring an SMS activity, make sure a certain phone number is set, in order to avoid + triggering a SMS that would never be sent. .. image:: understanding_metrics/individual-filter-to-activity.png :align: center :alt: A relevant targeting filter that applies to a type of individual activity. -:guilabel:`Success` represents the number of times the searching for participants - who match the -criteria filter(s) of that activity - was performed successfully, in relation to the total number -of participants. If a participant does *not* match the conditions, it will be added to -:guilabel:`Rejected`. +:guilabel:`Success` represents the number of times that the searching for participants — who match +the criteria filter(s) of that activity — was performed successfully, in relation to the total +number of participants. If a participant does *not* match the conditions, it will be added to the +:guilabel:`Rejected` number. .. image:: understanding_metrics/participant-matching-success-vs-rejected.png :align: center :alt: Overview showing participants who do or do not match filtering criteria on an activity. -Hovering over the graph, Odoo displays the number of successful and rejected participants, per day, -over the last 15 days. +Hovering over the graph on an automation activity block, Odoo displays the number of successful and +rejected participants, per day, over the last 15 days. .. note:: - Whenever a new record is added to the :guilabel:`Target` model, it will automatically be added - to the workflow, and it will start the workflow from the beginning (:guilabel:`Parent Action`). + Whenever a new record is added to the :guilabel:`Target` model, it's automatically added to the + workflow, and it will start the workflow from the beginning (:guilabel:`Parent Action`). diff --git a/content/applications/marketing/marketing_automation/getting_started/first_campaign.rst b/content/applications/marketing/marketing_automation/getting_started/first_campaign.rst index 062944913a..df410cc05a 100644 --- a/content/applications/marketing/marketing_automation/getting_started/first_campaign.rst +++ b/content/applications/marketing/marketing_automation/getting_started/first_campaign.rst @@ -1,38 +1,49 @@ -==================== -Marketing Automation -==================== +=============== +Getting started +=============== -The Odoo Marketing Automation app automates a variety of marketing tasks by combining specific +The Odoo *Marketing Automation* app automates a variety of marketing tasks, by combining specific rules and filters to generate timed actions. Instead of manually having to build each stage of a -campaign (such as a series of timed massmails), the Marketing Automation app allows marketers to -build the entire campaign, and all of its stages, in one place on one dashboard. +campaign (such as a series of timed massmails), the *Marketing Automation* app allows marketers to +build the entire campaign, and all of its stages, in one place on a single dashboard. Create a campaign ================= -To create a new automated marketing campaign, open the :guilabel:`Marketing Automation` app and -click :guilabel:`Create`. On the :guilabel:`Campaign` page, there are the following smart buttons -and fields: +To create a new automated marketing campaign, open the :menuselection:`Marketing Automation` app, +and click the :guilabel:`Create` button in the upper-left corner. Doing so reveals a blank marketing +automation campaign detail form on a separate page. + +On the blank marketing automation campaign page, the following smart buttons and fields are +available: .. image:: first_campaign/marketing-template-sample.png :align: center :alt: A dashboard showing the creation of a new marketing automation campaign in Odoo. +**Smart buttons** + - :guilabel:`Templates`: represents the number of pre-configured mail templates being used in this - particular campaign. (Templates can always be created on-the-fly as well). + particular campaign. (Templates can always be created on-the-fly, as well). - :guilabel:`SMS`: represents the number of personalized SMS messages connected to this campaign. - :guilabel:`Clicks`: represents the number of times attached links have been clicked by recipients of this campaign. - :guilabel:`Participants`: represents the number of contacts that have directly participated in this campaign. + +**Fields** + +- :guilabel:`Name`: represents the name of the marketing automation campaign being created. - :guilabel:`Target`: this field is a drop-down menu to choose which model is targeted by this campaign (i.e., by Contacts, Sales Order, Lead/Opportunity, etc.). +- :guilabel:`Filter`: this field provides numerous configurable criteria that can be used to further + narrow down the target recipients/audience for the marketing automation campaign. Campaign filters ================ -To add a filter to the target audience, click :guilabel:`Add Filter`, and a node field will -appear. In the node field, a custom equation can be configured for Odoo to use when filtering who +To add a :guilabel:`Filter` to the target audience, click :guilabel:`Add Filter`, and a node field +appears. In the node field, a custom equation can be configured for Odoo to use when filtering who to include (and exclude) in this specific marketing campaign. .. image:: first_campaign/filter-node.png @@ -40,20 +51,20 @@ to include (and exclude) in this specific marketing campaign. :alt: A filter node in Odoo Marketing Automation. When the first field of the node is clicked, a nested drop-down menu of options appears on the -screen where specific criteria is chosen based on needs of the campaign. The remaining fields on -the node further define the criteria which determines which records to include (or exclude) in the +screen, wherein specific criteria is chosen based on needs of the campaign. The remaining fields on +the node further define the criteria determining which records to include (or exclude) in the execution of the campaign. -To add another node, simply click the :guilabel:`+ (plus sign)` icon to the right of the filtering -rule. To add a branch of multiple nodes at the same time, click the :guilabel:`... (ellipses)` -icon. +To add another node, click the :guilabel:`➕ (plus sign)` icon to the right of the filtering rule. To +add a branch of multiple nodes at the same time, click the :guilabel:`⋯ (ellipses)` icon. -For further information on filters, refer to :doc:`this documentation page `. +For further information on filters, refer to :doc:`this documentation page +`. .. note:: :guilabel:`Records` represent the number of contacts in the system that fit the specified criteria for a campaign. .. seealso:: - - :doc:`testing_running` - - :doc:`workflow_activities` + - :doc:`/applications/marketing/marketing_automation/getting_started/testing_running` + - :doc:`/applications/marketing/marketing_automation/getting_started/workflow_activities` diff --git a/content/applications/marketing/marketing_automation/getting_started/target_audience.rst b/content/applications/marketing/marketing_automation/getting_started/target_audience.rst index a72955d711..5cf7e4b621 100644 --- a/content/applications/marketing/marketing_automation/getting_started/target_audience.rst +++ b/content/applications/marketing/marketing_automation/getting_started/target_audience.rst @@ -2,16 +2,17 @@ Target an audience ================== -Delivering marketing campaigns to the *right* audience is paramount when trying to grow a business. -The :guilabel:`Odoo Marketing Automation` application helps marketers to do just that by providing -filtering tools, that can be as simple or as complex as necessary, to reach the right customers at -the right time. +Delivering marketing campaigns to the right audience is paramount when trying to grow a business. +The Odoo *Marketing Automation* application helps marketers to do just that by providing detailed +filtering tools, which can be as simple (or as complex) as necessary, to reach the right customers +at the right time. -Work with target filters +Configure target filters ======================== -When configuring the filters on a marketing campaign, there are some options that have an arrow -icon beside them. The arrow signifies that the filter has more refined parameters within it. +When configuring the target filters on a marketing campaign, there are some options that have an +:guilabel:`> (arrow)` icon beside them. The :guilabel:`> (arrow)` icon signifies that the particular +filter has more refined parameters within it that can be customized. .. image:: target_audience/marketing-filters.png :align: center @@ -19,22 +20,22 @@ icon beside them. The arrow signifies that the filter has more refined parameter Filters can be extended by adding *branches* and *nodes*. A *node* adds another filtering parameter to a group of targeting conditions (e.g. a new line), and a *branch* creates a narrowly refined -cluster of parameters, allowing filters to be grouped with *Any* or *All* statements. +cluster of parameters, allowing filters to be grouped with :guilabel:`ANY` or :guilabel:`ALL` +statements. Every time a new branch is created, there are two options: -- Either the records can match :guilabel:`ALL` criteria for the upcoming rules (an AND statement - where all criteria must match). - -- Or, the records can match :guilabel:`ANY` criteria for the upcoming rules (an OR statement where - only one of the criteria must match). +- Either the records can match :guilabel:`ALL` criteria for the upcoming rules (creating an AND + statement where *all* criteria must match). +- Or, the records can match :guilabel:`ANY` criteria for the upcoming rules (creating an OR + statement where *only one* of the criteria must match). To change between these two options, simply click the drop-down arrow icon in the green box and -select :guilabel:`Any` or :guilabel:`All`. +select :guilabel:`ANY` or :guilabel:`ALL`. -To add a node, click on the :guilabel:`+ (plus sign icon)` and to add another branch click on the -:guilabel:`... (ellipses icon)`. To exclude a :guilabel:`node` (or a :guilabel:`branch`), click on -:guilabel:`x (delete)`. +To add a node, click on the :guilabel:`➕ (plus sign)` icon, and to add another branch click on the +:guilabel:`⋯ (ellipses)` icon. To exclude a node or a branch, click on :guilabel:`✖ (delete)` icon +to delete it. .. image:: target_audience/marketing-filter-nodes.png :align: center @@ -43,78 +44,79 @@ To add a node, click on the :guilabel:`+ (plus sign icon)` and to add another br Use cases ========= -The following scenarios below outline different combinations of filters a marketing campaign might +The following scenarios outline different combinations of filters a marketing campaign might commonly use. -Scenario #1: Narrow the target down to new opportunities in the pipeline ------------------------------------------------------------------------- +Scenario #1: Narrow target down to new opportunities in the pipeline +-------------------------------------------------------------------- -While in Edit mode on a campaign template form, select the :guilabel:`Target` field, and click -:guilabel:`Search More` from the drop-down menu. Then, search for :guilabel:`Lead/Opportunity` and -select it. +While in *Edit mode* on a campaign template form (by clicking the :guilabel:`Edit` button), select +the :guilabel:`Target` field, and click :guilabel:`Search More` from the drop-down menu. Then, +search for :guilabel:`Lead/Opportunity`, and select it. -Next, click :guilabel:`Add Filter` in the :guilabel:`Filter` field. Click on the default +Next, click :guilabel:`Add Filter` in the :guilabel:`Filter` field. Then, click on the default :guilabel:`ID` filter option in the first portion of the filter equation. Doing so reveals a drop-down menu full of filter options. From this drop-down, scroll down (or search for) :guilabel:`Type`. -Keep the second portion of the filter equation on the default :guilabel:`= (equal sign)`. +Keep the second portion of the filter equation on the default :guilabel:`🟰 (equal sign)` icon. -Then, change the third (and final) portion of the filter equation from :guilabel:`Lead` to +Next, change the third (and final) portion of the filter equation from :guilabel:`Lead` to :guilabel:`Opportunity`. The number of :guilabel:`Records` that fit this specific filter equation -will change as the equation is customized. +changes as the equation is customized. -Add another node to this filter by clicking the :guilabel:`+ (plus sign)` to the right of the +Add another node to this filter by clicking the :guilabel:`➕ (plus sign)` icon to the right of the equation. -With "new" opportunities being the target of this filter, the second node will focus on only +With "new" opportunities being the target of this filter, the second node will focus on *only* locating opportunities that are in the :guilabel:`New` stage of the pipeline. To do that, select -the default :guilabel:`ID` from the first portion of the second filter equation, and scroll down -(or search for) :guilabel:`Stage` from the field drop-down menu. +the default :guilabel:`ID` from the first portion of the second filter equation, and scroll down (or +search for) :guilabel:`Stage` from the field drop-down menu. -Once again, leave the second portion of the filter equation on :guilabel:`= (equal sign)`. +Once again, leave the second portion of the filter equation on :guilabel:`🟰 (equal sign)` icon. -Lastly, highlight the default value in the third (and final) portion of the second filter equation -and type in :guilabel:`New`. With that completed, Odoo will only target opportunities that are in -the "New" stage of the pipeline. +Lastly, highlight the default value in the third (and final) portion of the second filter equation, +and type in `New`. With that in place, Odoo only targets opportunities that are in the "New" stage +of the pipeline. .. image:: target_audience/filters-opportunities.png :align: center :alt: A standard scenario using filters in the Odoo Marketing Automation app. -Scenario #2: Narrow the target down to the event attendees that purchased a specific ticket -------------------------------------------------------------------------------------------- +Scenario #2: Narrow down target to event attendees who purchased a specific ticket +---------------------------------------------------------------------------------- -While in Edit mode on a campaign template form, select the :guilabel:`Target` field, and click -:guilabel:`Search More` from the drop-down menu. Then, scroll down (or search for) -:guilabel:`Event` and select it. +While in *Edit mode* on a campaign template form (by clicking the :guilabel:`Edit` button), select +the :guilabel:`Target` field, and click :guilabel:`Search More` from the drop-down menu. Then, +scroll down (or search for) :guilabel:`Event`, and select it. Next, click :guilabel:`Add Filter` in the :guilabel:`Filter` field. Click on the default :guilabel:`ID` filter option in the first portion of the filter equation. Doing so reveals a drop-down menu full of filter options. From this drop-down, scroll down (or search for) :guilabel:`Event`. -Click the the default :guilabel:`= (equal sign)` in the second portion of the filter equation. -This reveals a drop-down menu. On this menu, select :guilabel:`contains`. +Click the default :guilabel:`🟰 (equal sign)` icon in the second portion of the filter equation. This +reveals a drop-down menu. From this drop-down menu, select :guilabel:`contains`. -In the third (and final) empty portion of the filter equation, type in the name of the event(s) -that you would like Odoo to consider for this campaign filter. +In the third (and final) empty portion of the filter equation, type in the name of the event(s) that +Odoo should consider for this campaign filter. -Add another node to this filter by clicking the :guilabel:`+ (plus sign)` to the right of the -equation. +Then, add another node to this filter by clicking the :guilabel:`➕ (plus sign)` icon to the right of +the equation. The second node will focus on targeting this campaign to attendees who purchase a specific type of -ticket to the aforementioned event(s) in the first filter equation. To do that, select the default -:guilabel:`ID` from the first portion of the second filter equation, and scroll down (or search -for) :guilabel:`Event Ticket` from the field drop-down menu. Then, in that same drop-down menu, -select :guilabel:`Name`. +ticket to the aforementioned event(s) mentioned in the first filter equation. + +To do that, select the default :guilabel:`ID` from the first portion of the second filter equation, +and scroll down (or search for) :guilabel:`Event Ticket` from the field drop-down menu. Then, in +that same drop-down menu, select :guilabel:`Name`. -Once again, click the the default :guilabel:`= (equal sign)` in the second portion of the filter +Once again, click the default :guilabel:`🟰 (equal sign)` icon in the second portion of the filter equation, and select :guilabel:`contains`. -Lastly, in the third (and final) portion of the second filter equation, which will be blank, type -in the name of the ticket type that should be used for the filter. In this case, -:guilabel:`Standard` is the name of the event ticket type for this sample filter. +Lastly, in the third (and final) portion of the second filter equation, which is blank, type in the +name of the ticket type that should be used for the filter. In this case, :guilabel:`Standard` is +the name of the event ticket type for this sample filter. .. image:: target_audience/filters-event-ticket.png :align: center diff --git a/content/applications/marketing/marketing_automation/getting_started/testing_running.rst b/content/applications/marketing/marketing_automation/getting_started/testing_running.rst index 94db64caae..cc1b8d6328 100644 --- a/content/applications/marketing/marketing_automation/getting_started/testing_running.rst +++ b/content/applications/marketing/marketing_automation/getting_started/testing_running.rst @@ -1,41 +1,52 @@ -============================== -Testing and running a campaign -============================== +========================= +Testing/running campaigns +========================= Odoo gives users the ability to test marketing campaigns (and mailings) before officially running them. -First, open the :guilabel:`Marketing Automation` application and click on a campaign. Make sure -the campaign already has activities configured on it (or build a campaign by following the -directions here on :doc:`this documentation `). To start a test, click the -:guilabel:`Launch a Test` button at the top of the template form. +First, open the :menuselection:`Marketing Automation` application, and select the desired campaign, +which reveals that campaign's detail form. + +On the campaign detail form, make sure the campaign already has activities configured (or build a +campaign by following the directions here on :doc:`this documentation +`). + +To start a test, click the :guilabel:`Launch a Test` button at the top of the campaign form. .. image:: testing_running/launch-test.png :align: center :alt: Launch a test button in Odoo Marketing Automation. -When clicked, a pop-up window appears. In the dropdown field choose a specific record to run the -test on, or create a brand new record by clicking the :guilabel:`Search More...` link at the bottom -of the dropdown menu, and then click the :guilabel:`Create` button. +When clicked, a :guilabel:`Launch a test` pop-up window appears. In the drop-down field, choose an +existing record (or create a new one) to run the test on. To create a brand new record, click the +:guilabel:`Search More...` link at the bottom of the drop-down menu, and then click the +:guilabel:`Create` button. + +Doing so reveals a blank contact form, in which the :guilabel:`Name` and :guilabel:`Email` **must** +be entered. When all the necessary information has been entered, click :guilabel:`Save`, and Odoo +returns to the :guilabel:`Launch a test` pop-up, with that new record in the :guilabel:`Choose an +existing record or create a new one to test` field. -Once the record is selected, click :guilabel:`Continue`, and Odoo will redirect to the campaign -test page. +Once a record is selected, click :guilabel:`Continue`, and Odoo reveals the campaign test page. .. image:: testing_running/test-screen.png :align: center :alt: Test screen in Odoo Marketing Automation. -Here, the name of the :guilabel:`Record` being tested is visible, along with the precise time this -test workflow was started. Beneath that is the first activity (or activities) in the workflow. +On the campaign test page, the name of the :guilabel:`Record` being tested is visible, along with +the precise time this test workflow was started in the :guilabel:`Workflow Started On` field. +Beneath that, in the :guilabel:`Workflow` section is the first activity (or activities) in the +workflow that's being tested. -To start a test, click the :guilabel:`Run` icon beside the first activity in the workflow. When -clicked, the page will reload, and Odoo will show the various results (and analytics) connected to -that specific activity. +To start a test, click the :guilabel:`Run` button, represented by a :guilabel:`▶️ (play button)` +icon beside the first activity in the workflow. When clicked, the page reloads, and Odoo shows the +various results (and analytics) connected to that specific activity as they occur, in real-time. .. image:: testing_running/workflow-test-progress.png :align: center :alt: Workflow test progress in Odoo Marketing Automation. -Once all the workflow activities are completed, the test will end and be moved to the +Once all the workflow activities are completed, the test will end, and move to the :guilabel:`Completed` stage. To stop a test before all the workflow activities are completed, click -the :guilabel:`Stop` button. +the :guilabel:`Stop` button in the upper-left corner of the campaign test page. diff --git a/content/applications/marketing/marketing_automation/getting_started/workflow_activities.rst b/content/applications/marketing/marketing_automation/getting_started/workflow_activities.rst index eda26e9ee7..7dc44206e5 100644 --- a/content/applications/marketing/marketing_automation/getting_started/workflow_activities.rst +++ b/content/applications/marketing/marketing_automation/getting_started/workflow_activities.rst @@ -2,44 +2,51 @@ Marketing activities ==================== -When creating a campaign in the :guilabel:`Marketing Automation` app, users can plan marketing -activities such as email or SMS campaigns. To get started, navigate to the :guilabel:`Workflow` -area, and click :guilabel:`Add New Activity`. A blank activity template will appear where -parameters can be set for that specific activity. +When creating a campaign in the *Marketing Automation* app, users can plan marketing activities, +such as email or SMS campaigns. -When :guilabel:`Add New Activity` is selected, a blank activity template will appear with the -following customizable fields: +To get started, navigate to the bottom of a marketing automation campaign detail form, and click +:guilabel:`Add New Activity`. Doing so reveals a :guilabel:`Create Activities` pop-up window. This +pop-up window is a blank activity template, where specific parameters can be set for that particular +activity. + +The following fields are available in the :guilabel:`Create Activities` pop-up window (when +:guilabel:`Add New Activity` is clicked): .. image:: workflow_activities/activity-template.png :align: center :alt: An activity template in Odoo Marketing Automation. - :guilabel:`Activity Name`: the title of the activity. -- :guilabel:`Activity Type`: choose between Email, Server Action (internal Odoo operation), or SMS. +- :guilabel:`Activity Type`: choose between `Email`, `Server Action` (internal Odoo operation), or + `SMS`. - :guilabel:`Mail Template`: choose from pre-configured templates (or create a new one on-the-fly). - :guilabel:`Trigger`: choose when this activity should be triggered. - :guilabel:`Expiry Duration`: configure to stop the actions after a specific amount of time (after the scheduled date). When selected, a :guilabel:`Cancel after` field appears, in which the user - can choose how many :guilabel:`Hours, Days, Weeks, or Months` they want the actions to cease - after the initial date. -- :guilabel:`Activity Filter`: domain related to this activity (and all subsequent Child - Activities). -- :guilabel:`Applied Filter`: activity will *only* be performed if it satisfies the specified - domain (filter). + can choose how many :guilabel:`Hours, Days, Weeks, or Months` they want the actions to cease after + the initial date. +- :guilabel:`Activity Filter`: domain related to this activity (and all subsequent child + activities). +- :guilabel:`Applied Filter`: activity will *only* be performed if it satisfies the specified domain + (filter). -After the activity's settings are fully configured, click :guilabel:`Save & Close` to finish -creating the activity. +After the activity's settings are fully configured, click :guilabel:`Save & Close` to save the +activity and return to the marketing automation campaign form, :guilabel:`Save & New` to save the +activity and immediately create another one in a fresh :guilabel:`Create Activities` pop-up window, +or :guilabel:`Discard` to delete the activity and return to the marketing automation campaign form. Workflow activity ================= -Once saved, the :guilabel:`Workflow Activity` will appear in Odoo, where each activity will be -shown as a graph by default. The configured trigger time for that activity can be found to the left -of the :guilabel:`Workflow Activity` card. +Once an activity is saved, the :guilabel:`Workflow Activity` section appears at the bottom of the +marketing automation campaign form. Each activity is displayed as a line graph. + +The configured :guilabel:`Trigger` time for that activity can be found to the left of the +:guilabel:`Workflow Activity` card in the :guilabel:`Workflow` section. -In the :guilabel:`Workflow Activity` section, there is also the number of activities that are -successful or rejected. The :guilabel:`Success` and :guilabel:`Rejected` numbers are color-coded -in the graph for easy reference (in green and red, respectively). +Once the activity has been triggered, a figure representing the number of :guilabel:`Success` or +:guilabel:`Rejected` activities will be displayed to the right of the graph. .. image:: workflow_activities/workflow-activity.png :align: center @@ -47,20 +54,23 @@ in the graph for easy reference (in green and red, respectively). .. tip:: If the :guilabel:`Activity Type` of the activity is set to :guilabel:`Email`, there are more - in-depth analytics beneath the :guilabel:`Workflow Activity` data detailing how many emails have - been :guilabel:`Sent`, and what percentage of those have been :guilabel:`Clicked`, - :guilabel:`Replied` to, or :guilabel:`Bounced`. + in-depth analytics beneath the activity graph data, detailing how many emails have been + :guilabel:`Sent`, and what percentage of those have been :guilabel:`Clicked`, :guilabel:`Replied` + to, or :guilabel:`Bounced`. Child activities ================ -Odoo also has the option to :guilabel:`Add Child Activity`. *Child Activities* are sub-activities -that are connected to (and triggered by) the activity above it, which is also known as its *Parent -Activity*. +There is also the option to add a *child activity* by clicking :guilabel:`Add child activity`, +located at the bottom of each activity block in the :guilabel:`Workflow` section of a marketing +automation form. + +Child activities are sub-activities that are connected to (and triggered by) the activity above it, +which is also known as its *parent activity*. -Odoo provides a number of triggering options to launch a :guilabel:`Child Activity` - all of which -depend on the trigger configurations related to the parent activity. Under the desired parent -activity, hover over :guilabel:`Add child activity`, and select the trigger: +Odoo provides a number of triggering options to launch a child activity - all of which depend on the +trigger configurations related to the parent activity. Under the desired parent activity, hover over +:guilabel:`Add child activity`, and select any of the following triggers: - :guilabel:`Add Another Activity`: instantly add another activity. - :guilabel:`Opened`: the next activity will be triggered if the (email) recipient opens the @@ -76,6 +86,7 @@ activity, hover over :guilabel:`Add child activity`, and select the trigger: link included in the mailing. - :guilabel:`Bounced`: the next activity will be triggered if the mailing is bounced (not sent). -Once a trigger is selected, the user can configure the child activity (it has the same -configuration options as a regular activity) and click :guilabel:`Save & Close`` to finish creating -the child activity. +Once a trigger is selected, the user can configure the child activity (it has the same configuration +options as a regular activity), and click :guilabel:`Save & Close` to finish creating the child +activity, which will then be displayed in the :guilabel:`Workflow` section, in a slightly indented +position beneath its parent activity. diff --git a/content/applications/productivity.rst b/content/applications/productivity.rst index ac15d3f316..2198dd72fa 100644 --- a/content/applications/productivity.rst +++ b/content/applications/productivity.rst @@ -8,6 +8,7 @@ Productivity .. toctree:: productivity/discuss + productivity/whatsapp productivity/calendar productivity/knowledge productivity/iot diff --git a/content/applications/productivity/discuss/advanced/ice_servers.rst b/content/applications/productivity/discuss/advanced/ice_servers.rst index 985d05253c..fee0f51f74 100644 --- a/content/applications/productivity/discuss/advanced/ice_servers.rst +++ b/content/applications/productivity/discuss/advanced/ice_servers.rst @@ -10,7 +10,7 @@ calls, and then, connect that Twilio account to Odoo. Create a Twilio account ======================= -First, go to `Twilio `_ and click :guilabel:`Sign up` to create a new +First, go to `Twilio `_ and click :guilabel:`Sign up` to create a new Twilio account. Next, enter your name and email address, create a password, and accept Twilio's terms of service. Then, click :guilabel:`Start your free trial`. Verify your email address with Twilio, as per their instructions. diff --git a/content/applications/productivity/iot/config.rst b/content/applications/productivity/iot/config.rst index 8572e44caf..4b7c4e0027 100644 --- a/content/applications/productivity/iot/config.rst +++ b/content/applications/productivity/iot/config.rst @@ -13,3 +13,4 @@ Configuration config/https_certificate_iot config/flash_sdcard config/troubleshooting + config/windows_iot diff --git a/content/applications/productivity/iot/config/connect.rst b/content/applications/productivity/iot/config/connect.rst index 1b1b472ba9..218632c599 100644 --- a/content/applications/productivity/iot/config/connect.rst +++ b/content/applications/productivity/iot/config/connect.rst @@ -1,81 +1,181 @@ -=================================== -Connect an IoT Box to your database -=================================== +========================== +Connect an IoT box to Odoo +========================== -Install the Internet of Things (IoT) App on your Odoo Database. +An Internet of Things (IoT) box is a micro-computer device that allows for the connection of input +and output devices to an Odoo database. An :abbr:`IoT (Internet of Things)` box subscription is +required in order to use the :abbr:`IoT (Internet of Things)` box with a secured connection. A +computer is also required to set up the :abbr:`IoT (Internet of Things)` box. -.. image:: connect/connect01.png +.. seealso:: + `IoT Box FAQ `_ + +Begin the :abbr:`IoT (Internet of Things)` configuration process by :ref:`installing the IoT app +` on the Odoo database through the :menuselection:`Apps` application. + +.. image:: connect/install-iot-app.png :align: center + :alt: The Internet of Things (IoT) app on the Odoo database. -Go in the IoT App and click on Connect on the IoT Boxes page. +Next, after the *IoT app* is installed, navigate to :menuselection:`IoT app --> IoT Boxes`, and then +click on the :guilabel:`Connect` button located in the upper-left corner of the :menuselection:`IoT +Boxes` dashboard. -.. image:: connect/connect02.png +.. image:: connect/connect-iot.png :align: center + :alt: Connecting an IoT box to the Odoo database. -Follow the steps to connect your IoT Box. +There are two recommended ways to connect the :abbr:`IoT (Internet of Things)` box to the database +once the *IoT app* is installed. Follow the steps in either of the next two sections to connect the +:abbr:`IoT (Internet of Things)` box via :ref:`wired ethernet connection ` or +via :ref:`WiFi `. -.. image:: connect/connect03.png +.. image:: connect/connect-iot-box.png :align: center + :alt: Connection steps for a wired connection or WiFi connection. -Ethernet Connection -=================== +.. 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 ` with the + most up-to-date disk image. -#. Connect to the IoT Box all the devices that have to be connected with - cables (ethernet, usb devices, etc.). +.. _iot_connect/ethernet: -#. Power on the IoT Box. +Ethernet connection +=================== -#. Read the Pairing Code from a screen or a receipt printer connected to the IoT Box. +The following is the process to connect the :abbr:`IoT (Internet of Things)` box via an ethernet +cable to the Odoo database (by way of the ethernet port; RJ-45). - .. image:: connect/connect04.png +First, connect all wired devices to the :abbr:`IoT (Internet of Things)` box (ethernet, :abbr:`USB +(Universal Serial Bus)` devices, etc.). At minimum, an HDMI screen should be connected. Then, plug +the :abbr:`IoT (Internet of Things)` box into a power source. -#. Input the Pairing Code and click on the Pair button. +Immediately after the unit powers on and boots up, read the *pairing code* from the screen or from +the printout of a receipt printer connected to the :abbr:`IoT (Internet of Things)` box. + +.. warning:: + By default, the :abbr:`IoT (Internet of Things)` box will display the *pairing code* for a + maximum of 5 minutes after the unit boots up. After 5 minutes, the *pairing code* will disappear + for security purposes and the :abbr:`IoT (Internet of Things)` box will need to be rebooted + manually by unplugging the unit from the power source for ten seconds and re-plugging it back in. .. note:: - Recent changes in modern web browsers forced us to modify the connection wizard. - If your screen is different from the screenshots, make sure that the - ``iot_pairing`` module is installed. + If no screen is attached to the :abbr:`IoT (Internet of Things)` box, then the *pairing code* can + be accessed from the :abbr:`IoT (Internet of Things)` box homepage by clicking on the + :guilabel:`POS Display` button. For instructions on how to access the :abbr:`IoT (Internet of + Things)` box homepage visit :ref:`iot_connect/token`. + +On the computer, navigate to :menuselection:`IoT app --> IoT Boxes`, and then click on the +:guilabel:`Connect` button located in the upper-left corner of the the :menuselection:`IoT Boxes` +dashboard. Input the *pairing code* in the :guilabel:`Pairing Code` field and click on the +:guilabel:`Pair` button. The database will now link to the :abbr:`IoT (Internet of Things)` box and +it will appear on the :menuselection:`IoT Boxes` page. + +.. _iot_connect/wifi: -WiFi Connection +WiFi connection =============== -#. Power on the IoT Box +The following is the process to connect the :abbr:`IoT (Internet of Things)` box via a WiFi +connection to the Odoo database. -#. Copy the token +First, ensure there is no ethernet cable plugged into the :abbr:`IoT (Internet of Things)` box. +Then, connect all wired devices to the :abbr:`IoT (Internet of Things)` box (:abbr:`USB (Universal +Serial Bus)` devices, etc.). - .. image:: connect/connect05.png +After connecting the devices, plug the :abbr:`IoT (Internet of Things)` box into to a power source. +On the computer, navigate to :menuselection:`IoT app --> IoT Boxes`, and then click on the +:guilabel:`Connect` button located in the upper-left corner of the the :menuselection:`IoT Boxes` +dashboard. Then copy the :guilabel:`Token` from the :guilabel:`WiFi connection` section as this will +later be used to link the Odoo database to the :abbr:`IoT (Internet of Things)` box. -#. Connect to the IoT Box WiFi Network (make sure there is no ethernet - cable plugged in your computer). +Back on the computer, navigate to the available WiFi networks and connect to the :abbr:`IoT +(Internet of Things)` box WiFi network. The WiFi network dispersed by the :abbr:`IoT (Internet of +Things)` box will start with `IoTBox-xxxxxxxxxx`. - .. image:: connect/connect06.png +.. image:: connect/connect-iot-wifi.png + :align: center + :alt: WiFi networks available on the computer. -#. You will be redirected to the IoT Box Homepage (if it doesn't work, - connect to the IP address of the box). Give a name to your IoT Box (not - required) and paste the token, then click on next. +Upon connecting to the :abbr:`IoT (Internet of Things)` box WiFi, a browser will automatically +redirect to the :menuselection:`Configure Iot Box` wizard. Name the :abbr:`IoT (Internet of Things)` +box, then paste the previously copied *token* into the :guilabel:`Server Token` field, and then +click on :guilabel:`Next`. - .. image:: connect/connect07.png +.. image:: connect/server-token.png + :align: center + :alt: Enter the server token into the IoT box. - .. tip:: - If you are on Runbot, do not forget to add the -all or -base in the - token (e.g. this token - **http://375228-saas-11-5-iot-f3f920.runbot16.odoo.com\|4957098401** - should become - **http://375228-saas-11-5-iot-f3f920-all.runbot16.odoo.com\|4957098401**). +.. note:: + If the :abbr:`IoT (Internet of Things)` box WiFi connection wizard doesn't start, then see the + documentation on :ref:`connecting with a token `. -#. Choose the WiFi network you want to connect with (enter the password - if there is one) and click on Submit. Wait a few seconds before being - redirected to your database. +Now, choose the WiFi network that the :abbr:`IoT (Internet of Things)` box will connect with (enter +the password if there is one) and click on :guilabel:`Connect`. Wait a few seconds and the browser +will redirect to the :abbr:`IoT (Internet of Things)` box homepage. The computer may need to be +manually re-connected back to the original WiFi connection, if this does not happen automatically. - .. image:: connect/connect08.png +.. image:: connect/configure-wifi-network-iot.png + :align: center + :alt: Configuring the WiFi for the IoT box. -You should now see the IoT Box. +After completing each step, the :abbr:`IoT (Internet of Things)` box should appear when navigating +to :menuselection:`IoT app --> IoT Boxes` on the Odoo database. -.. image:: connect/connect09.png +.. image:: connect/iot-box-connected.png :align: center + :alt: The IoT box has been successfully configured on the Odoo database. + +.. important:: + The :abbr:`IoT (Internet of Things)` box may need to be manually rebooted upon successfully + connecting via WiFi for the box to appear in the *IoT app* on the Odoo database. To do so, simply + unplug the device and plug it back into the power source after ten seconds. + +.. _iot_connect/token: + +Manually connecting the IoT box using the token +=============================================== -IoT Box Schema +A manual connection of the :abbr:`IoT (Internet of Things)` box to the :abbr:`IoT (Internet of +Things)` app can be made using the *token*, from a computer. The *token* can be found by navigating +to :menuselection:`IoT app --> IoT Boxes` and clicking on :guilabel:`Connect`. + +Under the :guilabel:`WiFi Connection` section of the :guilabel:`Connect an IoT Box` page that +appears, click :guilabel:`Copy` to the right of the :guilabel:`Token`. This token will be entered +into the :abbr:`IoT (Internet of Things)` box homepage. + +Access the :abbr:`IoT (Internet of Things)` box homepage by entering the :abbr:`IP (Internet +Protocol)` address of the :abbr:`IoT (Internet of Things)` box into a browser window from a computer +on the same network as the :abbr:`IoT (Internet of Things)` box (preferably by ethernet connection). + +.. note:: + The :abbr:`IP (Internet Protocol)` address can be accessed by the router admin console that the + :abbr:`IoT (Internet of Things)` box is connected to, or by connecting a receipt printer to the + :abbr:`IoT (Internet of Things)` box. A receipt will print out with the :abbr:`IoT (Internet of + Things)` box's :abbr:`IP (Internet Protocol)` address on it. + +On the :abbr:`IoT (Internet of Things)` box homepage, enter the *token* under the :guilabel:`Server` +section by clicking on :guilabel:`Configure`. Then, paste the *token* into the :guilabel:`Server +Token` field and click :guilabel:`Connect`. The :abbr:`IoT (Internet of Things)` box will then link +to the Odoo database. + +.. _iot/connect_schema: + +IoT box schema ============== -.. image:: connect/connect10.png - :align: center +Raspberry Pi 4 +-------------- + +.. figure:: connect/iot-box-schema.png + + The Odoo IoT box (Raspberry Pi 4) schema with labels. + +Raspberry Pi 3 +-------------- + +.. figure:: connect/iox-box-schema-3.png + + The Odoo IoT box (Raspberry Pi 3) schema with labels. diff --git a/content/applications/productivity/iot/config/connect/configure-wifi-network-iot.png b/content/applications/productivity/iot/config/connect/configure-wifi-network-iot.png new file mode 100644 index 0000000000..3fd18b14f5 Binary files /dev/null and b/content/applications/productivity/iot/config/connect/configure-wifi-network-iot.png differ diff --git a/content/applications/productivity/iot/config/connect/connect-iot-box.png b/content/applications/productivity/iot/config/connect/connect-iot-box.png new file mode 100644 index 0000000000..1ff0c969f6 Binary files /dev/null and b/content/applications/productivity/iot/config/connect/connect-iot-box.png differ diff --git a/content/applications/productivity/iot/config/connect/connect-iot-wifi.png b/content/applications/productivity/iot/config/connect/connect-iot-wifi.png new file mode 100644 index 0000000000..660a5836d0 Binary files /dev/null and b/content/applications/productivity/iot/config/connect/connect-iot-wifi.png differ diff --git a/content/applications/productivity/iot/config/connect/connect-iot.png b/content/applications/productivity/iot/config/connect/connect-iot.png new file mode 100644 index 0000000000..f4acfa7682 Binary files /dev/null and b/content/applications/productivity/iot/config/connect/connect-iot.png differ diff --git a/content/applications/productivity/iot/config/connect/connect02.png b/content/applications/productivity/iot/config/connect/connect02.png deleted file mode 100644 index ef65c49110..0000000000 Binary files a/content/applications/productivity/iot/config/connect/connect02.png and /dev/null differ diff --git a/content/applications/productivity/iot/config/connect/connect03.png b/content/applications/productivity/iot/config/connect/connect03.png deleted file mode 100644 index 27b0ea912c..0000000000 Binary files a/content/applications/productivity/iot/config/connect/connect03.png and /dev/null differ diff --git a/content/applications/productivity/iot/config/connect/connect04.png b/content/applications/productivity/iot/config/connect/connect04.png deleted file mode 100644 index 18a37f300b..0000000000 Binary files a/content/applications/productivity/iot/config/connect/connect04.png and /dev/null differ diff --git a/content/applications/productivity/iot/config/connect/connect05.png b/content/applications/productivity/iot/config/connect/connect05.png deleted file mode 100644 index b9b7fedc59..0000000000 Binary files a/content/applications/productivity/iot/config/connect/connect05.png and /dev/null differ diff --git a/content/applications/productivity/iot/config/connect/connect06.png b/content/applications/productivity/iot/config/connect/connect06.png deleted file mode 100644 index b078174127..0000000000 Binary files a/content/applications/productivity/iot/config/connect/connect06.png and /dev/null differ diff --git a/content/applications/productivity/iot/config/connect/connect07.png b/content/applications/productivity/iot/config/connect/connect07.png deleted file mode 100644 index e1fa3e23d9..0000000000 Binary files a/content/applications/productivity/iot/config/connect/connect07.png and /dev/null differ diff --git a/content/applications/productivity/iot/config/connect/connect08.png b/content/applications/productivity/iot/config/connect/connect08.png deleted file mode 100644 index e5dcedc846..0000000000 Binary files a/content/applications/productivity/iot/config/connect/connect08.png and /dev/null differ diff --git a/content/applications/productivity/iot/config/connect/connect09.png b/content/applications/productivity/iot/config/connect/connect09.png deleted file mode 100644 index 7022ed3314..0000000000 Binary files a/content/applications/productivity/iot/config/connect/connect09.png and /dev/null differ diff --git a/content/applications/productivity/iot/config/connect/connect10.png b/content/applications/productivity/iot/config/connect/connect10.png deleted file mode 100644 index 602ac5834d..0000000000 Binary files a/content/applications/productivity/iot/config/connect/connect10.png and /dev/null differ diff --git a/content/applications/productivity/iot/config/connect/connect01.png b/content/applications/productivity/iot/config/connect/install-iot-app.png similarity index 100% rename from content/applications/productivity/iot/config/connect/connect01.png rename to content/applications/productivity/iot/config/connect/install-iot-app.png diff --git a/content/applications/productivity/iot/config/connect/iot-box-connected.png b/content/applications/productivity/iot/config/connect/iot-box-connected.png new file mode 100644 index 0000000000..d51a5c0858 Binary files /dev/null and b/content/applications/productivity/iot/config/connect/iot-box-connected.png differ diff --git a/content/applications/productivity/iot/config/connect/iot-box-schema.png b/content/applications/productivity/iot/config/connect/iot-box-schema.png new file mode 100644 index 0000000000..41e99c8ded Binary files /dev/null and b/content/applications/productivity/iot/config/connect/iot-box-schema.png differ diff --git a/content/applications/productivity/iot/config/connect/iox-box-schema-3.png b/content/applications/productivity/iot/config/connect/iox-box-schema-3.png new file mode 100644 index 0000000000..3d9319e197 Binary files /dev/null and b/content/applications/productivity/iot/config/connect/iox-box-schema-3.png differ diff --git a/content/applications/productivity/iot/config/connect/server-token.png b/content/applications/productivity/iot/config/connect/server-token.png new file mode 100644 index 0000000000..d041790a96 Binary files /dev/null and b/content/applications/productivity/iot/config/connect/server-token.png differ diff --git a/content/applications/productivity/iot/config/flash_sdcard.rst b/content/applications/productivity/iot/config/flash_sdcard.rst index cef0d44935..7891f3f2c2 100644 --- a/content/applications/productivity/iot/config/flash_sdcard.rst +++ b/content/applications/productivity/iot/config/flash_sdcard.rst @@ -1,37 +1,68 @@ -===================== -Flashing your SD Card -===================== +==================== +Flashing the SD card +==================== -In some case, you may need to reflash your IoT Box’s SD Card to benefit -from our latest updates. +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 homepage -================================= +Upgrade from the IoT box home page +================================== -Go to the IoT Box homepage, click on *Update*, next to the version number. -If a new version of the IoT Box image is available, you will see a -*Upgrade to ___* button a the bottom of the page, the IoT Box will then -flash itself to the new version of the IoT Box. All of your configurations -will be saved. +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 IoT Box as it would leave it in an inconsistent state. + 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_sdcard01.png +.. 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. -Upgrade with Etcher -=================== +Navigate to Balena's website and download `Etcher `_. It's a free and +open-source utility used for burning image files onto drives. Click to `download +`_. Install and launch the program on the computer. -Go to Balena’s website and download `Etcher `__. -It’s a free and open-source utility used for burning image files. -Install and launch it. Download the latest image from `nightly -`__. +Then download the version-specific :abbr:`IoT (Internet of Things)` image from `nightly +`_. -Then, open *Etcher* and select *Flash from file*, find the image you just -downloaded. Insert the IoT Box SD card into your computer and select it. -Click on *Flash* and wait for the process to finish. +The following are image versions on the `nightly `_ website +with their corresponding Odoo database version: -.. image:: flash_sdcard/flash_sdcard02.png +- 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 `_. diff --git a/content/applications/productivity/iot/config/flash_sdcard/etcher-app.png b/content/applications/productivity/iot/config/flash_sdcard/etcher-app.png new file mode 100644 index 0000000000..2163de85f0 Binary files /dev/null and b/content/applications/productivity/iot/config/flash_sdcard/etcher-app.png differ diff --git a/content/applications/productivity/iot/config/flash_sdcard/flash-upgrade.png b/content/applications/productivity/iot/config/flash_sdcard/flash-upgrade.png new file mode 100644 index 0000000000..344cd2aa3d Binary files /dev/null and b/content/applications/productivity/iot/config/flash_sdcard/flash-upgrade.png differ diff --git a/content/applications/productivity/iot/config/flash_sdcard/flash_sdcard01.png b/content/applications/productivity/iot/config/flash_sdcard/flash_sdcard01.png deleted file mode 100644 index 0bb3533833..0000000000 Binary files a/content/applications/productivity/iot/config/flash_sdcard/flash_sdcard01.png and /dev/null differ diff --git a/content/applications/productivity/iot/config/flash_sdcard/flash_sdcard02.png b/content/applications/productivity/iot/config/flash_sdcard/flash_sdcard02.png deleted file mode 100644 index 08e4c1b251..0000000000 Binary files a/content/applications/productivity/iot/config/flash_sdcard/flash_sdcard02.png and /dev/null differ diff --git a/content/applications/productivity/iot/config/pos.rst b/content/applications/productivity/iot/config/pos.rst index 590640ebed..715da84aa2 100644 --- a/content/applications/productivity/iot/config/pos.rst +++ b/content/applications/productivity/iot/config/pos.rst @@ -1,67 +1,67 @@ -=========================== -Use the IoT Box for the PoS -=========================== - -.. image:: pos/pos01.png - :align: center +========================= +Use an IoT box with a PoS +========================= Prerequisites ============= -Before starting, make sure you have the following: - -- An IoT Box, with its power adapter. - -- A computer or tablet with an up-to-date web browser - -- A running Odoo Online or Odoo instance with the Point of Sale and IoT apps - installed - -- A local network setup with DHCP (this is the default setting) - -- An RJ45 Ethernet Cable (optional, WiFi is built in) - -- Any of the supported hardware (receipt printer, barcode scanner, - cash drawer, payment terminal, scale, customer display, etc.). - The list of supported hardware can be found on the `POS Hardware - page `__ - -Set Up -====== - -To connect hardware to the PoS, the first step is to connect an IoT Box -to your database. For this, follow this -:doc:`documentation `. - -Then, you have to connect the peripheral devices to your IoT Box. - -- **Printer**: Connect a supported receipt printer to a USB port or to - the network and power it on. - -- **Cash drawer**: The cash drawer should be connected to the printer - with an RJ25 cable. - -- **Barcode scanner**: Connect your barcode scanner. In order for your - barcode scanner to be compatible it must end barcodes with an Enter - character (keycode 28). This is most likely the default configuration - of your barcode scanner. - -- **Scale**: Connect your scale and power it on. - -- **Customer Display**: Connect a screen to the IoT Box to display the - PoS order. Please refer to - :doc:`/applications/productivity/iot/devices/screen`. - -- **Payment terminal**: The connection process depends on the terminal, - please refer to the :doc:`payment terminals documentation - `. - -Once it's done, you can connect the IoT Box to your PoS. For this, go in -:menuselection:`Point of Sale --> Configuration --> PoS`, tick *IoT Box* -and select the devices you want to use in this Point of Sale. Save the -changes. - -.. image:: pos/pos02.png +Before starting, make sure the following equipment is available: + +- An :abbr:`IoT (Internet of Things)` box, with its power adapter. +- A computer or tablet with an up-to-date web browser. +- Odoo Online or an Odoo instance with the *Point of Sale* and *IoT* applications installed. +- A local network set up with :abbr:`DHCP (Dynamic Host Configuration Protocol)` (this is the + default setting). +- An RJ45 Ethernet Cable (optional, but preferred over WiFi, which is already built in). +- Any of the supported hardware (receipt printer, barcode scanner, cash drawer, payment terminal, + scale, customer display, etc.). The list of supported hardware can be found on the `POS Hardware + page `_. + +Setup +===== + +.. figure:: pos/pos-connections.png + + A suggested configuration for a point of sale system. + +To connect hardware to the :abbr:`PoS (Point of Sale)`, the first step is to connect an :abbr:`IoT +(Internet of Things)` box to the database. To do this, follow these instructions: :doc:`Connect an +Internet of Things (IoT) box to the Odoo database `. + +Then, connect the peripheral devices to the :abbr:`IoT (Internet of Things)` box. + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Device Name + - Instructions + * - Printer + - Connect a supported receipt printer to a :abbr:`USB (Universal Serial Bus)` port or + to the network, and power it on. Refer to + :doc:`/applications/sales/point_of_sale/restaurant/kitchen_printing`. + * - Cash drawer + - The cash drawer should be connected to the printer with an RJ25 cable. + * - Barcode scanner + - In order for the barcode scanner to be compatible it must end barcodes with an `ENTER` + character (keycode 28). This is most likely the default configuration of the barcode scanner. + * - Scale + - Connect the scale and power it on. Refer to + :doc:`/applications/productivity/iot/devices/scale`. + * - Customer display + - Connect a screen to the :abbr:`IoT (Internet of Things)` box to display the :abbr:`PoS (Point + of Sale)` order. Refer to :doc:`/applications/productivity/iot/devices/screen`. + * - Payment terminal + - The connection process depends on the terminal. Refer to the :doc:`payment terminals + documentation `. + +Once this is completed, connect the :abbr:`IoT (Internet of Things)` box to the :menuselection:`PoS` +application. To do this, go to :menuselection:`Point of Sale --> Configuration --> PoS`, tick the +:guilabel:`IoT Box` option, and select the devices to be used in this :abbr:`PoS (Point of Sale)`. +:guilabel:`Save` the the changes. + +.. image:: pos/iot-connected-devices.png :align: center + :alt: Configuring the connected devices in the POS application. -Set up is done, you can launch a new PoS Session. +Once set up is done, a new :abbr:`PoS (Point of Sale)` session can be launched. diff --git a/content/applications/productivity/iot/config/pos/iot-connected-devices.png b/content/applications/productivity/iot/config/pos/iot-connected-devices.png new file mode 100644 index 0000000000..bbd116b598 Binary files /dev/null and b/content/applications/productivity/iot/config/pos/iot-connected-devices.png differ diff --git a/content/applications/productivity/iot/config/pos/pos-connections.png b/content/applications/productivity/iot/config/pos/pos-connections.png new file mode 100644 index 0000000000..af3eebc759 Binary files /dev/null and b/content/applications/productivity/iot/config/pos/pos-connections.png differ diff --git a/content/applications/productivity/iot/config/pos/pos01.png b/content/applications/productivity/iot/config/pos/pos01.png deleted file mode 100644 index a8cf13a076..0000000000 Binary files a/content/applications/productivity/iot/config/pos/pos01.png and /dev/null differ diff --git a/content/applications/productivity/iot/config/pos/pos02.png b/content/applications/productivity/iot/config/pos/pos02.png deleted file mode 100644 index abb964a6c4..0000000000 Binary files a/content/applications/productivity/iot/config/pos/pos02.png and /dev/null differ diff --git a/content/applications/productivity/iot/config/troubleshooting.rst b/content/applications/productivity/iot/config/troubleshooting.rst index ecd6557554..679dc9a7bc 100644 --- a/content/applications/productivity/iot/config/troubleshooting.rst +++ b/content/applications/productivity/iot/config/troubleshooting.rst @@ -2,133 +2,156 @@ Troubleshooting =============== -IoT Box Connection +IoT box connection ================== -I can't find the pairing code to connect my IoT Box ---------------------------------------------------- +Unable to locate the pairing code to connect the IoT box +-------------------------------------------------------- -The pairing code should be printed on receipt printers connected to the -IoT Box and should also be displayed on connected monitors. +The pairing code should be printed on receipt printers connected to the :abbr:`IoT (Internet of +Things)` box and should also be displayed on connected monitors. The pairing code doesn't show under the following circumstances: -- The IoT Box is already connected to an Odoo database; +- The :abbr:`IoT (Internet of Things)` box is already connected to an Odoo database. +- The :abbr:`IoT (Internet of Things)` box is not connected to the Internet. +- The code is only valid for 5 minutes after the :abbr:`IoT (Internet of Things)` box has started. + It's 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 `). -- The IoT Box is not connected to the Internet; +If none of the cases listed above correct the issue, then make sure that the :abbr:`IoT (Internet of +Things)` box has correctly started, by checking that a fixed green LED is showing next to the power +port. -- The code is only valid for 5 minutes after the IoT Box has started. It's - automatically removed from connected displays when this delay has expired; +IoT box is connected but it's not showing in the database +--------------------------------------------------------- -- The version of the IoT Box image is too old. It should use version 20.06 - or more recent. If your IoT Box image is from an earlier version, then - you will have to reflash the SD card of your IoT Box to update the image - (see :doc:`Flashing your SD Card `) +When an :abbr:`IoT (Internet of Things)` box connects to a database, it may restart. If so, it can +take up to five minutes before appearing in the database. If the :abbr:`IoT (Internet of Things)` +box is still not showing after five minutes, make sure that the :abbr:`IoT (Internet of Things)` box +can reach the database and that the server doesn't use a multi-database environment. -If you are not in any of the cases listed above, make sure that the IoT Box -has correctly started, by checking that a fixed green LED is showing next to -the micro-USB port. +To access the database from the :abbr:`IoT (Internet of Things)` box, open a browser and type in the +database address. -I've connected my IoT Box but it's not showing in my database -------------------------------------------------------------- +The IoT box is connected to the Odoo database, but cannot be reached +-------------------------------------------------------------------- -When you connect an IoT Box to a database, the IoT Box might restart, if -that is the case, it might take up to one minute before appearing in your -database. If after some time the IoT is still not showing, make sure that -your database can be reached from the IoT Box and that your server doesn't -use a multi-database environment. +Make sure that the :abbr:`IoT (Internet of Things)` box and the computer running the browser are +located on the same network, as the :abbr:`IoT (Internet of Things)` box cannot be reached from +outside the local network. -My IoT Box is connected to my database, but cannot be reached -------------------------------------------------------------- +The HTTPS certificate doesn't generate +-------------------------------------- -Make sure that the IoT Box and the device running the browser are located -on the same network as the IoT Box cannot be reached from outside the local -network. +In order to generate a :abbr:`HTTPS (Hypertext Transfer Protocol Secure)` certificate, an IoT box +subscription is required for the :abbr:`IoT (Internet of Things)` box. Connecting the :abbr:`IoT +(Internet of Things)` box prior to configuring an :abbr:`IoT (Internet of Things)` subscription for +the database and :abbr:`IoT (Internet of Things)` box with the Account Manager will result in an +unsecured connection. + +In addition, a firewall can also prevent the :abbr:`HTTPS (Hypertext Transfer Protocol Secure)` +certificate from generating correctly. In this case, deactivate the firewall until the certificate +is successfully generated. It should also be noted that certain devices, such as a router that has +a built-in firewall, can prevent the :abbr:`HTTPS (Hypertext Transfer Protocol Secure)` certificate +from generating. + +.. seealso:: + :doc:`HTTPS certificate (IoT) ` Printer ======= -My printer is not detected --------------------------- +The printer is not detected +--------------------------- -If one of your printers doesn't show up in your devices list, go to the -IoT Box homepage and make sure that it is listed under *Printers*. +If a printer doesn't show up in the devices list, go to the :abbr:`IoT (Internet of Things)` box +homepage and make sure that it is listed under :guilabel:`Printers`. -.. image:: troubleshooting/troubleshooting_printer_01.png +.. image:: troubleshooting/printer-status.png :align: center + :alt: The IoT box Home Page landing page. -If your printer is not present on the IoT Box homepage, hit -*Printers Server*, go to the *Administration* tab and click on -*Add Printer*. If you can't find your printer in the list, it's probably -not connected properly. +If the printer is not present on the :abbr:`IoT (Internet of Things)` box homepage, click +:guilabel:`Printers Server`, go to the :guilabel:`Administration` tab and click on :guilabel:`Add +Printer`. If the printer is not present in the list, it's likely not connected properly. -My printer outputs random text ------------------------------- +The printer outputs random text +------------------------------- -For most printers, the correct driver should be automatically detected -and selected. However, in some cases, the automatic detection mechanism -might not be enough, and if no driver is found the printer might print -random characters. +For most printers, the correct driver should be automatically detected and selected. However, in +some cases, the automatic detection mechanism might not be enough, and if no driver is found, the +printer might print random characters. -The solution is to manually select the corresponding driver. On the IoT -Box homepage, click on *Printers Server*, go to the *Printers* -tab and select the printer in the list. In the Administration dropdown, -click on *Modify Printer*. Follow the steps and select the Make and Model -corresponding to your printer. +The solution is to manually select the corresponding driver. On the :abbr:`IoT (Internet of Things)` +box homepage, click on :guilabel:`Printers Server`, go to the :guilabel:`Printers` tab and select +the printer in the list. In the :guilabel:`Administration` dropdown, click on :guilabel:`Modify +Printer`. Follow the steps and select the *make* and *model* corresponding to the printer. -.. image:: troubleshooting/troubleshooting_printer_02.png +.. image:: troubleshooting/modify-printer.png :align: center + :alt: Edit the printer connected to the IoT box. .. note:: - Epson and Star receipt printers and Zebra label printers do not - need a driver to work. Make sure that no driver is selected for those - printers. + Epson and Star receipt printers and Zebra label printers do not need a driver to work. Make sure + that no driver is selected for those printers. + +The Zebra printer doesn't print anything +---------------------------------------- -My Zebra Printer doesn't print anything ---------------------------------------- +Zebra printers are quite sensitive to the format of the Zebra Programming Language (ZPL) code that +is printed. If nothing comes out of the printer or blank labels are printed, try changing the format +of the report that is sent to the printer by accessing :menuselection:`Settings --> Technical --> +User Interface --> Views` in :ref:`developer mode ` and look for the corresponding +template. -Zebra printers are quite sensitive to the format of the ZPL code that is -printed. If nothing comes out of the printer or blank labels are printed, -try changing the format of the report that is sent to the printer by -accessing :menuselection:`Settings ~~> Technical ~~> Views` in developer -mode and look for the corresponding template. +.. seealso:: + Check out Zebra's instructions on printing :abbr:`ZPL (Zebra Programming Language)` files + `here + `_. -Barcode Scanner +Barcode scanner =============== The characters read by the barcode scanner don't match the barcode ------------------------------------------------------------------ -By default, we assume that your barcode scanner is configured in US -QWERTY. This is the default configuration of most barcode readers. -If your barcode scanner uses a different layout, please go to the -form view of your device and select the correct one. +By default, most barcode scanners are configured in the US QWERTY format. If the barcode scanner +uses a different layout, go to the form view of the device (:menuselection:`IoT App --> Devices --> +Barcode Device`) and select the correct format. Nothing happens when a barcode is scanned ----------------------------------------- -Make sure that the correct device is selected in your Point of Sale -configuration and that your barcode is configured to send an ENTER -character (keycode 28) at the end of every barcode. +Make sure that the correct device is selected in the :menuselection:`Point of Sale` configuration +and that the barcode is configured to send an `ENTER` character (keycode 28) at the end of every +barcode. To do so, navigate to :menuselection:`PoS app --> 3-Dot Menu on the PoS --> IoT Box section +--> Edit`. The barcode scanner is detected as a keyboard --------------------------------------------- -Some poorly built barcode scanners do not advertise themselves as -barcode scanners but as a USB keyboard instead, and will not be -recognized by the IoT Box. +.. important:: + Some barcode scanners do not advertise themselves as barcode scanners but as a USB keyboard + instead, and will not be recognized by the :abbr:`IoT (Internet of Things)` box. -You can manually change the device type by going to its form view and -activating the *Is scanner* option. +The device type can be manually changed by going to its form view (:menuselection:`IoT App --> +Devices --> Barcode Device`) and activating the :guilabel:`Is scanner` option. -.. image:: troubleshooting/troubleshooting_barcode_01.png +.. image:: troubleshooting/barcode-scanner-settings.png :align: center + :alt: Modifying the form view of the barcode scanner. -Cashdrawer -========== +Cash drawer +=========== -The cashdrawer does not open ----------------------------- +The cash drawer does not open +----------------------------- -The cashdrawer should be connected to the printer and the *Cashdrawer* -checkbox should be ticked in the POS configuration. +The cash drawer should be connected to the printer and the :guilabel:`Cash drawer` checkbox should +be ticked in the :abbr:`PoS (Point of Sale)` configuration. To do so, navigate to +:menuselection:`POS app --> 3-Dot Menu on the POS --> IoT Box section --> Edit --> Receipt Printer +--> Cashdrawer checkbox`. diff --git a/content/applications/productivity/iot/config/troubleshooting/troubleshooting_barcode_01.png b/content/applications/productivity/iot/config/troubleshooting/barcode-scanner-settings.png similarity index 100% rename from content/applications/productivity/iot/config/troubleshooting/troubleshooting_barcode_01.png rename to content/applications/productivity/iot/config/troubleshooting/barcode-scanner-settings.png diff --git a/content/applications/productivity/iot/config/troubleshooting/troubleshooting_printer_02.png b/content/applications/productivity/iot/config/troubleshooting/modify-printer.png similarity index 100% rename from content/applications/productivity/iot/config/troubleshooting/troubleshooting_printer_02.png rename to content/applications/productivity/iot/config/troubleshooting/modify-printer.png diff --git a/content/applications/productivity/iot/config/troubleshooting/troubleshooting_printer_01.png b/content/applications/productivity/iot/config/troubleshooting/printer-status.png similarity index 100% rename from content/applications/productivity/iot/config/troubleshooting/troubleshooting_printer_01.png rename to content/applications/productivity/iot/config/troubleshooting/printer-status.png diff --git a/content/applications/productivity/iot/config/windows_iot.rst b/content/applications/productivity/iot/config/windows_iot.rst new file mode 100644 index 0000000000..845fe4d45c --- /dev/null +++ b/content/applications/productivity/iot/config/windows_iot.rst @@ -0,0 +1,185 @@ +======================== +Connect Windows IoT Odoo +======================== + +A Virtual IoT box is a computer program that needs to be downloaded and installed on a Windows +computer. This requires a Windows operating system with an Odoo 16 or later database. + +The Windows virtual :abbr:`IoT (Internet of Things)` box works the same way as a physical :abbr:`IoT +(Internet of Things)` box, with the ability to run most of the same devices. All :abbr:`POS (Point +of Sale)` devices work with it, such as a scale or printer. Payment terminals will also work, but it +should be noted that :abbr:`MRP (Material Requirement Planning)` devices are not compatible. *These +include cameras or measurement tools.* + +Pre-requisites +============== + +The following items will be needed to complete the Windows :abbr:`IoT (Internet of Things)` +installation. + +- Odoo 16 database or any version above. +- :abbr:`IoT (Internet of Things)` compatible devices (except those mentioned above). Refer to: + `Odoo's compatible IoT devices `_. +- Device drivers for Windows. + + .. note:: + Odoo recommends using an updated, recent version of Windows (Windows 10/11) as some older + operating systems can cause the Windows virtual :abbr:`IoT (Internet of Things)` to not work. + +- Windows computer (laptop, desktop, or server). +- Odoo :abbr:`IoT (Internet of Things)` subscription. Refer to: :ref:`iot/iot-eligibility`. + +Connect the Windows virtual Iot box to an Odoo database +======================================================= + +The Windows virtual IoT box is simple to setup in just a few easy steps. Follow this process when +installing the Windows virtual IoT software for the first time. + +Download and initial installation +--------------------------------- + +To begin the installation, navigate to the Odoo 16 or higher installation package for Enterprise or +Community - Windows edition at `Odoo's download page `_. Next, install +and setup the Odoo :file:`.exe` file. After the instructions screen, click :guilabel:`Next` to start +the installation and agree to the :abbr:`TOS (Terms of Service)`. + +During the next step of the installation, select :guilabel:`Odoo IoT` from the :guilabel:`Select the +type of install` dropdown. + +.. example:: + For reference, the following should be installed: + + - **Odoo server** + - **Odoo IoT** + - **Nginx WebServer** + - **Ghostscript interpreter** + +Ensure there is enough space on the computer for the installation and click :guilabel:`Next`. + +Setting the destination and completing the installation +------------------------------------------------------- + +To complete the installation, select the :guilabel:`Destination Folder` and click +:guilabel:`Install`. + +.. tip:: + Choosing ``C:\odoo`` as the install location will allow for the Nginx server to start. If the + folder doesn't exist, then create it. Otherwise the installation files will be spread throughout + the hard drive. + +.. warning:: + Odoo's Windows virtual IoT software shouldn't be installed inside any of the Window's User's + directories. Doing so won't allow for Nginx to initialize. + +The installation may take a few minutes. When complete, click :guilabel:`Next` to continue. + +Ensure that the :guilabel:`Start Odoo` box is checked and click :guilabel:`Finish`. After +installation, the Odoo server will run and automatically open `http://localhost:8069` on your web +browser. The webpage should display the :abbr:`IoT (Internet of Things)` box homepage. + +.. seealso:: + A restart of the Windows IoT program may be necessary should the web browser not display + anything. :ref:`iot/restart_windows_iot` + +Connecting devices +------------------ + +Next, connect the :abbr:`IoT (Internet of Things)` devices to the Windows computer. Windows should +automatically detect the device because the driver is pre-installed on the computer. If not, search +for and install the Windows driver for the device. + +Following connecting devices to the computer, refresh the :abbr:`IoT (Internet of Things)` box +homepage and verify the device is seen. If not, reload the handlers through the :abbr:`IoT (Internet +of Things)` box homepage. + +Finally, connect Windows :abbr:`IoT (Internet of Things)` to a database using existing instructions +(manually using the Token). + +.. seealso:: + :doc:`/applications/productivity/iot/config/connect` + +Now the installation is complete, the devices connected to :abbr:`IoT (Internet of Things)` can be +used to complete processes/actions. + +Troubleshooting +=============== + +.. _iot/restart_windows_iot: + +Restart Windows IoT box +----------------------- + +In some instances a manual restart of the physical :abbr:`IoT (Internet of Things)` box can resolve +the issue of an :abbr:`IoT (Internet of Things)` box not showing up on the database. For the Windows +virtual :abbr:`IoT (Internet of Things)` box a manual restart of the Odoo server can resolve +database connection issues. + +To restart the virtual Windows IoT server: + +#. Type `Services` into the Windows :guilabel:`Search Bar`. +#. Select the :menuselection:`Services` App and scroll down to the :guilabel:`Odoo` service. +#. Right click on :guilabel:`Odoo` and select :guilabel:`Start` or :guilabel:`Restart`. This action + will manually restart the Odoo IoT server. + +Firewalls +--------- + +Firewalls keep devices safe and secure. Sometimes they can block connections that should be made +though. The Windows virtual :abbr:`IoT (Internet of Things)` box software may not be reachable to +the :abbr:`LAN (Local Area Network)` due to a firewall preventing the connection. Consult your local +IT support team to make exceptions (network discovery) in the :abbr:`OS (Operating System)` or +firewall program. Windows has their own firewall as do other virus protection programs. + +.. example:: + A client might encounter a time when they are able to reach the homepage of the :abbr:`IoT + (Internet of Things)` box, yet they cannot access it from another computer/mobile device/tablet + on the same network. + +Making an exception on Windows Defender +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It's possible to allow other devices to access the Windows virtual :abbr:`IoT (Internet of Things)` +box while keeping the firewall on. This is done by creating a rule on *Windows Defender* and +allowing communication through port `8069`. The following process describes the steps to take in +order to make this exception. + +Create a rule in Windows Defender +********************************* + +First, open the *Windows Firewall* by navigating to the :menuselection:`Start Menu` and typing in +`Firewall`. Then, open the :menuselection:`Windows Defender Firewall` program. In the left-hand +menu, navigate to :guilabel:`Advanced Settings`. + +Once :guilabel:`Advanced Settings` have been selected, click :guilabel:`Inbound Rules` in the +left-hand menu. Then, in the right-hand menu column (under :guilabel:`Inbound Rules`), click on +:guilabel:`New Rule` to create a new rule. + +Configure new rule +****************** + +On the :menuselection:`Rule Type` screen, select :guilabel:`Port`. Then click :guilabel:`Next`. From +the :menuselection:`Protocol and Ports` page leave the rule application to :guilabel:`TCP`. Then, +select :guilabel:`Specific Local Ports` for the :guilabel:`ports` option. In the text box, type in +`8069`. Finally click :guilabel:`Next` to continue to the next step. + +On the :menuselection:`Actions` page, select :guilabel:`Allow the connection` and click +:guilabel:`Next`. The following page on the :menuselection:`Rule Configuration` wizard is the +:guilabel:`Profile` page. On this page, select whichever connection type applies to the network the +Windows machine is operating on. Ideally, select :guilabel:`Private` only connections. The *Private* +connection type is the most secure connection while allowing the selected port to communicate. Click +:guilabel:`Next` to continue. + +Finally, assign a new, unique name to the rule. For example, this name can be `Odoo`. Optionally, +add a brief description in the :guilabel:`Description` field. Click :guilabel:`Finish` to complete +the :guilabel:`Rule Configuration` wizard. Now, the new rule is active and devices can connect to +the Windows virtual :abbr:`IoT (Internet of Things)` box. + +Uninstalling Windows IoT +------------------------ + +Uninstalling the Windows virtual :abbr:`IoT (Internet of Things)` box is done through the Windows +program manager. Using any Windows version, search for `program`. Then, select :guilabel:`Add or +Remove Programs` located in the control panel. Search for `Odoo` and click the :guilabel:`three dot +menu` to uninstall. + +Confirm the un-installation and follow the steps to uninstall through the Odoo uninstall guide. diff --git a/content/applications/productivity/iot/devices/camera.rst b/content/applications/productivity/iot/devices/camera.rst index 2061e2c1c3..e211016c30 100644 --- a/content/applications/productivity/iot/devices/camera.rst +++ b/content/applications/productivity/iot/devices/camera.rst @@ -1,45 +1,82 @@ ================ -Connect a Camera +Connect a camera ================ -When using your *IoT Box* in Odoo, you could need to use a camera. As -it can be done in a few steps, this device is really easy to configure. -Then, you can use it in your manufacturing process and link it to a -control point. Doing so will allow you to take pictures when you reach -the chosen quality control point. +A camera can be connected to an :abbr:`IoT (Internet of Things)` box with an Odoo database in just a +few steps. Once a camera is connected to an :abbr:`IoT (Internet of Things)` box, it can be used in +a manufacturing process, or it can be linked to a quality control point/quality check. Doing so +allows for the taking of pictures when a chosen quality control point/check has been reached, or +when a specific key is pressed during manufacturing. Connection ========== -To connect the camera to the *IoT Box*, simply connect the two by -cable. +To connect a camera to an :abbr:`IoT (Internet of Things)` box, simply connect the two via cable. +This is usually done with a :abbr:`USB (Universal Serial Bus)` cable of some sort. -If your camera is a `*supported -one* `__, there is no need to -set up anything as it will be detected as soon as it is connected. +If the camera is `supported `_, there is no need to set up +anything, as it'll be detected as soon as it's connected. -.. image:: camera/camera_01.png +.. image:: camera/camera-dropdown.png :align: center + :alt: Camera recognized on the IoT box. -Link a Camera to a Quality Control Point -======================================== +Link camera to quality control point in manufacturing process +============================================================= -With the Manufacturing app --------------------------- +In the :menuselection:`Quality app`, a device can be set up on a :guilabel:`Quality Control Point`. +To do that, navigate to the :menuselection:`Quality app --> Quality Control --> Control Points` and +open the desired :guilabel:`Control Point` that'll be linked to the camera. -In your *Quality app*, you can setup the device on a *Quality Control -Point*. Go to the *Control Points* menu, under *Quality Control* -and open the control point you want to link with the camera. +On the control point form, edit the control point by selecting the :guilabel:`Type` field, and +clicking on :guilabel:`Take a Picture` from the drop-down menu. Doing so reveals a field called +:guilabel:`Device`, wherein the attached *device* can be selected. :guilabel:`Save` the changes, if +required. -Now, you can edit the control point and select the device from the -dropdown list. Now, hit save. - -.. image:: camera/camera_03.png +.. image:: camera/control-point-device.png :align: center + :alt: Setting up the device on the quality control point. -Then, your camera can be used with the picked *Control Point*. During -the manufacturing process, reaching the *Quality Control Point* you -chose before will allow you to take a picture. +The camera is now useable with the selected quality control point. When the quality control point +is reached during the manufacturing process, the database prompts the operator to take a picture. -.. image:: camera/camera_04.png +.. image:: camera/serial-number-picture.png :align: center + :alt: Graphic user interface of the device on the quality control point. + +.. note:: + Quality control points can also be accessed by navigating to :menuselection:`IoT App --> + Devices`. From here, select the device. There is a :guilabel:`Quality Control Points` tab, where + they can be added with the device. + +.. tip:: + On a quality check form, the :guilabel:`Type` of check can also be specified to :guilabel:`Take a + Picture`. Navigate to :menuselection:`Quality app --> Quality Control --> Quality Checks --> New` + to create a new quality check from the :guilabel:`Quality Checks` page. + +.. seealso:: + - :doc:`../../../inventory_and_mrp/manufacturing/quality_control/quality_control_points` + - :doc:`../../../inventory_and_mrp/manufacturing/quality_control/quality_alerts` + +Link camera to a work center in the Manufacturing app +===================================================== + +To link a camera to an action, it first needs to be configured on a work center. Navigate to +:menuselection:`Manufacturing app --> Configuration --> Work Centers`. Next, go to the desired +:guilabel:`Work Center` in which a camera will be used to reveal that specific work center's detail +form. From here, add the device in the :guilabel:`IoT Triggers` tab, in the :guilabel:`Device` +column, by clicking :guilabel:`Add a Line`. + +Now, the camera device can be linked to the :guilabel:`Action` column drop-down option labeled +:guilabel:`Take a Picture`. A key can also be added to trigger the action. + +.. important:: + The first trigger listed is chosen first. The order of triggers matters, and they can be dragged + into any desired order. + +.. note:: + On the :guilabel:`Work Order` screen, a status graphic indicates whether the database is + correctly connected to the camera. + +.. seealso:: + :ref:`workcenter_iot` diff --git a/content/applications/productivity/iot/devices/camera/camera_01.png b/content/applications/productivity/iot/devices/camera/camera-dropdown.png similarity index 100% rename from content/applications/productivity/iot/devices/camera/camera_01.png rename to content/applications/productivity/iot/devices/camera/camera-dropdown.png diff --git a/content/applications/productivity/iot/devices/camera/camera_03.png b/content/applications/productivity/iot/devices/camera/camera_03.png deleted file mode 100644 index 59cdf042a4..0000000000 Binary files a/content/applications/productivity/iot/devices/camera/camera_03.png and /dev/null differ diff --git a/content/applications/productivity/iot/devices/camera/control-point-device.png b/content/applications/productivity/iot/devices/camera/control-point-device.png new file mode 100644 index 0000000000..05a7666ae1 Binary files /dev/null and b/content/applications/productivity/iot/devices/camera/control-point-device.png differ diff --git a/content/applications/productivity/iot/devices/camera/camera_04.png b/content/applications/productivity/iot/devices/camera/serial-number-picture.png similarity index 100% rename from content/applications/productivity/iot/devices/camera/camera_04.png rename to content/applications/productivity/iot/devices/camera/serial-number-picture.png diff --git a/content/applications/productivity/iot/devices/footswitch.rst b/content/applications/productivity/iot/devices/footswitch.rst index c30e3347b4..59c5bd534a 100644 --- a/content/applications/productivity/iot/devices/footswitch.rst +++ b/content/applications/productivity/iot/devices/footswitch.rst @@ -1,42 +1,52 @@ ==================== -Connect a Footswitch +Connect a footswitch ==================== -When working, it is always better to have your two hands available. -Using Odoo’s *IoT Box* and a footswitch will allow it. +When working in a manufacturing environment, it's always better for an operator to have both hands +available at all times. Odoo's :abbr:`IoT (Internet of Things)` box makes this possible when using a +footswitch. -In fact, you will be able to go from one screen to another and perform -actions by using your foot and the footswitch. Really convenient, it -can be configured in a few steps. +In fact, with a footswitch, the operator is able to go from one screen to another, and perform +actions using their foot. This can be configured in just a few steps on the work center in the +*Manufacturing* app. Connection ========== -Connecting the footswitch to the *IoT Box* is easy, you just have to -connect the two by cable. +To connect a footswitch to the :abbr:`IoT (Internet of Things)` box, connect the two devices via +cable. More often than not, this is done with a :abbr:`USB (Universal Serial Bus)` cable. -If your footswitch is a `supported -one `__, there is no need to -set up anything since it will be automatically detected when connected. +If the footswitch is a `supported device `_, there is no +need to take further action, since it'll be automatically detected when connected. -.. image:: footswitch/footswitch_01.png +.. image:: footswitch/footswitch-dropdown.png :align: center + :alt: Footswitch recognized on the IoT box. -Link a Footswitch to a Workcenter -================================= +Link a footswitch to a work center in the Odoo Manufacturing app +================================================================ -To link the footswitch to an action, it needs to be configured on a -workcenter. Go to the workcenter you want to use the footswitch in and -add the device in the *IoT Triggers* tab. Then, you can link it to an -action and also add a key to trigger it. +To link a footswitch to an action, it first needs to be configured on a work center. Navigate to +:menuselection:`Manufacturing app --> Configuration --> Work Centers`. From here, go to the desired +:guilabel:`Work Center` in which the footswitch will be used, and add the device in the +:guilabel:`IoT Triggers` tab, under the :guilabel:`Device` column, by selecting :guilabel:`Add a +Line`. Doing so means the footswitch can be linked to an option in the :guilabel:`Action` column +drop-down, and optionally, a key can be added to trigger it. An example of an :guilabel:`Action` in +the *Manufacturing app* could be the :guilabel:`Validate` or :guilabel:`Mark as Done` buttons on a +manufacturing work order. -.. image:: footswitch/footswitch_03.png +.. image:: footswitch/footswitch-example.png :align: center + :alt: Footswitch trigger setup on the Odoo database. -Note that the one that is first in the list will be chosen. So, the -order matters! In the picture above, using the footswitch will, for -example, automatically skip the current part of the process you work on. +.. important:: + It should be noted that the first listed trigger is chosen first. So, the order matters, and + these triggers can be dragged into any order. In the picture above, using the footswitch + automatically skips the part of the process that's currently being worked on. .. note:: - When you are on the work order screen, a status button indicates if you - are correctly connected to the footswitch. + On the :guilabel:`Work Order` screen, a status graphic indicates whether the database is + correctly connected to the footswitch. + +.. seealso:: + :ref:`workcenter_iot` diff --git a/content/applications/productivity/iot/devices/footswitch/footswitch_01.png b/content/applications/productivity/iot/devices/footswitch/footswitch-dropdown.png similarity index 100% rename from content/applications/productivity/iot/devices/footswitch/footswitch_01.png rename to content/applications/productivity/iot/devices/footswitch/footswitch-dropdown.png diff --git a/content/applications/productivity/iot/devices/footswitch/footswitch-example.png b/content/applications/productivity/iot/devices/footswitch/footswitch-example.png new file mode 100644 index 0000000000..45fe58a923 Binary files /dev/null and b/content/applications/productivity/iot/devices/footswitch/footswitch-example.png differ diff --git a/content/applications/productivity/iot/devices/footswitch/footswitch_03.png b/content/applications/productivity/iot/devices/footswitch/footswitch_03.png deleted file mode 100644 index eefd872427..0000000000 Binary files a/content/applications/productivity/iot/devices/footswitch/footswitch_03.png and /dev/null differ diff --git a/content/applications/productivity/iot/devices/measurement_tool.rst b/content/applications/productivity/iot/devices/measurement_tool.rst index 012e59b40f..4185c1df4c 100644 --- a/content/applications/productivity/iot/devices/measurement_tool.rst +++ b/content/applications/productivity/iot/devices/measurement_tool.rst @@ -1,52 +1,90 @@ ========================== -Connect a Measurement Tool +Connect a measurement tool ========================== -With Odoo’s *IoT Box*, it is possible to connect measurement tools to -your database. Find the list of supported devices here: `Supported -devices `__,. +With Odoo's :abbr:`IoT (Internet of Things)` box, it is possible to connect measurement tools to the +Odoo database for use in the *Quality app* on a quality control point/quality check, or for use in a +work center during the manufacturing process. -Connect in USB -============== +Find the list of supported devices here: `Supported devices +`_. -To add a device connected by USB, just plug the USB cable in the *IoT -Box*, and the device should appear in your Odoo database. +Connect with universal serial bus (USB) +======================================= -.. image:: measurement_tool/measurement_tool_01.png - :align: center +To add a device connected by :abbr:`USB (Universal Serial Bus)`, plug the :abbr:`USB (Universal +Serial Bus)` cable into the :abbr:`IoT (Internet of Things)` box, and the device appears in the Odoo +database. -Connect in Bluetooth -==================== +.. image:: measurement_tool/device-dropdown.png + :align: center + :alt: Measurement tool recognized on the IoT box. -Activate the Bluetooth on your device (see your device manual for -further explanation) and the IoT Box will automatically try to connect -to the device. +Connect with bluetooth +====================== -Here is an example of what it should look like: +Activate the Bluetooth functionality on the device (see the device manual for further explanation), +and the :abbr:`IoT (Internet of Things)` box automatically connects to the device. -.. image:: measurement_tool/measurement_tool_03.png +.. image:: measurement_tool/measurement-tool.jpeg :align: center + :alt: Bluetooth indicator on measurement tool. -Link a measurement tool to a quality control point -================================================== -With the Manufacturing app --------------------------- +Link a measurement tool to a quality control point in the manufacturing process +=============================================================================== -In your *Quality app*, you can setup a device on your *Quality -Control Points*. To do so, go to the *Control Points* menu, under -*Quality Control* and open the control point to which you want to -assign a measurement tool. +In the *Quality app*, a device can be set up on a quality control point. To do that, navigate to +:menuselection:`Quality app --> Quality Control --> Control Points`, and open the desired control +point to which the measurement tool should be linked. -Now, you can edit the control point and choose the device from the -dropdown list. Then, hit save. +From here, edit the control point, by selecting the :guilabel:`Type` field, and clicking +:guilabel:`Measure` from the drop-down menu. Doing so reveals a field called :guilabel:`Device`, +where the attached device can be selected. -.. image:: measurement_tool/measurement_tool_04.png - :align: center +Additionally, :guilabel:`Norm` and :guilabel:`Tolerance` can be configured. :guilabel:`Save` the +changes, if required. -Now, your measurement tool is linked to the chosen *Control Point*. -The value, which needs to be changed manually, will be automatically -updated while the tool is being used. +At this point, the measurement tool is linked to the chosen quality control point. The value, which +usually needs to be changed manually, is automatically updated while the tool is being used. -.. image:: measurement_tool/measurement_tool_05.png +.. image:: measurement_tool/measurement-control-point.png :align: center + :alt: Measurement tool input in the Odoo database. + +.. tip:: + Quality control points can also be accessed by navigating to :menuselection:`IoT App --> + Devices`, then select the device. There is a :guilabel:`Quality Control Points` tab, where they + can be added with the device. + +.. note:: + On a quality check detail form, the :guilabel:`Type` of check can also be specified to + :guilabel:`Measure`. Access a new quality check detail page, by navigating to + :menuselection:`Quality app --> Quality Control --> Quality Checks --> New`. + +.. seealso:: + - :doc:`../../../inventory_and_mrp/manufacturing/quality_control/quality_control_points` + - :doc:`../../../inventory_and_mrp/manufacturing/quality_control/quality_alerts` + +Link a measurement tool to a work center in the Manufacturing app +================================================================= + +To link a measurement tool to an action, it first needs to be configured on a work center. To do +that, navigate to :menuselection:`Manufacturing app --> Configuration --> Work Centers`. Then, +select the desired work center in which the measurement tool will be used. + +On the work center page, add the device in the :guilabel:`IoT Triggers` tab, under the +:guilabel:`Device` column, by selecting :guilabel:`Add a Line`. Then, the measurement tool can be +linked to the :guilabel:`Action` drop-down menu option labeled :guilabel:`Take Measure`. A key can +be added to trigger the action. + +.. important:: + It should be noted that the first listed trigger is chosen first. The order matters, and these + triggers can be dragged into any order. + +.. note:: + On the :guilabel:`Work Order` screen, a status graphic indicates whether the database is + correctly connected to the measurement tool. + +.. seealso:: + :ref:`workcenter_iot` diff --git a/content/applications/productivity/iot/devices/measurement_tool/device-dropdown.png b/content/applications/productivity/iot/devices/measurement_tool/device-dropdown.png new file mode 100644 index 0000000000..fb00d94973 Binary files /dev/null and b/content/applications/productivity/iot/devices/measurement_tool/device-dropdown.png differ diff --git a/content/applications/productivity/iot/devices/measurement_tool/measurement-control-point.png b/content/applications/productivity/iot/devices/measurement_tool/measurement-control-point.png new file mode 100644 index 0000000000..fa9bfb8320 Binary files /dev/null and b/content/applications/productivity/iot/devices/measurement_tool/measurement-control-point.png differ diff --git a/content/applications/productivity/iot/devices/measurement_tool/measurement-tool.jpeg b/content/applications/productivity/iot/devices/measurement_tool/measurement-tool.jpeg new file mode 100644 index 0000000000..b7a4f2a1f3 Binary files /dev/null and b/content/applications/productivity/iot/devices/measurement_tool/measurement-tool.jpeg differ diff --git a/content/applications/productivity/iot/devices/measurement_tool/measurement_tool_01.png b/content/applications/productivity/iot/devices/measurement_tool/measurement_tool_01.png deleted file mode 100644 index 4eb11afac3..0000000000 Binary files a/content/applications/productivity/iot/devices/measurement_tool/measurement_tool_01.png and /dev/null differ diff --git a/content/applications/productivity/iot/devices/measurement_tool/measurement_tool_03.png b/content/applications/productivity/iot/devices/measurement_tool/measurement_tool_03.png deleted file mode 100644 index c6be05a59d..0000000000 Binary files a/content/applications/productivity/iot/devices/measurement_tool/measurement_tool_03.png and /dev/null differ diff --git a/content/applications/productivity/iot/devices/measurement_tool/measurement_tool_04.png b/content/applications/productivity/iot/devices/measurement_tool/measurement_tool_04.png deleted file mode 100644 index 83b8c3423d..0000000000 Binary files a/content/applications/productivity/iot/devices/measurement_tool/measurement_tool_04.png and /dev/null differ diff --git a/content/applications/productivity/iot/devices/measurement_tool/measurement_tool_05.png b/content/applications/productivity/iot/devices/measurement_tool/measurement_tool_05.png deleted file mode 100644 index b07173a0a7..0000000000 Binary files a/content/applications/productivity/iot/devices/measurement_tool/measurement_tool_05.png and /dev/null differ diff --git a/content/applications/productivity/iot/devices/printer.rst b/content/applications/productivity/iot/devices/printer.rst index d9b05d9570..635d28d9c2 100644 --- a/content/applications/productivity/iot/devices/printer.rst +++ b/content/applications/productivity/iot/devices/printer.rst @@ -1,126 +1,121 @@ ================= -Connect a Printer +Connect a printer ================= -When using your *IoT Box* in Odoo, you could need to use a printer. -Doing so is easy and convenient as it can be done in a few steps. Then, -you can use it to print receipts, orders or even reports in different -Odoo apps. +Printer installation can be done in a few easy steps. The printer can be used to print receipts, +labels, orders, or even reports from the different Odoo apps. In addition, printer actions can be +assigned as an *action on a trigger* during the manufacturing process, or added onto a quality +control point or a quality check. Connection ========== -The IoT Box supports printers connected through USB, network or Bluetooth. -`Supported printers `__ will be -detected automatically and will appear in the *Devices* list of your IoT app. +The :abbr:`IoT (Internet of Things)` box supports printers connected through :abbr:`USB (Universal +Serial Bus)`, network connection, or Bluetooth. `Supported printers +`__ are detected automatically, and appear in the +:guilabel:`Devices` list of the *IoT app*. -.. note:: - The printer can take up to two minutes to appear in your devices list. - -.. image:: printer/printer_01.png +.. image:: printer/printer-detected.png :align: center + :alt: The printer as it would appear in the IoT app devices list. -Link the Printer -================ - -To Work Orders --------------- - -You can link *Work Orders* to printers via a *Quality Control Point* -to print labels for manufactured products. - -To do so, you need to create a *Quality Control Point* from the -*Quality* app. Then, you can select the correct manufacturing -operation and the work order operation. In type, choose *Print Label* -and hit save. - -.. image:: printer/printer_03.png - :align: center +.. note:: + The printer can take up to two minutes to appear in the *IoT app* devices list. -Now, each time you reach the quality control point for the chosen -product, a *Print Label* button will appear. +Link printer +============ -.. image:: printer/printer_04.png - :align: center +Link printer to work orders +--------------------------- -To Reports ----------- +*Work Orders* can be linked to printers, via a quality control point, to print labels for +manufactured products. -You can also link a type of report to a certain printer. In the *IoT* -app, go to the *Devices* menu and select the printer you want to set -up. +In the *Quality app*, a device can be set up on a quality control point. To do that, go to the +:menuselection:`Quality app --> Quality Control --> Control Points`, and open the desired control +point to which the printer will be linked. -.. image:: printer/printer_05.png - :align: center +.. important:: + A *Manufacturing Operation* and *Work Order Operation* need to be attached to a quality control + point before the :guilabel:`Type` field allows for the :guilabel:`Print Label` option to be + selected. -Now, go to the *Printer Reports* tab. +From here, edit the control point, by selecting the :guilabel:`Type` field, and selecting +:guilabel:`Print Label` from the drop-down menu of options. Doing so reveals a field called +:guilabel:`Device`, where the attached *device* can be selected. :guilabel:`Save` the changes, if +required. -.. image:: printer/printer_06.png +.. image:: printer/printer-controlpoint.png :align: center + :alt: This is the quality control point setup. -Hit edit and then, click on *Add a line*. In the window that shows up, -check all the types of reports that should be linked to this printer. -Click on select and save. +The printer can now be used with the selected quality control point. When the quality control point +is reached during the manufacturing process, the database presents the option to print labels for a +specific product. -.. image:: printer/printer_07.png +.. image:: printer/printer-prompt.png :align: center -Now, each time you click on *Print* in the control panel, instead of -downloading a PDF, it will send it to the selected printer and -automatically print it. +.. tip:: + Quality control points can also be accessed by navigating to :menuselection:`IoT App --> + Devices`, then select the device. There is a :guilabel:`Quality Control Points` tab, where they + can be added with the device. -Print Receipts from the PoS ---------------------------- - -You can link a printer to your *Point of Sale* app so you can print -receipts directly from your *PoS*. - -Doing so is really easy. Go to your *Point of Sale* app and open your -*Point of Sale* settings, under *Configuration*. There, click on *Edit* -and check the *IoT Box* feature. Then, choose your *Receipt Printer* -from the dropdown. +.. note:: + On a quality check detail form, the :guilabel:`Type` of check can also be specified to + :guilabel:`Print Label`. To create new quality checks, navigate to :menuselection:`Quality app + --> Quality Control --> Quality Checks --> New`. -.. image:: printer/printer_08.png - :align: center +.. seealso:: + - :doc:`../../../inventory_and_mrp/manufacturing/quality_control/quality_control_points` + - :doc:`../../../inventory_and_mrp/manufacturing/quality_control/quality_alerts` -Now, you will be able to print different kinds of tickets from your *POS*: -**receipts**, **sale details** and **bills**. +Link a printer to a work center in the Manufacturing app +-------------------------------------------------------- -Receipts are printed once the order is validated. The process is -automated when you enable the feature in your *PoS* configuration. +To link a printer to an action, it first needs to be configured on a work center. To do that, +navigate to :menuselection:`Manufacturing app --> Configuration --> Work Centers`. From here, select +the desired work center in which the printer will be used. Next, add the device in the +:guilabel:`IoT Triggers` tab, under the :guilabel:`Device` column, by selecting :guilabel:`Add a +Line`. -Sales details can be printed by clicking on the printer icon on the -navbar at the top of the *PoS*. It will print the details of the sales -of the current day. +Then, the printer can be linked to either of the following options in the :guilabel:`Actions` +drop-down menu: :guilabel:`Print Labels`, :guilabel:`Print Operation`, or :guilabel:`Print Delivery +Slip`. A key can also be added to trigger the action. -.. image:: printer/printer_09.png - :align: center +.. important:: + The first listed trigger on the form will be chosen first. So, the order matters, and these + triggers can be dragged into any order. -As for the bill, it is only available in restaurant mode. In your -restaurant settings, activate *Print Bills* and a *Bill* button will -appear in the left panel of the *PoS*. +.. note:: + On the :guilabel:`Work Order` screen, a status graphic indicates whether the database is + correctly connected to the printer. -.. image:: printer/printer_10.png - :align: center +.. seealso:: + :ref:`workcenter_iot` -Print Orders in the kitchen ---------------------------- +Link printer to reports +----------------------- -In restaurant mode, you can send order tickets to the kitchen. +It's also possible to link a type of report to a certain printer. In the *IoT app*, go to the +:guilabel:`Devices` menu, and select the desired printer that needs to be configured. -To do so, go to the *PoS* app and open your *PoS* settings. Then, -tick *Order Printer*. +From here, click :guilabel:`Edit`, go to the :guilabel:`Printer Reports` tab, and select +:guilabel:`Add a line`. In the window that appears, check all the types of :guilabel:`Reports` that +should be linked to this printer. -.. image:: printer/printer_11.png +.. image:: printer/printers-listed.png :align: center + :alt: The printer devices listed in the IoT Devices menu. -Now, go to the *Printers* menu. Hit create, select the printer from -the dropdown and, in the *Printer Product Categories* field, choose -all the categories of products that should be printed on this printer. +Now, each time :guilabel:`Print` is selected in the control panel, instead of downloading a PDF, +Odoo sends the report to the selected printer, and automatically prints it. -.. image:: printer/printer_12.png - :align: center +.. seealso:: + :doc:`POS Order Printing <../../../sales/point_of_sale/restaurant/kitchen_printing>` -In the *PoS*, when you add or remove a product from one of the -selected categories, the button *Order* will be green. If you click on -it, the IoT Box will print a receipt on the corresponding printer. +.. tip:: + Reports can also be configured in the :guilabel:`Technical Menu` while in :ref:`debug mode + `. To do that, navigate to :menuselection:`Settings App --> Technical Menu --> + Actions --> Reports`. From here, the individual report can be found in this list, where the + :guilabel:`IoT Device` can be set on the report. diff --git a/content/applications/productivity/iot/devices/printer/printer_04.png b/content/applications/productivity/iot/devices/printer/print-labels-button.png similarity index 100% rename from content/applications/productivity/iot/devices/printer/printer_04.png rename to content/applications/productivity/iot/devices/printer/print-labels-button.png diff --git a/content/applications/productivity/iot/devices/printer/printer-controlpoint.png b/content/applications/productivity/iot/devices/printer/printer-controlpoint.png new file mode 100644 index 0000000000..49dacae101 Binary files /dev/null and b/content/applications/productivity/iot/devices/printer/printer-controlpoint.png differ diff --git a/content/applications/productivity/iot/devices/printer/printer_01.png b/content/applications/productivity/iot/devices/printer/printer-detected.png similarity index 100% rename from content/applications/productivity/iot/devices/printer/printer_01.png rename to content/applications/productivity/iot/devices/printer/printer-detected.png diff --git a/content/applications/productivity/iot/devices/printer/printer-prompt.png b/content/applications/productivity/iot/devices/printer/printer-prompt.png new file mode 100644 index 0000000000..80ba6bc1db Binary files /dev/null and b/content/applications/productivity/iot/devices/printer/printer-prompt.png differ diff --git a/content/applications/productivity/iot/devices/printer/printer_03.png b/content/applications/productivity/iot/devices/printer/printer_03.png deleted file mode 100644 index 17c246655d..0000000000 Binary files a/content/applications/productivity/iot/devices/printer/printer_03.png and /dev/null differ diff --git a/content/applications/productivity/iot/devices/printer/printer_05.png b/content/applications/productivity/iot/devices/printer/printer_05.png deleted file mode 100644 index 4cc3b85e08..0000000000 Binary files a/content/applications/productivity/iot/devices/printer/printer_05.png and /dev/null differ diff --git a/content/applications/productivity/iot/devices/printer/printer_06.png b/content/applications/productivity/iot/devices/printer/printer_06.png deleted file mode 100644 index b36fb302a4..0000000000 Binary files a/content/applications/productivity/iot/devices/printer/printer_06.png and /dev/null differ diff --git a/content/applications/productivity/iot/devices/printer/printer_07.png b/content/applications/productivity/iot/devices/printer/printer_07.png deleted file mode 100644 index 2cb8f839fb..0000000000 Binary files a/content/applications/productivity/iot/devices/printer/printer_07.png and /dev/null differ diff --git a/content/applications/productivity/iot/devices/printer/printer_08.png b/content/applications/productivity/iot/devices/printer/printer_08.png deleted file mode 100644 index e4561a6478..0000000000 Binary files a/content/applications/productivity/iot/devices/printer/printer_08.png and /dev/null differ diff --git a/content/applications/productivity/iot/devices/printer/printer_09.png b/content/applications/productivity/iot/devices/printer/printer_09.png deleted file mode 100644 index c7ea2e431e..0000000000 Binary files a/content/applications/productivity/iot/devices/printer/printer_09.png and /dev/null differ diff --git a/content/applications/productivity/iot/devices/printer/printer_10.png b/content/applications/productivity/iot/devices/printer/printer_10.png deleted file mode 100644 index 0ad40d6808..0000000000 Binary files a/content/applications/productivity/iot/devices/printer/printer_10.png and /dev/null differ diff --git a/content/applications/productivity/iot/devices/printer/printer_11.png b/content/applications/productivity/iot/devices/printer/printer_11.png deleted file mode 100644 index 36ef5f8150..0000000000 Binary files a/content/applications/productivity/iot/devices/printer/printer_11.png and /dev/null differ diff --git a/content/applications/productivity/iot/devices/printer/printer_12.png b/content/applications/productivity/iot/devices/printer/printer_12.png deleted file mode 100644 index 840d5f7881..0000000000 Binary files a/content/applications/productivity/iot/devices/printer/printer_12.png and /dev/null differ diff --git a/content/applications/productivity/iot/devices/printer/printers-listed.png b/content/applications/productivity/iot/devices/printer/printers-listed.png new file mode 100644 index 0000000000..4c6353b69a Binary files /dev/null and b/content/applications/productivity/iot/devices/printer/printers-listed.png differ diff --git a/content/applications/productivity/iot/devices/scale.rst b/content/applications/productivity/iot/devices/scale.rst index 6ecf1ae7bd..3e312d85e1 100644 --- a/content/applications/productivity/iot/devices/scale.rst +++ b/content/applications/productivity/iot/devices/scale.rst @@ -1,54 +1,57 @@ =============== -Connect a Scale +Connect a scale =============== -When using your **IoT Box** in Odoo, you could need to use a scale. Doing so is easy and convenient -as it can be done in a few steps. Then, you can use it in your **Point of Sale app** to weigh your -products, which is helpful if their price are based on it. +A scale can be connected to the :abbr:`IoT (Internet of Things)` box on an Odoo database in a few +easy steps. After setup, the *Point of Sale* app can be used to weigh products, which is helpful if +their prices are calculated based on weight. Connection ========== -To link the scale to the **IoT Box**, connect them with a cable. +To link the scale to the :abbr:`IoT (Internet of Things)` box, connect it with a :abbr:`USB +(Universal Serial Bus)` cable. .. note:: - In some cases, a serial to USB adapter may be needed. + In some cases, a serial port to :abbr:`USB (Universal Serial Bus)` adapter may be needed. -If your scale is `compatible with Odoo IoT Box `_, there -is no need to set up anything because it will be automatically detected as soon as it is connected. +If the scale is `compatible with Odoo IoT Box `_, there is +no need to set up anything because it will be automatically detected as soon as it is connected. .. image:: scale/iot-choice.png :align: center :alt: IOT box auto detection. -You may need to restart the box and download your scales’ drivers from the box in some cases. To do -so, go to the *IoT Box Home Page* and click on *drivers list*. Then, click on load drivers. +The :abbr:`IoT (Internet of Things)` box may need to be restarted and the scale's drivers may need +to be downloaded to the box in some cases. To update the drivers, go to the :abbr:`IoT (Internet of +Things)` box homepage and click on :guilabel:`Drivers List`. Then, click on :guilabel:`Load +Drivers`. .. image:: scale/driver-list.png :align: center :alt: View of the IoT box settings and driver list. -Use a Scale in Point of Sale -============================ +If loading the drivers still doesn't allow for the scale to function, it may be that the scale is +not compatible with the Odoo :abbr:`IoT (Internet of Things)` box. In this case, a different scale +will need to be used. -To use the scale in your *Point of Sale* app, go to :menuselection:`Point of Sale --> Configuration ---> Point of Sale`, open the one you want to configure, then click on *Edit* and enable the *IoT -Box* feature. +Use a scale in a point of sale (POS) system +=========================================== -.. image:: scale/iot-box-pos.png - :align: center - :alt: View of the IoT box feature inside of the PoS settings. +To use the scale in the *Point of Sale app*, go to :menuselection:`PoS app --> 3-Dot Menu on the PoS +--> Settings`, then enable the :abbr:`IoT (Internet of Things)` box feature. After this is complete, +the scale device can be set. -Now, choose the *IoT Box* in the dropdown menu and check the *Electronic Scale* option. Then, you -hit save. +Select the scale from the :guilabel:`Electronic Scale` drop-down menu. Then click :guilabel:`Save` +to save the changes, if required. .. image:: scale/electronic-scale-feature.png :align: center :alt: List of the external tools that can be used with PoS and the IoT box. -The scale is now available in all your *PoS* sessions. Then, if a product has a price per weight -set, clicking on it on the *PoS* screen opens the scale screen, where the cashier can weigh the -product and add the correct price to the cart. +The scale is now available in all the :abbr:`PoS (Point of Sale)` sessions. Now, if a product has a +price per weight set, clicking on it on the :guilabel:`PoS` screen opens the scale screen, where the +cashier can weigh the product and add the correct price to the cart. .. image:: scale/scale-view.png :align: center diff --git a/content/applications/productivity/iot/devices/scale/driver-list.png b/content/applications/productivity/iot/devices/scale/driver-list.png index d87a4cca9f..27c6ba1a67 100644 Binary files a/content/applications/productivity/iot/devices/scale/driver-list.png and b/content/applications/productivity/iot/devices/scale/driver-list.png differ diff --git a/content/applications/productivity/iot/devices/scale/electronic-scale-feature.png b/content/applications/productivity/iot/devices/scale/electronic-scale-feature.png index 6bd38692b6..4dae1e608f 100644 Binary files a/content/applications/productivity/iot/devices/scale/electronic-scale-feature.png and b/content/applications/productivity/iot/devices/scale/electronic-scale-feature.png differ diff --git a/content/applications/productivity/iot/devices/screen.rst b/content/applications/productivity/iot/devices/screen.rst index 189d533fab..8d8cd707c5 100644 --- a/content/applications/productivity/iot/devices/screen.rst +++ b/content/applications/productivity/iot/devices/screen.rst @@ -2,43 +2,47 @@ Connect a screen ================ -In Odoo, an :abbr:`IoT (Internet of Things)` Box can be connected to a screen display. After being -connected, the screen can be used to display a :abbr:`PoS (Point of Sale)` order to a client. +In Odoo, an :abbr:`IoT (Internet of Things)` box can be connected to a screen display. After being +configured, the screen can be used to display a Point of Sale (PoS) order to a client. -.. image:: screen/screen-pos-client-display.png - :align: center - :alt: An example of a PoS (point of sale) order on a screen display. +.. figure:: screen/screen-pos-client-display.png -.. note:: - Access the customer display from any other computer by going to the :abbr:`IoT (Internet of - Things)` Box homepage and clicking on the :guilabel:`POS Display` button. + An example of a PoS (point of sale) order on a screen display. + +Access the customer display by going to the :abbr:`IoT (Internet of Things)` box homepage and +clicking on the :guilabel:`PoS Display` button. To get to the :abbr:`IoT (Internet of Things)` box +homepage, navigate to :menuselection:`IoT app --> IoT Boxes` and click on the :abbr:`IoT (Internet +of Things)` box homepage link. Connection ========== -The way to connect the screen display to the :abbr:`IoT (Internet of Things)` Box differs depending +The way to connect the screen display to the :abbr:`IoT (Internet of Things)` box differs depending on the model. .. tabs:: .. tab:: IoT Box model 4 - Connect up to two screens with Micro-HDMI cables on the side of the :abbr:`IoT (Internet of - Things)` Box. If two screens are connected, they can display distinct content (see usage - below). + Connect up to two screens with micro-HDMI cables on the side of the :abbr:`IoT (Internet of + Things)` box. If two screens are connected, they can display distinct content (see + :ref:`Screen Usage `). .. tab:: IoT Box model 3 - Connect the screen with an HDMI cable on the side of the :abbr:`IoT (Internet of Things)` Box. + Connect the screen with an HDMI cable on the side of the :abbr:`IoT (Internet of Things)` box. + +.. seealso:: + :ref:`See the Raspberry Pi Schema `. .. important:: - Screen(s) should be connected before the :abbr:`IoT (Internet of Things)` Box is switched on. If + Screen(s) should be connected before the :abbr:`IoT (Internet of Things)` box is switched on. If it is already on, connect the screen(s), and then restart the :abbr:`IoT (Internet of Things)` - Box by unplugging it and plugging it back into its power source. + box by unplugging it for ten seconds and plugging it back into its power source. .. warning:: - The usage of HDMI/Micro-HDMI adapters may cause issues which will result in a blank, black screen - on the screen display. Cable usage is recommended. + The usage of HDMI/micro-HDMI adapters may cause issues which will result in a blank, black screen + on the screen display. Using the specific cable for the display connection is recommended. If the connection was successful, the screen should display the :guilabel:`POS Client display` screen. @@ -46,57 +50,61 @@ screen. .. image:: screen/screen-pos-client-display-no-order.png :align: center :alt: The default "POS Client Display" screen that appears when a screen display is successfully - connected to an IoT Box. + connected to an IoT box. The screen should also appear in the list of :guilabel:`Displays` on the :abbr:`IoT (Internet of -Things)` Box homepage. +Things)` box homepage. Alternatively, the display can be seen by accessing :menuselection:`IoT app +--> Devices`. .. image:: screen/screen-screen-name-example.png :align: center - :alt: An example of a screen display name shown on the IoT Box homepage. + :alt: An example of a screen display name shown on the IoT Box Home Page. .. note:: - If no screen is detected, a default display named :guilabel:`Distant Display` will be used - instead. + If no screen is detected, a default display named :guilabel:`Distant Display` will be displayed + instead. This indicates that there is no hardware screen connected. .. image:: screen/screen-no-screen.png :align: center :alt: The "Distant Display" screen name will be used if no screen is detected. +.. _iot/usage_screen: + Usage ===== -Show Point of Sales orders to customers ---------------------------------------- +Show Point of Sale orders to customers +-------------------------------------- -To use the screen in the :guilabel:`Point of Sale` app, go to :menuselection:`Point of Sale --> -Configuration --> Point of Sale`, open the desired screen, click on :guilabel:`Edit`, and enable the -:guilabel:`IoT Box Devices` feature. +To use the screen in the *Point of Sale app*, go to :menuselection:`Point of Sale --> +Configuration --> Point of Sale`, select a :abbr:`PoS (Point of Sale)`, click :guilabel:`Edit` if +necessary, and enable the :guilabel:`IoT Box` feature. -Now, select :guilabel:`IoT Box` in the drop-down menu and choose the screen in the -:guilabel:`Customer Display` option. Then, click :guilabel:`Save`. +Next, select the screen from the :guilabel:`Customer Display` drop-down menu. Then click +:guilabel:`Save`, if required. - .. image:: screen/screen-pos-screen-config.png - :align: center - :alt: Connect the screen display to the Point of Sale app. +.. image:: screen/screen-pos-screen-config.png + :align: center + :alt: Connect the screen display to the Point of Sale app. -The screen is now available for :abbr:`PoS (Point of Sale)` sessions. A "screen" icon will appear -in the top bar to inform the connection status with the screen. +The screen is now available for :abbr:`PoS (Point of Sale)` sessions. A screen icon will appear in +the menu at the top of the screen to indicate the screen's connection status. - .. image:: screen/screen-pos-icon.png - :align: center - :alt: The "screen" icon on the Point of Sale display shows the connection status with the - screen. +.. image:: screen/screen-pos-icon.png + :align: center + :alt: The "screen" icon on the Point of Sale display shows the connection status with the + screen. The screen will automatically show the :abbr:`PoS (Point of Sale)` orders and update when changes -are performed on the order. +are made to the order. .. image:: screen/screen-pos-client-display.png :align: center :alt: An example of a PoS order on a screen display. -Display a website ------------------ +Display a website on the screen +------------------------------- -Opening the screen form view at :menuselection:`IoT --> Devices --> (screen device)` allows the user -to choose a particular website URL to display on the screen with the :guilabel:`Screen URL` field. +Open the screen form view by accessing :menuselection:`IoT app --> Devices --> Customer Display`. +This allows the user to choose a particular website URL to display on the screen using the +:guilabel:`Display URL` field. diff --git a/content/applications/productivity/iot/devices/screen/screen-pos-client-display-no-order.png b/content/applications/productivity/iot/devices/screen/screen-pos-client-display-no-order.png index 633c09ff79..f686317a90 100644 Binary files a/content/applications/productivity/iot/devices/screen/screen-pos-client-display-no-order.png and b/content/applications/productivity/iot/devices/screen/screen-pos-client-display-no-order.png differ diff --git a/content/applications/productivity/iot/devices/screen/screen-pos-client-display.png b/content/applications/productivity/iot/devices/screen/screen-pos-client-display.png index 131215be2d..3be1efd31d 100644 Binary files a/content/applications/productivity/iot/devices/screen/screen-pos-client-display.png and b/content/applications/productivity/iot/devices/screen/screen-pos-client-display.png differ diff --git a/content/applications/productivity/iot/devices/screen/screen-pos-screen-config.png b/content/applications/productivity/iot/devices/screen/screen-pos-screen-config.png index 9fabaa2379..27613f6233 100644 Binary files a/content/applications/productivity/iot/devices/screen/screen-pos-screen-config.png and b/content/applications/productivity/iot/devices/screen/screen-pos-screen-config.png differ diff --git a/content/applications/productivity/knowledge.rst b/content/applications/productivity/knowledge.rst index 075f4ad59a..b612c5a3d1 100644 --- a/content/applications/productivity/knowledge.rst +++ b/content/applications/productivity/knowledge.rst @@ -20,4 +20,5 @@ from other models, templates, etc. :titlesonly: knowledge/articles_editing + knowledge/management knowledge/properties diff --git a/content/applications/productivity/knowledge/management.rst b/content/applications/productivity/knowledge/management.rst new file mode 100644 index 0000000000..2942fe2315 --- /dev/null +++ b/content/applications/productivity/knowledge/management.rst @@ -0,0 +1,114 @@ +=================== +Articles management +=================== + +Managing articles effectively is key to maximizing the value of your knowledge resources, whether +working on a research project, studying for an exam, or building a knowledge database for your +business. Knowledge allows you to fully manage your articles, from +:ref:`creation ` to :ref:`removal `, through :ref:`sharing +` and :ref:`structure `. + +You can find most tools to manage articles by clicking the vertical ellipsis button (:guilabel:`⋮`) +at the right side of the top bar. From there, you can move, lock, delete, or duplicate an article. + +.. image:: management/toolbox.png + :alt: Menu with tools for the management of articles + +Creation, sharing, and removal of articles +========================================== + +.. _management/create: + +Creation +-------- + +To create articles, click the :guilabel:`+ New` button on the right side of the top bar or the +:guilabel:`+` button next to a category or another article. + +.. tip:: + Create private articles quickly with the Alt/Option + C keyboard shortcut. + +.. _management/share: + +Sharing +------- + +You can share articles with internal or external users. To do so, open the share menu by clicking +:guilabel:`Share` in the top-right menu of articles. + +Invite users +~~~~~~~~~~~~ + +To share articles with specific users (internal or external, such as a partner or a customer), click +:guilabel:`Invite`. This opens a pop-up window in which you can choose the :guilabel:`Permission` +:ref:`(i.e, access rights) ` and enter the :guilabel:`Recipients`' name or +email. + +You can also restrict a specific user from accessing the article by selecting :guilabel:`No access` +permission. + +.. image:: management/invite.png + :alt: pop-up window to invite users to access a Knowledge article + +Share online +~~~~~~~~~~~~ + +To share articles **online**, activate the :guilabel:`Share to web` button. Doing so generates a URL +link anyone can use to view the article. + +Additionally, the share menu displays the default permission for internal members along with all the +users who have been granted specific permission. + +.. image:: management/share-menu.png + :alt: Sharing menu with URL for online sharing and the list of members. + +.. _management/remove: + +Removal +------- + +To remove an article, you can either **delete** it or **archive** it. + +To delete an article, open it and click the vertical ellipsis button :menuselection:`(⋮) --> +Delete`. The article is moved to the trash for 30 days before being permanently deleted. To restore +it, click :guilabel:`Open the Trash`, select the article, and click :guilabel:`Restore`. + +To archive articles, click :guilabel:`Search`, select the article(s), and click +:menuselection:`Action --> Archive --> Archive`. Archived articles are hidden from the search menu. +To retrieve an archived article, add a custom filter to display them (:menuselection:`Search --> +Filters --> Add Custom Filter`, and set :guilabel:`Active` as :guilabel:`is No`). Then, select the +article(s) and go to :menuselection:`Action --> Unarchive`. + +.. _management/structure: + +Structure of articles +===================== + +Articles are organized into a hierarchical structure wherein the article on top is a parent article, +and those underneath are called nested articles. This structure allows the grouping of related +articles. + +To establish this hierarchy, create new articles by clicking the :guilabel:`+` button next to the +parent-to-be article, or move existing articles by either dragging and dropping them under the +parent-to-be or by clicking the vertical ellipsis button (:guilabel:`⋮`), clicking :guilabel:`Move +To` on the toolbox and selecting the article to use as a parent. + +.. _management/categories: + +Categories +---------- + +Additionally, articles are divided into four categories that can be found on the left sidebar. These +categories give articles default **access rights**. + +- :guilabel:`Favorites`: You can set any article you can access as a favorite. To do so, click the + star-shaped icon (:guilabel:`★`) in the top-right menu of articles. Marking articles as + **favorites** is user-specific and does not affect other users. +- :guilabel:`Workspace`: Articles displayed in that category are available to all internal users. + These users have the right to read, modify or share these articles. +- :guilabel:`Shared`: Articles displayed in that category are those you shared with internal users, + external users, or shared with you. +- :guilabel:`Private`: Articles displayed in that category are only available to you. + +.. image:: management/left-sidebar-cat.png + :alt: Categories displayed in the left sidebar of Odoo Knowledge diff --git a/content/applications/productivity/knowledge/management/invite.png b/content/applications/productivity/knowledge/management/invite.png new file mode 100644 index 0000000000..c35be8086d Binary files /dev/null and b/content/applications/productivity/knowledge/management/invite.png differ diff --git a/content/applications/productivity/knowledge/management/left-sidebar-cat.png b/content/applications/productivity/knowledge/management/left-sidebar-cat.png new file mode 100644 index 0000000000..dbde6c8037 Binary files /dev/null and b/content/applications/productivity/knowledge/management/left-sidebar-cat.png differ diff --git a/content/applications/productivity/knowledge/management/share-menu.png b/content/applications/productivity/knowledge/management/share-menu.png new file mode 100644 index 0000000000..69fa26d480 Binary files /dev/null and b/content/applications/productivity/knowledge/management/share-menu.png differ diff --git a/content/applications/productivity/knowledge/management/toolbox.png b/content/applications/productivity/knowledge/management/toolbox.png new file mode 100644 index 0000000000..af9bcc30aa Binary files /dev/null and b/content/applications/productivity/knowledge/management/toolbox.png differ diff --git a/content/applications/productivity/whatsapp.rst b/content/applications/productivity/whatsapp.rst new file mode 100644 index 0000000000..ccbbb8ed57 --- /dev/null +++ b/content/applications/productivity/whatsapp.rst @@ -0,0 +1,22 @@ +======== +WhatsApp +======== + +**WhatsApp** is a popular messaging app that enables users to send texts and share media securely +and conveniently. Businesses can use `WhatsApp Business +`_ to communicate with their customers, send +documents and provide support. + +Connecting your Whatsapp Business Account (WABA) to your Odoo database allows you to: + +- Receive and reply to WhatsApp messages directly from your Odoo database +- Send pre-approved templates that use dynamic values, such as: + + - Quotations from the Sales app + - Receipts and invoices from the Point of Sale app + - Tickets from the Events app + +.. seealso:: + - `Meta Business: create message templates for your WhatsApp Business account `_ + - `Meta Business: connect your phone number to your WhatsApp Business account `_ + - `Meta Business: change your WhatsApp Business display name `_ diff --git a/content/applications/sales/point_of_sale.rst b/content/applications/sales/point_of_sale.rst index 4b2d990d37..6fb9eb7ebd 100644 --- a/content/applications/sales/point_of_sale.rst +++ b/content/applications/sales/point_of_sale.rst @@ -23,17 +23,17 @@ Control` screen, click :guilabel:`Open Session` to start a POS session, or click Selling` if the session is already opened. .. note:: - Multiple users can be connected to the same session at the same time. However, the session can - only be opened once on the same browser. + :doc:`Multiple users ` can be logged into the same session at the + same time. However, the session can only be opened once on the same browser. .. _pos/sell: Sell products ============= -Click products to add them to the cart. To change the **quantity**, click :guilabel:`Qty` and enter -the number of products using the keypad. To add a **discount** or modify the product **price**, -click respectively :guilabel:`% Disc` or :guilabel:`Price` and enter the amounts. +Click on products to add them to the cart. To change the **quantity**, click :guilabel:`Qty` and +enter the number of products using the keypad. To add a **discount** or modify the product +**price**, click respectively :guilabel:`% Disc` or :guilabel:`Price` and enter the amounts. Once an order is completed, proceed to checkout by clicking :guilabel:`Payment`. Select the **payment method**, enter the received amount, and click :guilabel:`Validate`. Click @@ -48,28 +48,17 @@ Once an order is completed, proceed to checkout by clicking :guilabel:`Payment`. .. _pos/customers: -Register customers -================== - -Registering your customers gives you the ability to grant them various privileges such as discounts, -loyalty program, specific communication. It is also required if they want an invoice and registering -them makes any future interaction with them faster. - -From your session interface, use the customer button. - -.. image:: point_of_sale/customer-button.png - -Create a new one by using this button. - -.. image:: point_of_sale/customer-add.png - -You will be invited to fill out the customer form with their -information. +Set customers +============= -.. image:: point_of_sale/customer-form.png +You can create and set customers from an :ref:`open POS session `. Registering +your customer is necessary to :doc:`collect their loyalty points and grant them rewards +`, automatically apply the :doc:`attributed pricelist +`, or :ref:`generate and print an invoice +`. -Use the save button when you are done. You can then select that customer -in any future transactions. +To access the list of customers, click :guilabel:`Customer` on the POS interface. Then, select a +customer or create a new one by clicking :guilabel:`Create`, completing the form, and saving. .. _pos/customer-notes: diff --git a/content/applications/sales/point_of_sale/configuration/epos_ssc.rst b/content/applications/sales/point_of_sale/configuration/epos_ssc.rst index b038eb2bcc..b2df96b9eb 100644 --- a/content/applications/sales/point_of_sale/configuration/epos_ssc.rst +++ b/content/applications/sales/point_of_sale/configuration/epos_ssc.rst @@ -32,20 +32,9 @@ to the ePOS printer. To work with Odoo, some models that can be used without an :doc:`IoT box <../../../productivity/iot/config/connect>` may require :doc:`the HTTPS protocol ` to establish a secure connection between the browser and the printer. However, trying to -reach the printer's IP address using HTTPS leads to a warning page on most web browsers. - -.. figure:: epos_ssc/browser-https-insecure.png - :align: center - :alt: warning page about the connection privacy on Google Chrome - - Warning page on Google Chrome, Windows 10 - -In that case, you can temporarily force the connection by clicking :guilabel:`Advanced` and -:guilabel:`Proceed to [IP address] (unsafe)`. Doing so allows you to reach the page in HTTPS and use -the ePOS printer in Odoo as long as the browser window stays open. - -.. note:: - The previous instructions apply to Google Chrome but are similar to other browsers. +reach the printer's IP address using HTTPS leads to a warning page on most web browsers. In that +case, you can temporarily :ref:`force the connection `, which allows you to +reach the page in HTTPS and use the ePOS printer in Odoo as long as the browser window stays open. .. warning:: The connection is lost after closing the browser window. Therefore, this method should only be @@ -72,9 +61,19 @@ it into your browser. .. tab:: Generate a self-signed certificate - After forcing the connection, sign in using your printer credentials to access the ePOS - printer settings. To sign in, enter `epson` in the :guilabel:`ID` field and your printer - serial number in the :guilabel:`Password` field. + Navigate to the ePOS' IP address (e.g., `https://192.168.1.25`) and force the + connection by clicking :guilabel:`Advanced` and :guilabel:`Proceed to [IP address] + (unsafe)`. + + .. figure:: epos_ssc/browser-https-insecure.png + :scale: 75% + :alt: warning page about the connection privacy on Google Chrome + + Warning page on Google Chrome, Windows 10 + + Then, sign in using your printer credentials to access the ePOS printer settings. To + sign in, enter `epson` in the :guilabel:`ID` field and your printer serial number in the + :guilabel:`Password` field. Click :guilabel:`Certificate List` in the :guilabel:`Authentication` section, and click :guilabel:`create` to generate a new **Self-Signed Certificate**. The :guilabel:`Common @@ -91,8 +90,8 @@ it into your browser. The export process is heavily dependent on the :abbr:`OS (Operating System)` and the browser. Start by accessing your ePOS printer settings on your web browser by navigating - to its IP address, for example, `https://192.168.1.25`. Then, force the connection as - explained in the :ref:`introduction `. + to its IP address (e.g., `https://192.168.1.25`). Then, force the connection as + explained in the **Generate a self-signed certificate tab**. If you are using **Google Chrome**, @@ -100,7 +99,6 @@ it into your browser. not valid`; .. image:: epos_ssc/browser-warning.png - :align: center :alt: Connection to the printer not secure button in Google Chrome browser. #. go to the :guilabel:`Details` tab and click :guilabel:`Export`; @@ -120,7 +118,6 @@ it into your browser. --> View certificate`; .. image:: epos_ssc/mozilla-not-secure.png - :align: center :alt: Connection is not secure button in Mozilla Firefox browser #. scroll down to the :guilabel:`Miscellaneous` section; @@ -150,7 +147,6 @@ it into your browser. :guilabel:`Trusted Root Certification Authorities`; .. image:: epos_ssc/win-cert-wizard-store.png - :align: center #. click :guilabel:`Finish`, accept the pop-up security window; #. restart the computer to make sure that the changes are applied. diff --git a/content/applications/sales/point_of_sale/customer-add.png b/content/applications/sales/point_of_sale/customer-add.png deleted file mode 100644 index bd7e3bce4a..0000000000 Binary files a/content/applications/sales/point_of_sale/customer-add.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/customer-button.png b/content/applications/sales/point_of_sale/customer-button.png deleted file mode 100644 index 1a0a42630c..0000000000 Binary files a/content/applications/sales/point_of_sale/customer-button.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/customer-form.png b/content/applications/sales/point_of_sale/customer-form.png deleted file mode 100644 index a4f1cf9fb6..0000000000 Binary files a/content/applications/sales/point_of_sale/customer-form.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/employee_login.rst b/content/applications/sales/point_of_sale/employee_login.rst index f09d171921..6f8e0aaceb 100644 --- a/content/applications/sales/point_of_sale/employee_login.rst +++ b/content/applications/sales/point_of_sale/employee_login.rst @@ -1,81 +1,75 @@ -==================== -Log in with employee -==================== +========================= +Multi-employee management +========================= -With Odoo *Point of Sale*, you can manage multiple cashiers. This -feature allows you to keep track of who is working, when and how much -each cashier made for that session. +Odoo Point of Sale allows you to manage access to a specific POS by enabling the **Multi Employees +per Session** feature. When activated, :ref:`you can select which users can log into the POS +` and :ref:`keep track of the employees involved in each order +`. -There are three ways to switch cashiers in Odoo: by *selecting the -cashier*, by *entering a PIN code* or by *scanning a barcode*. +.. _employee_login/configuration: -.. note:: - To manage multiple cashiers, you need several employees (at least two). +Configuration +============= -.. _restrict-employee-pos: +:ref:`Access the POS settings ` and select your POS, or click the vertical +ellipsis button (:guilabel:`⋮`) on a POS card and click :guilabel:`Edit`. Then, enable +:guilabel:`Multi Employees per Session`, and add the allowed employees in the :guilabel:`Allowed +Employees` field. -Set up log in with employees -============================ +.. image:: employee_login/setting.png + :alt: setting to enable multiple cashiers in POS -To enable the feature, go to your *PoS settings* and check log in with -employees on your *PoS form*. Then, add the employees that have access -to the cash register. +.. _employee_login/use: -.. image:: employee_login/multicashiers01.png - :align: center +Practical application +===================== -Now, you can switch cashier easily. +Once the feature is activated, cashiers can log in :ref:`by scanning their badge +` or selecting their name from the list of allowed employees to :ref:`open the +session `. -Switch without pin codes -======================== +.. image:: employee_login/open-session.png + :alt: window to open a session when the multiple cashiers feature is enabled -The easiest way to switch cashiers is without a code. To do so, click on -the cashier name in your PoS interface. +To switch to another user :ref:`from an open session `, click the employee name +at the top-right of the screen and select the employee to swap with from the list. -.. image:: employee_login/multicashiers02.png - :align: center +.. image:: employee_login/switch-user.png + :alt: button to switch from one cashier to another. -Now, you just have to click on your name. +You can also require your employees to enter a pin code every time they log into a POS to prevent +them from logging in as someone else. To define the code, go to the **Employees** app, open the +employee form, and click the :guilabel:`HR settings` tab. Then, enter a pin code of your choice in +the :guilabel:`PIN Code` field of the :guilabel:`Attendance/Point of Sale` category. -.. image:: employee_login/multicashiers03.png - :align: center +.. image:: employee_login/pin-and-badgeid.png + :alt: setting on the employee form to assign a badge ID and a PIN code. -.. _set-pin-code: +.. _employee_login/badge: -Switch cashier with pin codes -============================= +Log in using badges +------------------- -You can set a pin code on each cashier. To set up a pin code, go to the -employee form and add a security PIN, in the *HR settings tab*. +For your employees to be able to log in by scanning their badge, they must have a badge ID assigned. +To do so, go to the **Employees** app, open the employee form, and click the :guilabel:`HR settings` +tab. Then, enter the badge ID of your choice in the :guilabel:`Badge ID` field of the +:guilabel:`Attendance/Point of Sale` category or click :guilabel:`Generate`. -.. image:: employee_login/multicashiers04.png - :align: center +To switch to another user, lock the session by clicking the lock-shaped icon (:guilabel:`🔓`) at the +top-right of the screen and scan your badge. -Now, when switching cashier, a PIN password will be asked. +.. _employee_login/analytics: -.. image:: employee_login/multicashiers05.png - :align: center +Analytics +========= -.. _employee-barcode: +Once you close and post the POS session, access the comprehensive report to review all session +activities, including who initiated the session and who handled specific orders. To access the +session's report, click the vertical ellipsis button (:guilabel:`⋮`) on the POS card and select +:guilabel:`Sessions` from the :guilabel:`View` section. Then, select a specific session for more +detailed information, and click the :guilabel:`Orders` button to view a list of all orders placed +during that session. -Switch cashier with barcodes -============================ - -You can ask your employees to log themselves with their badges. To do -so, set up a barcode at the same place you add the PIN code. Print the -badge and when they will scan it, the cashier will be switched to that -employee. - -.. image:: employee_login/multicashiers06.png - :align: center - -Find who was the cashier -======================== - -Once you have closed your *PoS session*, you can have an overview of -the amount each cashier sold for. To do so, go to the orders menu. - -.. image:: employee_login/multicashiers07.png - :align: center - -Now, you can open the order and have a summary of the sold products. +To get an overview of all orders, regardless of the session, click the vertical ellipsis button +(:guilabel:`⋮`) on the POS card and select :guilabel:`Orders` from the :guilabel:`View` section. diff --git a/content/applications/sales/point_of_sale/employee_login/multicashiers01.png b/content/applications/sales/point_of_sale/employee_login/multicashiers01.png deleted file mode 100644 index a30408fa64..0000000000 Binary files a/content/applications/sales/point_of_sale/employee_login/multicashiers01.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/employee_login/multicashiers02.png b/content/applications/sales/point_of_sale/employee_login/multicashiers02.png deleted file mode 100644 index 11a36e47f9..0000000000 Binary files a/content/applications/sales/point_of_sale/employee_login/multicashiers02.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/employee_login/multicashiers03.png b/content/applications/sales/point_of_sale/employee_login/multicashiers03.png deleted file mode 100644 index b07e60aa60..0000000000 Binary files a/content/applications/sales/point_of_sale/employee_login/multicashiers03.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/employee_login/multicashiers04.png b/content/applications/sales/point_of_sale/employee_login/multicashiers04.png deleted file mode 100644 index e072c8c392..0000000000 Binary files a/content/applications/sales/point_of_sale/employee_login/multicashiers04.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/employee_login/multicashiers05.png b/content/applications/sales/point_of_sale/employee_login/multicashiers05.png deleted file mode 100644 index b7dd8f467f..0000000000 Binary files a/content/applications/sales/point_of_sale/employee_login/multicashiers05.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/employee_login/multicashiers06.png b/content/applications/sales/point_of_sale/employee_login/multicashiers06.png deleted file mode 100644 index e6e29a8d2d..0000000000 Binary files a/content/applications/sales/point_of_sale/employee_login/multicashiers06.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/employee_login/multicashiers07.png b/content/applications/sales/point_of_sale/employee_login/multicashiers07.png deleted file mode 100644 index e5c428774f..0000000000 Binary files a/content/applications/sales/point_of_sale/employee_login/multicashiers07.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/employee_login/open-session.png b/content/applications/sales/point_of_sale/employee_login/open-session.png new file mode 100644 index 0000000000..e81e74cd09 Binary files /dev/null and b/content/applications/sales/point_of_sale/employee_login/open-session.png differ diff --git a/content/applications/sales/point_of_sale/employee_login/pin-and-badgeid.png b/content/applications/sales/point_of_sale/employee_login/pin-and-badgeid.png new file mode 100644 index 0000000000..a0cbecf6fd Binary files /dev/null and b/content/applications/sales/point_of_sale/employee_login/pin-and-badgeid.png differ diff --git a/content/applications/sales/point_of_sale/employee_login/setting.png b/content/applications/sales/point_of_sale/employee_login/setting.png new file mode 100644 index 0000000000..8d236331d7 Binary files /dev/null and b/content/applications/sales/point_of_sale/employee_login/setting.png differ diff --git a/content/applications/sales/point_of_sale/employee_login/switch-user.png b/content/applications/sales/point_of_sale/employee_login/switch-user.png new file mode 100644 index 0000000000..f5f3e58980 Binary files /dev/null and b/content/applications/sales/point_of_sale/employee_login/switch-user.png differ diff --git a/content/applications/sales/point_of_sale/payment_methods.rst b/content/applications/sales/point_of_sale/payment_methods.rst index 3a0bdf0bcf..b60897107c 100644 --- a/content/applications/sales/point_of_sale/payment_methods.rst +++ b/content/applications/sales/point_of_sale/payment_methods.rst @@ -11,29 +11,20 @@ allow this payment method *exclusively* for registered customers. Then, select the :guilabel:`Journal`. Choose :guilabel:`Cash` to use this payment method for cash payments, or :guilabel:`Bank` to use it for card payments. -.. comment: - when created, add a link to the customeraccount page under advanced_pricing_features - .. image:: payment_methods/payment-method.png :alt: Creating a new payment method for a POS. .. note:: - - Selecting a :guilabel:`bank` journal automatically adds the :guilabel:`Use a Payment Terminal` - field in which you can add your terminal's information. - - Credentials are mandatory to use a payment terminal. To learn how to configure the different - terminals, check out the following documentation pages: - - - :doc:`Adyen configuration ` - - :doc:`Ingenico configuration ` - - :doc:`Six configuration ` - - :doc:`Stripe configuration ` - - :doc:`Vantiv configuration ` - - :doc:`Worldline configuration ` - -Once the payment method is created, you can select it to be used in your POS. To do so, go to the -:ref:`POS settings `, select the POS for which you wish to make the payment -method available in the :guilabel:`Point of Sale` field, and add the payment method(s) under the -:guilabel:`Payment` section. + Selecting a :guilabel:`bank` journal automatically adds the :guilabel:`Use a Payment Terminal` + field in which you can add your :doc:`payment terminal's information + `. + +.. seealso:: + :doc:`payment_methods/terminals`. + +Once the payment method is created, you can select it in your POS settings. To do so, go to the +:ref:`POS' settings `, click :guilabel:`Edit`, and add the payment method +under the :guilabel:`Payments` section. .. toctree:: :titlesonly: diff --git a/content/applications/sales/point_of_sale/payment_methods/payment-method.png b/content/applications/sales/point_of_sale/payment_methods/payment-method.png index 7498185e18..b4b1b3720e 100644 Binary files a/content/applications/sales/point_of_sale/payment_methods/payment-method.png and b/content/applications/sales/point_of_sale/payment_methods/payment-method.png differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals.rst b/content/applications/sales/point_of_sale/payment_methods/terminals.rst index 1ad1ef1806..c4a84e5127 100644 --- a/content/applications/sales/point_of_sale/payment_methods/terminals.rst +++ b/content/applications/sales/point_of_sale/payment_methods/terminals.rst @@ -1,9 +1,33 @@ -:nosearch: +:show-content: ================= Payment terminals ================= +Connecting and integrating a payment terminal with your POS system allows you to accept multiple +payment options, including credit and debit cards, making the payment process more efficient. + +Configuration +============= + +Go to the :doc:`application settings <../configuration>`, scroll down to the :guilabel:`Payment +Terminals` section, and tick your terminal's checkbox. + +.. image:: terminals/settings-pt.png + :alt: checkbox in the settings to enable a payment terminal + +Then, follow the corresponding documentation to configure your device: + +- :doc:`Adyen configuration ` +- :doc:`Ingenico configuration ` +- :doc:`SIX configuration ` +- :doc:`Stripe configuration ` +- :doc:`Vantiv configuration ` +- :doc:`Worldline configuration ` + +Once the terminal is configured, you can :doc:`create the corresponding payment method and add it to +the POS <../payment_methods>`. + .. toctree:: :titlesonly: diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/settings-pt.png b/content/applications/sales/point_of_sale/payment_methods/terminals/settings-pt.png new file mode 100644 index 0000000000..756951471b Binary files /dev/null and b/content/applications/sales/point_of_sale/payment_methods/terminals/settings-pt.png differ diff --git a/content/applications/sales/point_of_sale/pricing/fiscal_position.rst b/content/applications/sales/point_of_sale/pricing/fiscal_position.rst index 7b1bf16762..759847adff 100644 --- a/content/applications/sales/point_of_sale/pricing/fiscal_position.rst +++ b/content/applications/sales/point_of_sale/pricing/fiscal_position.rst @@ -9,8 +9,8 @@ The **fiscal positions** feature enables you to establish rules that automatical taxes and accounts used for each transaction. .. seealso:: - - :doc:`../../../finance/accounting/taxation/taxes/fiscal_positions` - - :doc:`../../../finance/accounting/taxation/taxes/taxes` + - :doc:`../../../finance/accounting/taxes/fiscal_positions` + - :doc:`../../../finance/accounting/taxes` Configuration ============= @@ -48,4 +48,4 @@ fiscal position's regulations. If a default fiscal position is set, the tax button displays the name of the fiscal position. .. seealso:: - :doc:`../../../finance/accounting/taxation/taxes/fiscal_positions` + :doc:`../../../finance/accounting/taxes/fiscal_positions` diff --git a/content/applications/sales/point_of_sale/receipts_invoices.rst b/content/applications/sales/point_of_sale/receipts_invoices.rst index 108f486ead..a588bbe150 100644 --- a/content/applications/sales/point_of_sale/receipts_invoices.rst +++ b/content/applications/sales/point_of_sale/receipts_invoices.rst @@ -34,6 +34,7 @@ select the corresponding order and click :guilabel:`Print Receipt`. You can filter the list of orders using the search bar. Type in your reference and click :guilabel:`Receipt Number`, :guilabel:`Date`, or :guilabel:`Customer`. +.. _receipts-invoices/invoices: Invoices ======== diff --git a/content/applications/sales/point_of_sale/shop/barcode.rst b/content/applications/sales/point_of_sale/shop/barcode.rst index 5335c6c59d..3c4e97faf5 100644 --- a/content/applications/sales/point_of_sale/shop/barcode.rst +++ b/content/applications/sales/point_of_sale/shop/barcode.rst @@ -58,5 +58,5 @@ Log employees ------------- You can also use a barcode scanner to log your employees. To do so, :ref:`restrict access -` to the POS and :ref:`use barcodes to log your employees in -` your POS. +` to the POS and :ref:`use barcodes to log your employees in +` your POS. diff --git a/content/applications/sales/sales/amazon_connector/features.rst b/content/applications/sales/sales/amazon_connector/features.rst index bc12c78b4c..d6ad6e8964 100644 --- a/content/applications/sales/sales/amazon_connector/features.rst +++ b/content/applications/sales/sales/amazon_connector/features.rst @@ -22,6 +22,8 @@ The connector is able to: delivery). - Notify Amazon of a shipping confirmed on Odoo (FBM) in order to get paid. +- Synchronize (Odoo to Amazon) all available quantities of your products (FBM). + - Support multiple seller accounts. - Support multiple marketplaces per seller account. @@ -37,8 +39,9 @@ The connector is able to: | **Gift Wrapping** | Handled by Amazon | - Gift wrapping charges | | | | - Gift message | +----------------------+----------------------------+-------------------------------------+ -| **Stock Management** | One stock move created | Handled by the delivery | -| | per sales order item | | +| **Stock Management** | One stock move created | - Handled by the delivery | +| | per sales order item | - Products available quantity | +| | | updated from Odoo to Amazon | +----------------------+----------------------------+-------------------------------------+ | **Confirmation** | Handled by Amazon | Notify Amazon when confirming | | | | delivery | diff --git a/content/applications/sales/sales/amazon_connector/manage.rst b/content/applications/sales/sales/amazon_connector/manage.rst index 167d382b73..e60b4ecc1c 100644 --- a/content/applications/sales/sales/amazon_connector/manage.rst +++ b/content/applications/sales/sales/amazon_connector/manage.rst @@ -99,19 +99,37 @@ and allows you to manage the stock of your products under the FBA program. Issue invoices and register payments ==================================== -You can issue invoices for Amazon orders in Odoo. Click **Create Invoice** in the sales order to do -so. You can also do it in batch from the list view of orders. Then, confirm and send the invoices to -your customers. +Issue invoices +-------------- + +Sending invoices to Amazon customers directly from Odoo is not feasible due to Amazon's policy of +not sharing customer email addresses. Instead, it is possible to manually upload the invoices +generated on Odoo to the Amazon backend. + +In addition, for your B2B clients, it is currently required to manually retrieve VAT numbers from +the Amazon backend before creating the invoice in Odoo. + +.. note:: + For :doc:`TaxCloud <../../../finance/accounting/taxes/taxcloud>` users: invoices created from + Amazon sales orders are **not** synchronized with TaxCloud, since Amazon already includes them in + its own tax report to TaxCloud. + +Register payments +----------------- + +As customers pay Amazon as an intermediary, creating a dedicated *Bank* journal (for example, named +`Amazon payments`) with a dedicated *Bank and Cash* intermediary account is recommended. + +In addition, as Amazon makes a single monthly payment, selecting all the invoices linked to a single +payment is necessary when registering payments. Use the dedicated `Amazon payments` +:guilabel:`Journal` and select :guilabel:`Batch Deposit` as the :guilabel:`Payment Method`. Then, +select all the payments generated and click :menuselection:`Actions --> Create batch payment --> +Validate`. .. tip:: - To display only Amazon-related orders on the list view, you can filter orders based on the sales - team. - -As the customer has paid Amazon as an intermediary, you should register invoice payments in a -payment journal dedicated to Amazon (e.g. Amazon Payments, with a dedicated intermediary account). -You can do the same with the vendor bill received from Amazon and dedicated to commissions. When you -receive the balance on your bank account at the end of the month and record your bank statements in -Odoo, you simply credit the Amazon intermediary account by the amount received. + The same can be done with vendor bills from Amazon dedicated to commissions. When the balance is + received in the bank account at the end of the month and the banks statements are recorded, + credit the Amazon intermediary account by the amount received. Follow your Amazon sales in sales reporting =========================================== diff --git a/content/applications/sales/sales/amazon_connector/setup.rst b/content/applications/sales/sales/amazon_connector/setup.rst index 0dbd4c23ae..9799fdb2f7 100644 --- a/content/applications/sales/sales/amazon_connector/setup.rst +++ b/content/applications/sales/sales/amazon_connector/setup.rst @@ -24,6 +24,12 @@ Once the account is registered, the marketplaces available to this account are s listed under the :guilabel:`Marketplaces` tab. If you wish, you can remove some items from the list of synchronized marketplaces to disable their synchronization. +Additionally, you can configure the account to automatically synchronize the available quantity of +your product present in your offers. To do so, check the :guilabel:`FBM Stock Synchronization` box. +This will automatically send to Amazon the current available quantities of products in Odoo at +regular intervals. You'll then need to :ref:`match database products in Amazon ` +for Odoo to know which products needs to be send, as well as the Amazon SKU used to recognize them. + Match database products in Amazon ================================= @@ -48,6 +54,10 @@ found, :ref:`the internal reference is used instead `. automatically done yet. This is useful if you do not use the internal reference as the SKU or if you sell the product under different conditions. +.. note:: + When synchronizing the available quantity of products, only :guilabel:`Storable Products` are + synchronized. + If no database product with a matching internal reference is found for a given SKU or gift wrapping code, a default database product **Amazon Sale** is used. The same is done with the default product **Amazon Shipping** and the shipping code. diff --git a/content/applications/sales/sales/invoicing/down_payment.rst b/content/applications/sales/sales/invoicing/down_payment.rst index 6254049112..5489bcd51c 100644 --- a/content/applications/sales/sales/invoicing/down_payment.rst +++ b/content/applications/sales/sales/invoicing/down_payment.rst @@ -1,99 +1,184 @@ -====================== -Request a down payment -====================== +============= +Down payments +============= A down payment is a partial payment made by the buyer when a sales contract is concluded. This -implies both parties' full commitment (seller and buyer) to honor the contract. With a down payment, -the buyers show their will to acquire the product and agree to pay the rest later, while the sellers -are obliged to provide the goods by accepting it. +implies both parties' (seller and buyer) full commitment to honor the contract. -Sometimes a down payment is required for expensive orders or projects. That way, you can protect -yourself and make sure that your customer is reliable. +With a down payment, the buyer pays a portion of the total amount owed while agreeing to pay the +remaining amount at a later date. In turn, the seller provides goods or services to the buyer after +accepting the down payment, trusting that the remaining amount will be paid later on. -First time you request a down payment -===================================== +Initial down payment request +============================ -When a sales order is confirmed, you then have the possibility to create an invoice. Invoices -are automatically created in drafts so that you can review them before validation. To create an -invoice, Odoo Sales offers you 3 options: +When a sales order is confirmed, the option to create an invoice becomes available, via the +:guilabel:`Create Invoice` button, located in the upper-left corner of the sales order form. When +clicked, a :guilabel:`Create invoices` pop-up appears. -- Regular invoice -- Down payment (percentage) -- Down payment (fixed amount) +.. note:: + Invoices are automatically created in drafts, so they can be reviewed before validation. -In terms of down payment, it can either be a fixed amount or a percentage of the total amount. The -first time you request a down payment, you can set a percentage or a fixed amount of your choice, -and select the right income account and taxes. These settings will be reused for future down -payments. +On the :guilabel:`Create invoices` pop-up, there are 3 options to choose from in the +:guilabel:`Create Invoice` field: -.. image:: down_payment/down_payment_1.png +- :guilabel:`Regular invoice` + .. note:: + If :guilabel:`Regular Invoice` is selected the other fields disappear, as they only pertain to + down payment configurations. +- :guilabel:`Down payment (percentage)` +- :guilabel:`Down payment (fixed amount)` + +In terms of a down payment, it can either be a fixed amount or a percentage of the total amount. + +Once the desired down payment option is selected in the :guilabel:`Create Invoice` field, designate +the desired amount (either as a percentage or fixed amount) in the :guilabel:`Down Payment Amount` +field. + +Then, select the appropriate income account for the invoice in the :guilabel:`Income Account` field, +and add a tax amount, if necessary, in the :guilabel:`Customer Taxes` field. These settings will be +reused for future down payments. + +.. image:: down_payment/create-invoices-popup-form.png :align: center - :alt: How can you do a down payment on Odoo Sales? + :alt: How to configure a down payment on Odoo Sales. .. important:: - When you request your first down payment, a new product called **Down payment** will be created. - This product will be registered as a **service** product with an invoicing policy of - **ordered quantities**. As a reminder, you can edit this product and modify it at any time. - Please note that if you choose **delivered quantities** as invoicing policy, - **you will not be able to create an invoice**. - -Basic sales flow using down payments -==================================== - -For this first example, we will use a 50% amount down payment with a product using -**ordered quantities** as invoicing policy. Make sure to check out our documentation about invoicing -policies here: :doc:`invoicing_policy` , before requesting your first down payment. When it comes to -create and view the invoice, you will only have access to a draft invoice mentioning the down -payment (as you can see below). - -.. image:: down_payment/down_payment_2.png + When a down payment is first requested, a new product called :guilabel:`Down payment` is created. + This product is registered as a :guilabel:`Service` product, with an invoicing policy of + :guilabel:`Ordered quantities`. This product can be edited and modified at any time. + +.. warning:: + If :guilabel:`Delivered quantities` is chosen as the invoicing policy, an invoice will **not** be + able to be created. + +Request a 50% down payment +========================== + +For the following example, the flow involves a 50% amount down payment on a product with +:guilabel:`Ordered quantities` as the invoicing policy. + +.. seealso:: + :doc:`/applications/sales/sales/invoicing/invoicing_policy` + +When the order is confirmed (via the :guilabel:`Confirm` button), it's time to create/view the +invoice, by clicking :guilabel:`Create Invoice`. + +Then, on the :guilabel:`Create invoices` pop-up window that appears, select :guilabel:`Down payment +(percentage)`, and type `50` in the :guilabel:`Down Payment Amount` field. Lastly, click +:guilabel:`Create and View Invoice` to create and view the invoice. + +.. image:: down_payment/create-invoices-popup.png + :align: center + :alt: Create invoices pop up window in Odoo Sales. + +Doing so reveals the draft invoice, which mentions the down payment. + +.. image:: down_payment/draft-invoice.png + :align: center + :alt: A sample draft invoice with down payment mentioned in Odoo Sales. + +From there, the invoice can be confirmed/posted, and the payment can be registered. Return to the +sales order, via the breadcrumbs. + +On the sales order, the option to view what the customer will see is available, via the +:guilabel:`Customer Preview` smart button, and the :guilabel:`Invoice` button reveals the drafted +invoice. In either case, the down payment is mentioned on both the sales order and draft invoice. + +.. image:: down_payment/down-payment-line-item.png :align: center - :alt: What is a basic sales flow using down payments on Odoo Sales (1)? + :alt: How the down payment is mentioned on the sales order in Odoo Sales. -There, you can post the invoice and register the payment of your customer. But, we all know that in -real life this flow does not happen immediately. So, for now, you can return to the sales order. -There, you will have the possibility to see the order as a customer with the **Customer preview** -button or to reach easily the previous draft invoice with the **Invoice** button. In any case, the -down payment will be mentioned on both (sales order and draft invoice). +To confirm and register the first payment of the down payment, click the :guilabel:`Invoices` smart +button to return to the invoice. On the :guilabel:`Customer Invoice` page, click +:guilabel:`Confirm`, then :guilabel:`Register Payment` to open a :guilabel:`Register Payment` +pop-up form. -.. image:: down_payment/down_payment_3.png +.. image:: down_payment/register-payment-popup.png :align: center - :alt: What is a basic sales flow using down payments on Odoo Sales (2)? + :alt: How the register payment pop up looks in Odoo Sales. + +On this form, select the appropriate :guilabel:`Journal` and confirm that the down payment amount +is correct in the :guilabel:`Amount` field. Then, make any other modifications to the other fields, +if necessary, before clicking :guilabel:`Create Payment`. -To complete the flow, when the customer wants to pay the rest of his sales order, you must create -another invoice. Once again, you will have the choice to make another down payment or to deduct all -the down payments and so, paying the rest of the invoice as a regular invoice. +Odoo returns to the invoice, which now has a green :guilabel:`In Payment` banner visible in the +upper-right corner. -.. image:: down_payment/down_payment_4.png +.. image:: down_payment/paid-banner-invoice-1.png :align: center - :alt: What is a basic sales flow using down payments on Odoo Sales (3)? + :alt: How the initial down payment invoice has a green paid banner in Odoo Sales. -This flow is also possible with a down payment taking into account a fixed amount. +Now, when the customer wants to pay the remaining amount of the order, another invoice must be +created. To do that, return to the sales order, and click :guilabel:`Create Invoice`. + +On the :guilabel:`Create invoices` pop-up window, there is now an option to :guilabel:`Deduct down +payments`, which is selected by default. + +.. image:: down_payment/deduct-down-payments-option.png + :align: center + :alt: The deduct down payment option on the create invoices pop up in Odoo Sales. + +If the remaining amount is ready to be paid, the :guilabel:`Regular Invoice` option should be +selected, and the :guilabel:`Deduct down payments` option should *stay* selected. Then, click +:guilabel:`Create and View Invoice`. + +Doing so reveals a separate :guilabel:`Invoices` page, listing all the invoices for that specific +sales order. Each invoice line item displays all the necessary information related to each invoice, +along with the current :guilabel:`Payment Status`. + +.. image:: down_payment/down-payment-invoices-page.png + :align: center + :alt: The down payment invoices page in Odoo Sales. + +To complete the flow, select the invoice with the :guilabel:`Not Paid` status, which opens that +invoice. On the invoice page, click :guilabel:`Confirm`, then :guilabel:`Register Payment`, and +confirm that the remaining :guilabel:`Amount` is correct. Then, click :guilabel:`Create Payment`. + +That pop-up window disappears, and a green :guilabel:`In Payment` banner is now present on the +invoice. The line items on the invoice show that the total amount has been paid, including mentions +of the down payment, and the flow is complete. + +This flow is also possible with the :guilabel:`Fixed amount` down payment option. .. important:: - Be careful that if you do a down payment with a product using **delivered quantities** as - invoicing policy, you won’t be able to deduct all the down payments when it comes to invoicing - your customer. Indeed, you have to deliver a product before creating the final invoice. If - nothing has been delivered, you create a **credit note** that cancels the draft invoice - created after the down payment. To do so, you have to install the **Inventory App** to confirm - the delivery. Otherwise, you can enter the delivered quantity manually on the sales order. + If a down payment is used with a product that has a :guilabel:`Delivered quantities` invoicing + policy, the down payments will **not** be able to be deducted when it comes time to invoice the + customer. This is because, due to the invoicing policy, the product(s) would have to be delivered + *before* creating the final invoice. -Modify the income account and customer taxes -============================================ + If nothing has been delivered, a :guilabel:`Credit Note` is created, which cancels the draft + invoice that was created after the down payment. To utilize the :guilabel:`Credit Note` option, + the *Inventory* application must be installed, in order to confirm the delivery. Otherwise, the + delivered quantity can be entered manually directly on the sales order. -From the products list, search for the **Down Payment** product. +Income account and customer taxes modifications +=============================================== -.. image:: down_payment/down_payment_5.png +To adjust the income account and customer taxes attached to a down payment, navigate to the +:guilabel:`Products` page (:menuselection:`Sales app --> Products --> Products`), search for the +`Down Payment` product in the search bar, and select it to reveal the product detail page. + +On the :guilabel:`Down Payment` product page, click :guilabel:`Edit`, then scroll down to the +:guilabel:`General Information` tab. In this tab, the customer taxes can be modified in the +:guilabel:`Customer Taxes` field. + +.. image:: down_payment/customer-taxes-field.png :align: center - :alt: Creation of a down payment product on Odoo Sales + :alt: How to modify the income account link to down payments + +To change or adjust the income account attached to the :guilabel:`Down Payment` product page, the +*Accounting* app **must** be installed. With the *Accounting* app installed, the +:guilabel:`Accounting` tab becomes available on the product page. That tab will **not** be +accessible without the *Accounting* app installed. -You can edit it and under the **General Information Tab** you will be able to change the customer -taxes. Now, to change the income account, you will need to install the **Accounting App** to have -the possibility to see the **Accounting Tab** on the product form. +In the :guilabel:`Accounting` tab, the income account can be changed in the :guilabel:`Income +Account` field, in the :guilabel:`Receivables` section. Once all desired changes are complete, click +:guilabel:`Save`. -.. image:: down_payment/down_payment_6.png +.. image:: down_payment/income-account.png :align: center :alt: How to modify the income account link to down payments .. seealso:: - - :doc:`invoicing_policy` + :doc:`/applications/sales/sales/invoicing/invoicing_policy` diff --git a/content/applications/sales/sales/invoicing/down_payment/down_payment_1.png b/content/applications/sales/sales/invoicing/down_payment/create-invoices-popup-form.png similarity index 100% rename from content/applications/sales/sales/invoicing/down_payment/down_payment_1.png rename to content/applications/sales/sales/invoicing/down_payment/create-invoices-popup-form.png diff --git a/content/applications/sales/sales/invoicing/down_payment/create-invoices-popup.png b/content/applications/sales/sales/invoicing/down_payment/create-invoices-popup.png new file mode 100644 index 0000000000..151f77855a Binary files /dev/null and b/content/applications/sales/sales/invoicing/down_payment/create-invoices-popup.png differ diff --git a/content/applications/sales/sales/invoicing/down_payment/customer-taxes-field.png b/content/applications/sales/sales/invoicing/down_payment/customer-taxes-field.png new file mode 100644 index 0000000000..66c920136d Binary files /dev/null and b/content/applications/sales/sales/invoicing/down_payment/customer-taxes-field.png differ diff --git a/content/applications/sales/sales/invoicing/down_payment/deduct-down-payments-option.png b/content/applications/sales/sales/invoicing/down_payment/deduct-down-payments-option.png new file mode 100644 index 0000000000..ba68f6d971 Binary files /dev/null and b/content/applications/sales/sales/invoicing/down_payment/deduct-down-payments-option.png differ diff --git a/content/applications/sales/sales/invoicing/down_payment/down-payment-invoices-page.png b/content/applications/sales/sales/invoicing/down_payment/down-payment-invoices-page.png new file mode 100644 index 0000000000..eb5a824ed7 Binary files /dev/null and b/content/applications/sales/sales/invoicing/down_payment/down-payment-invoices-page.png differ diff --git a/content/applications/sales/sales/invoicing/down_payment/down-payment-line-item.png b/content/applications/sales/sales/invoicing/down_payment/down-payment-line-item.png new file mode 100644 index 0000000000..2a18e9fedd Binary files /dev/null and b/content/applications/sales/sales/invoicing/down_payment/down-payment-line-item.png differ diff --git a/content/applications/sales/sales/invoicing/down_payment/down_payment_2.png b/content/applications/sales/sales/invoicing/down_payment/down_payment_2.png deleted file mode 100644 index d58b8798e5..0000000000 Binary files a/content/applications/sales/sales/invoicing/down_payment/down_payment_2.png and /dev/null differ diff --git a/content/applications/sales/sales/invoicing/down_payment/down_payment_3.png b/content/applications/sales/sales/invoicing/down_payment/down_payment_3.png deleted file mode 100644 index 49fc89866c..0000000000 Binary files a/content/applications/sales/sales/invoicing/down_payment/down_payment_3.png and /dev/null differ diff --git a/content/applications/sales/sales/invoicing/down_payment/down_payment_4.png b/content/applications/sales/sales/invoicing/down_payment/down_payment_4.png deleted file mode 100644 index b317b69fab..0000000000 Binary files a/content/applications/sales/sales/invoicing/down_payment/down_payment_4.png and /dev/null differ diff --git a/content/applications/sales/sales/invoicing/down_payment/down_payment_5.png b/content/applications/sales/sales/invoicing/down_payment/down_payment_5.png deleted file mode 100644 index 099ab60d84..0000000000 Binary files a/content/applications/sales/sales/invoicing/down_payment/down_payment_5.png and /dev/null differ diff --git a/content/applications/sales/sales/invoicing/down_payment/draft-invoice.png b/content/applications/sales/sales/invoicing/down_payment/draft-invoice.png new file mode 100644 index 0000000000..86eef54f74 Binary files /dev/null and b/content/applications/sales/sales/invoicing/down_payment/draft-invoice.png differ diff --git a/content/applications/sales/sales/invoicing/down_payment/down_payment_6.png b/content/applications/sales/sales/invoicing/down_payment/income-account.png similarity index 100% rename from content/applications/sales/sales/invoicing/down_payment/down_payment_6.png rename to content/applications/sales/sales/invoicing/down_payment/income-account.png diff --git a/content/applications/sales/sales/invoicing/down_payment/paid-banner-invoice-1.png b/content/applications/sales/sales/invoicing/down_payment/paid-banner-invoice-1.png new file mode 100644 index 0000000000..629ec0e83b Binary files /dev/null and b/content/applications/sales/sales/invoicing/down_payment/paid-banner-invoice-1.png differ diff --git a/content/applications/sales/sales/invoicing/down_payment/register-payment-popup.png b/content/applications/sales/sales/invoicing/down_payment/register-payment-popup.png new file mode 100644 index 0000000000..a35951e8f2 Binary files /dev/null and b/content/applications/sales/sales/invoicing/down_payment/register-payment-popup.png differ diff --git a/content/applications/sales/sales/invoicing/invoicing_policy.rst b/content/applications/sales/sales/invoicing/invoicing_policy.rst index 595c0de014..b4da02c067 100644 --- a/content/applications/sales/sales/invoicing/invoicing_policy.rst +++ b/content/applications/sales/sales/invoicing/invoicing_policy.rst @@ -4,78 +4,82 @@ Invoice based on delivered or ordered quantities Different business policies might require different options for invoicing: -- The **Invoice what is ordered** rule is used as **default mode** in Odoo Sales, which means that - customers will be invoiced once the sales order is confirmed. +- The *Invoice what is ordered* rule is used as the default mode in Odoo *Sales*, which means + customers are invoiced once the sales order is confirmed. +- The *Invoice what is delivered* rule invoices customers once the delivery is done. This rule is + often used for businesses that sell materials, liquids, or food in large quantities. In these + cases, the ordered quantity may differ slightly from the delivered quantity, making it preferable + to invoice the quantity actually delivered. -- The **Invoice what is delivered** rule will invoice customers once the delivery is done. This rule - concerns businesses that sell materials, liquids or food in large quantities. In these cases, the - quantity might diverge a little bit and it is, therefore, preferable to invoice the quantity - actually delivered. +Being able to have different invoicing options provides more flexibility. -Being able to have different invoicing options allow you more flexibility. Indeed, you need to know -exactly how to invoice your customers for different situations. +Invoicing policy features +========================= -Activate these features -======================= +To activate the necessary invoicing policy features, go to :menuselection:`Sales app --> +Configuration --> Settings`, and under the :guilabel:`Invoicing` heading, select an +:guilabel:`Invoicing Policy` rule: :guilabel:`Invoice what is ordered` or :guilabel:`Invoice what is +delivered`. -Go to :menuselection:`Sales --> Configuration --> Settings` and under **Invoicing policy** choose -the rule you want to apply. - -.. image:: invoicing_policy/invoicing_policy_1.png +.. image:: invoicing_policy/invoicing-policy-setting.png :align: center - :class: img-thumbnail - :alt: How to choose your invoicing policy on Odoo Sales? + :alt: Choosing an invoicing policy on Odoo Sales. .. important:: - If you decide to choose the **Invoice what is delivered** rule, you will not be able to - activate the feature called **Automatic invoice**, which automatically generates invoices when - the online payment is confirmed. + If the :guilabel:`Invoice what is delivered` rule is chosen, it is **not** possible to activate + the :guilabel:`Automatic Invoice` feature, which automatically generates invoices when an online + payment is confirmed. -Choose an invoicing policy on a product form -============================================ +Invoicing policy on product form +================================ -From any product page, under the **Sales tab**, you will find the invoicing policy, which can be -manually changed. +On any product page, via the :menuselection:`Sales app --> Products --> Products dashboard`, locate +the :guilabel:`Invoicing Policy` option located under the :guilabel:`General Information` tab. It +can be changed manually using the drop-down menu. -.. image:: invoicing_policy/invoicing_policy_5.png +.. image:: invoicing_policy/invoicing-policy-general-info-tab.png :align: center - :class: img-thumbnail - :alt: How to change your invoicing policy on a product form on Odoo Sales? + :alt: How to change your invoicing policy on a product form on Odoo Sales. Impact on sales flow ==================== -On Odoo Sales, the basic sales flow will be to create a quotation, send it to your customer, -wait for confirmation, confirm the sales order and create an invoice. +In Odoo *Sales*, the basic sales flow starts with the creation of a quotation. Then, that quotation +is sent to a customer. Next, it needs to be confirmed, which turns the quotation into a sales order. +This, in turn, creates an invoice. + +The following is a breakdown of how invoicing policy rules impact the aforementioned sales flow: -- **Invoice what is ordered**: No impact on this basic sales flow. Indeed, you can invoice as soon - as the sale is confirmed. +- :guilabel:`Invoice what is ordered`: No impact on the basic sales flow. An invoice is created as + soon as a sale is confirmed. +- :guilabel:`Invoice what is delivered`: Minor impact on sales flow, because the delivered quantity + needs to be manually entered on the sales order. Or, the *Inventory* app can be installed and used + to confirm the delivered quantity before creating an invoice with the *Sales* app. -- **Invoice what is delivered**: Small impact on sales flow because you will have to manually - enter the delivered quantity on the sales order or to install the **Inventory App** to confirm the - delivered quantity before creating an invoice, with the **Sales App**. Indeed, if you try to - create an invoice without validating the delivered quantity, you will receive an error message as - below. +.. warning:: + If a user attempts to create an invoice without validating the delivered quantity, the following + error message appears: :guilabel:`There is no invoiceable line. If a product has a Delivered + quantities invoicing policy, please make sure that a quantity has been delivered.` - .. image:: invoicing_policy/invoicing_policy_3.png - :class: img-thumbnail - :alt: How the choice of your invoicing policy impacts your sales flow on Odoo Sales? + .. image:: invoicing_policy/invoicing-policy-error-message.png + :align: center + :alt: If Delivered Quantities invoicing policy is chosen, ensure a quantity has been delivered. .. note:: - Once the quotation is confirmed and that the status went from **Quotation sent** to - **Sales order**, you are able to see your delivered and invoiced quantities directly from your - sales order (it is true for both rules). + Once a quotation is confirmed, and the status changes from :guilabel:`Quotation sent` to + :guilabel:`Sales order`, the delivered and invoiced quantities are available to view, directly + from the sales order. This is true for both invoicing policy rule options. - .. image:: invoicing_policy/invoicing_policy_4.png + .. image:: invoicing_policy/invoicing-policy-order-lines.png :align: center - :class: img-thumbnail - :alt: How to see your delivered and invoiced quantities on Odoo Sales? + :alt: How to see your delivered and invoiced quantities on Odoo Sales. - Odoo will automatically add the quantities to the invoice (even if it is a partial delivery). + Odoo automatically adds the quantities to the invoice, both :guilabel:`Delivered` and + :guilabel:`Invoiced`, even if it's a partial delivery, when the quotation is confirmed. -Finally, to create an invoice, you will have different possibilities: regular invoice or down -payment (percentage or fixed amount). +Finally, there are a few different options to create an invoice: :guilabel:`Regular invoice`, +:guilabel:`Down payment (percentage)` or :guilabel:`Down payment (fixed amount)`. -.. important:: - Be sure to check out our documentation about down payment here: :doc:`down_payment`, to master - this incredible feature. +.. seealso:: + Be sure to check out the documentation explaining down payment options to learn more: + :doc:`/applications/sales/sales/invoicing/down_payment` diff --git a/content/applications/sales/sales/invoicing/invoicing_policy/invoicing_policy_3.png b/content/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-error-message.png similarity index 100% rename from content/applications/sales/sales/invoicing/invoicing_policy/invoicing_policy_3.png rename to content/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-error-message.png diff --git a/content/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-general-info-tab.png b/content/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-general-info-tab.png new file mode 100644 index 0000000000..658440b148 Binary files /dev/null and b/content/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-general-info-tab.png differ diff --git a/content/applications/sales/sales/invoicing/invoicing_policy/invoicing_policy_4.png b/content/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-order-lines.png similarity index 100% rename from content/applications/sales/sales/invoicing/invoicing_policy/invoicing_policy_4.png rename to content/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-order-lines.png diff --git a/content/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-setting.png b/content/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-setting.png new file mode 100644 index 0000000000..890c769aa3 Binary files /dev/null and b/content/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-setting.png differ diff --git a/content/applications/sales/sales/invoicing/invoicing_policy/invoicing_policy_1.png b/content/applications/sales/sales/invoicing/invoicing_policy/invoicing_policy_1.png deleted file mode 100644 index 8a74347eb6..0000000000 Binary files a/content/applications/sales/sales/invoicing/invoicing_policy/invoicing_policy_1.png and /dev/null differ diff --git a/content/applications/sales/sales/invoicing/invoicing_policy/invoicing_policy_5.png b/content/applications/sales/sales/invoicing/invoicing_policy/invoicing_policy_5.png deleted file mode 100644 index 6e3db46e11..0000000000 Binary files a/content/applications/sales/sales/invoicing/invoicing_policy/invoicing_policy_5.png and /dev/null differ diff --git a/content/applications/sales/sales/invoicing/proforma.rst b/content/applications/sales/sales/invoicing/proforma.rst index 243d14dbde..b933fa1801 100644 --- a/content/applications/sales/sales/invoicing/proforma.rst +++ b/content/applications/sales/sales/invoicing/proforma.rst @@ -1,34 +1,54 @@ -======================== -Send a pro-forma invoice -======================== +================== +Pro-forma invoices +================== + +A *pro-forma invoice* is an abridged or estimated invoice sent in advance of a delivery of goods. It +notes the kind and quantity of goods, their value, and other important information, such as weight +and transportation charges. -A pro-forma invoice is an abridged or estimated invoice in advance of a -delivery of goods. It notes the kind and quantity of goods, their value, -and other important information such as weight and transportation -charges. Pro-forma invoices are commonly used as preliminary invoices -with a quotation, or for customs purposes in importation. They differ -from a normal invoice in not being a demand or request for payment. +Pro-forma invoices are commonly used as preliminary invoices with a quotation. They are also used +for customs purposes during importation. They differ from a normal invoice in that they are not a +demand (or request) for payment. Activate the feature ==================== -Go to :menuselection:`SALES --> Configuration --> Settings` and activate -the *Pro-Forma Invoice* feature. +In order to utilize pro-forma invoices, the *Pro-Forma Invoice* feature **must** be activated. To do +that, navigate to :menuselection:`Sales app --> Configuration --> Settings`, and in the +:guilabel:`Quotations & Orders` section, click the checkbox next to :guilabel:`Pro-Forma Invoice`. +Then, click :guilabel:`Save` to save all changes. -.. image:: proforma/proforma01.png - :align: center +.. image:: proforma/pro-forma-setting.png + :align: center + :alt: The Pro-Forma Invoice feature setting in the Odoo Sales application. Send a pro-forma invoice ======================== -From any quotation or sales order, you know have an option to send a -pro-forma invoice. +With the :guilabel:`Pro-Forma Invoice` feature activated, the option to send a pro-forma invoice is +now available on any quotation or sales order, via the :guilabel:`Send Pro-Forma Invoice` button. + +.. image:: proforma/send-pro-forma-invoice-button.png + :align: center + :alt: The Send Pro-Forma Invoice button on a typical sales order in Odoo Sales. + +When the :guilabel:`Send Pro-Forma Invoice` button is clicked, an email pop-up appears. The +:guilabel:`Recipients` field is auto-populated with the customer from the sales order or quotation. +Then, if needed, modify the :guilabel:`Subject` field and the body of the email. The pro-forma +invoice is automatically added as an attachment to the email. + +When ready, click :guilabel:`Send`, and Odoo instantly sends the email, with the attached pro-forma +invoice, to the customer. -.. image:: proforma/proforma02.png - :align: center +.. image:: proforma/pro-forma-email-message-popup.png + :align: center + :alt: The email pop-up window that appears with pro-forma invoice attached in Odoo Sales. -When you click on send, Odoo will send an email with the pro-forma -invoice in attachment. +.. tip:: + To preview what the pro-forma invoice looks like, click on the PDF at the bottom of the email + pop-up window *before* clicking :guilabel:`Send`. When clicked, the pro-forma invoice is + downloaded instantly. Open that PDF to view (and review) the pro-forma invoice. -.. image:: proforma/proforma03.png - :align: center + .. image:: proforma/pro-forma-pdf.png + :align: center + :alt: Sample pro-forma invoice PDF from Odoo Sales. diff --git a/content/applications/sales/sales/invoicing/proforma/pro-forma-email-message-popup.png b/content/applications/sales/sales/invoicing/proforma/pro-forma-email-message-popup.png new file mode 100644 index 0000000000..de4a7e28ff Binary files /dev/null and b/content/applications/sales/sales/invoicing/proforma/pro-forma-email-message-popup.png differ diff --git a/content/applications/sales/sales/invoicing/proforma/pro-forma-pdf.png b/content/applications/sales/sales/invoicing/proforma/pro-forma-pdf.png new file mode 100644 index 0000000000..3a595795f4 Binary files /dev/null and b/content/applications/sales/sales/invoicing/proforma/pro-forma-pdf.png differ diff --git a/content/applications/sales/sales/invoicing/proforma/proforma01.png b/content/applications/sales/sales/invoicing/proforma/pro-forma-setting.png similarity index 100% rename from content/applications/sales/sales/invoicing/proforma/proforma01.png rename to content/applications/sales/sales/invoicing/proforma/pro-forma-setting.png diff --git a/content/applications/sales/sales/invoicing/proforma/proforma02.png b/content/applications/sales/sales/invoicing/proforma/proforma02.png deleted file mode 100644 index c00219e540..0000000000 Binary files a/content/applications/sales/sales/invoicing/proforma/proforma02.png and /dev/null differ diff --git a/content/applications/sales/sales/invoicing/proforma/proforma03.png b/content/applications/sales/sales/invoicing/proforma/proforma03.png deleted file mode 100644 index 8085cb6b8b..0000000000 Binary files a/content/applications/sales/sales/invoicing/proforma/proforma03.png and /dev/null differ diff --git a/content/applications/sales/sales/invoicing/proforma/send-pro-forma-invoice-button.png b/content/applications/sales/sales/invoicing/proforma/send-pro-forma-invoice-button.png new file mode 100644 index 0000000000..25a6dcdcf1 Binary files /dev/null and b/content/applications/sales/sales/invoicing/proforma/send-pro-forma-invoice-button.png differ diff --git a/content/applications/sales/sales/products_prices.rst b/content/applications/sales/sales/products_prices.rst index 5a5d346657..08c9fbbbdc 100644 --- a/content/applications/sales/sales/products_prices.rst +++ b/content/applications/sales/sales/products_prices.rst @@ -8,7 +8,7 @@ Products & Prices :titlesonly: products_prices/products - products_prices/taxes products_prices/prices products_prices/returns products_prices/ewallets_giftcards + products_prices/loyalty_discount diff --git a/content/applications/sales/sales/products_prices/loyalty_discount.rst b/content/applications/sales/sales/products_prices/loyalty_discount.rst new file mode 100644 index 0000000000..20eaf93563 --- /dev/null +++ b/content/applications/sales/sales/products_prices/loyalty_discount.rst @@ -0,0 +1,189 @@ +============================= +Discount and loyalty programs +============================= + +The Odoo *Sales*, *eCommerce*, and *Point of Sale* applications allow users to create discount and +loyalty programs that customers can use for online and in-store shopping. These programs offer more +varied, public, and time-sensitive pricing options than :doc:`pricelists +`. + +Configure the settings +====================== + +To begin using discount and loyalty programs, navigate to :menuselection:`Sales --> Configuration +--> Settings`. Under the :guilabel:`Pricing` heading, activate the :guilabel:`Discounts, Loyalty & +Gift Card` setting by checking the box next to the feature. Finally, click :guilabel:`Save` to save +the changes. + +Configure discount and loyalty programs +======================================= + +To create discount and loyalty programs, go to :menuselection:`Sales --> Products --> Discount & +Loyalty`. + +If no discount or loyalty programs have been created yet, Odoo provides a choice of templates to +help create the first program. Choose one of the template cards, or click :guilabel:`New` to create +a new program from scratch. + +Or, if there are already existing programs, select an existing program to edit it. + +.. image:: loyalty_discount/price-discount-loyalty.png + :align: center + :alt: Discount and loyalty program template cards. + +.. note:: + Templates only appear when no programs have been created, and they disappear once the first + program is created. + +Creating or editing a program opens the program form. + +The program form contains the following options: + +- :guilabel:`Program Name`: Enter the name of the program. The program name is *not* visible to the + customer. +- :guilabel:`Program Type`: Select the desired :ref:`program type + `. +- :guilabel:`Currency`: Select the currency used for the program. +- :guilabel:`Points Unit`: Enter the name of the points used for the :guilabel:`Loyalty Cards` + program (e.g. `Loyalty Points`). The points unit name *is* visible to the customer. This field is + only available when the :guilabel:`Program Type` is set to :guilabel:`Loyalty Cards`. +- :guilabel:`Validity`: Select the date until which the program is valid. Leave this field blank for + no end date, meaning the program is always valid and does not expire. +- :guilabel:`Limit Usage`: Check this box and enter a number to limit the number of times the + program can be used during the :guilabel:`Validity` period. +- :guilabel:`Company`: In the case of multiple companies, choose the company for which the program + is available. +- :guilabel:`Available On`: Select the app(s) on which the program is available. +- :guilabel:`Website`: Select the website(s) on which the program is available. Leave this field + blank to make it available on all websites. +- :guilabel:`Point of Sale`: Select the point(s) of sale at which the program is available. Leave + this field blank to make it available at all :abbr:`PoS (Point of Sale)`. + +.. image:: loyalty_discount/price-programs.png + :align: center + :alt: Program options on the loyalty program form. + +.. note:: + The options available on the program form vary depending on the :ref:`Program Type + ` selected. + +All of the existing cards, codes, coupons, etc. that have been generated for the program are +accessible through the smart button located in the upper-right corner of the form. + +.. image:: loyalty_discount/price-programs-items.png + :align: center + :alt: Program items smart button on the loyalty program form. + +.. _sales/pricing_management/program-types: + +Program types +------------- + +The different :guilabel:`Program Types` available on the program form are: + +- :guilabel:`Coupons`: Generate and share single-use coupon codes that grant immediate access to + rewards. +- :guilabel:`Next Order Coupons`: Generate and share single-use coupon codes that grant access to + rewards on the customer's next order. +- :guilabel:`Loyalty Cards`: When making purchases, the customer accumulates points to exchange for + rewards on future orders. +- :guilabel:`Promotions`: Set conditional rules for ordering products, which, when fulfilled, grant + access to rewards for the customer. +- :guilabel:`Discount Code`: Set codes which, when entered upon checkout, grant discounts to the + customer. +- :guilabel:`Buy X Get Y`: For every X item bought, the customer is granted 1 credit. After + accumulating a specified amount of credits, the customer can trade them in to receive Y item. + +Conditional rules +----------------- + +Next, configure the :guilabel:`Conditional rules` that determine when the program applies to a +customer's order. + +In the :guilabel:`Rules & Rewards` tab, click :guilabel:`Add` next to :guilabel:`Conditional rules` +to add *conditions* to the program. This reveals a :guilabel:`Create Conditional rules` pop-up +window. + +.. image:: loyalty_discount/price-conditional-rewards.png + :align: center + :alt: Rules & Rewards tab of the loyalty program form. + +.. note:: + The options for :guilabel:`Conditional rules` vary depending on the selected :ref:`Program Type + `. + +The following options are available for configuring conditional rules: + +- :guilabel:`Discount Code`: Enter a custom code to be used for the :guilabel:`Discount Code` + program, or use the default one generated by Odoo. This field is only available when the + :guilabel:`Program Type` is set to :guilabel:`Discount Code`. +- :guilabel:`Minimum Quantity`: Enter the minimum number of products that must be purchased in order + to access the reward. Set the minimum quantity to at least `1` to ensure that the customer must + make a purchase in order to access the reward. +- :guilabel:`Minimum Purchase`: Enter the minimum amount (in currency), with :guilabel:`tax + Included` or :guilabel:`tax Excluded`, that must be spent in order to access the reward. If both a + minimum quantity *and* minimum purchase amount are entered, then the customer's order must meet + both conditions. +- :guilabel:`Products`: Select the specific product(s) for which the program applies. Leave this + field blank to apply it to all products. +- :guilabel:`Categories`: Select the category of products for which the program applies. Choose + :guilabel:`All` to apply it to all product categories. +- :guilabel:`Product Tag:` Select a tag to apply the program to products with that specific tag. +- :guilabel:`Grant`: Enter the number of points the customer earns :guilabel:`per order`, + :guilabel:`per currency spent`, or :guilabel:`per unit paid` (for the :guilabel:`Loyalty Cards` + and :guilabel:`Buy X Get Y` programs). + +.. image:: loyalty_discount/price-conditions.png + :align: center + :alt: Conditional rules configuration window for a discount or loyalty program. + +Click :guilabel:`Save & Close` to save the rule and close the pop-up window, or click +:guilabel:`Save & New` to save the rule and immediately create a new one. + +Rewards +------- + +In the :guilabel:`Rules & Rewards` tab of the program form, click :guilabel:`Add` next to +:guilabel:`Rewards` to add *rewards* to the program. This reveals a :guilabel:`Create Rewards` +pop-up window. + +.. note:: + The options for :guilabel:`Rewards` vary depending on the selected :ref:`Program Type + `. + +The following options are available for configuring rewards: + +- :guilabel:`Reward Type`: Select the reward type among :guilabel:`Free Product`, + :guilabel:`Discount`, and :guilabel:`Free Shipping`. The other options for reward configuration + depend on the :guilabel:`Reward Type` selected. + + - :guilabel:`Free Product`: + + - :guilabel:`Quantity Rewarded`: Select the number of free products rewarded to the customer. + - :guilabel:`Product`: Select the product given for free as a reward. Only one product can be + selected. + - :guilabel:`Product Tag`: Select a tag to further specify the free product eligible for the + reward. + + - :guilabel:`Discount`: + + - :guilabel:`Discount`: Enter the discounted amount in either :guilabel:`percentage`, + :guilabel:`currency per point`, or :guilabel:`currency per order`. Then, select whether the + discount applies to the entire :guilabel:`Order`, only the :guilabel:`Cheapest Product` on the + order, or only :guilabel:`Specific Products`. + - :guilabel:`Max Discount`: Enter the maximum amount (in currency) that this reward may grant as + a discount. Leave this field at `0` for no limit. + + - :guilabel:`Free Shipping`: + + - :guilabel:`Max Discount`: Enter the maximum amount (in currency) that this reward may grant as + a discount. Leave this field at `0` for no limit. + +- :guilabel:`In exchange of`: Enter the number of points required to exchange for the reward (for + the :guilabel:`Loyalty Cards` and :guilabel:`Buy X Get Y` programs). +- :guilabel:`Description on order`: Enter the description of the reward, which is displayed to the + customer upon checkout. + +.. image:: loyalty_discount/price-rewards.png + :align: center + :alt: Rewards configuration window for a discount or loyalty program. diff --git a/content/applications/sales/sales/products_prices/loyalty_discount/price-conditional-rewards.png b/content/applications/sales/sales/products_prices/loyalty_discount/price-conditional-rewards.png new file mode 100644 index 0000000000..3425ec6be7 Binary files /dev/null and b/content/applications/sales/sales/products_prices/loyalty_discount/price-conditional-rewards.png differ diff --git a/content/applications/sales/sales/products_prices/loyalty_discount/price-conditions.png b/content/applications/sales/sales/products_prices/loyalty_discount/price-conditions.png new file mode 100644 index 0000000000..ce1c4ddad0 Binary files /dev/null and b/content/applications/sales/sales/products_prices/loyalty_discount/price-conditions.png differ diff --git a/content/applications/sales/sales/products_prices/loyalty_discount/price-discount-loyalty.png b/content/applications/sales/sales/products_prices/loyalty_discount/price-discount-loyalty.png new file mode 100644 index 0000000000..546cb2f021 Binary files /dev/null and b/content/applications/sales/sales/products_prices/loyalty_discount/price-discount-loyalty.png differ diff --git a/content/applications/sales/sales/products_prices/loyalty_discount/price-programs-items.png b/content/applications/sales/sales/products_prices/loyalty_discount/price-programs-items.png new file mode 100644 index 0000000000..b350b32f72 Binary files /dev/null and b/content/applications/sales/sales/products_prices/loyalty_discount/price-programs-items.png differ diff --git a/content/applications/sales/sales/products_prices/loyalty_discount/price-programs.png b/content/applications/sales/sales/products_prices/loyalty_discount/price-programs.png new file mode 100644 index 0000000000..2d117f7b20 Binary files /dev/null and b/content/applications/sales/sales/products_prices/loyalty_discount/price-programs.png differ diff --git a/content/applications/sales/sales/products_prices/loyalty_discount/price-rewards.png b/content/applications/sales/sales/products_prices/loyalty_discount/price-rewards.png new file mode 100644 index 0000000000..f33a9e3f09 Binary files /dev/null and b/content/applications/sales/sales/products_prices/loyalty_discount/price-rewards.png differ diff --git a/content/applications/sales/sales/products_prices/taxes.rst b/content/applications/sales/sales/products_prices/taxes.rst deleted file mode 100644 index 2933aff163..0000000000 --- a/content/applications/sales/sales/products_prices/taxes.rst +++ /dev/null @@ -1,14 +0,0 @@ -:nosearch: - -========= -Set taxes -========= - -.. toctree:: - :titlesonly: - - /applications/finance/accounting/taxation/taxes/default_taxes - /applications/finance/accounting/taxation/taxes/fiscal_positions - /applications/finance/accounting/taxation/taxes/taxes - /applications/finance/accounting/taxation/taxes/taxcloud - /applications/finance/accounting/taxation/taxes/B2B_B2C diff --git a/content/applications/sales/sales/send_quotations.rst b/content/applications/sales/sales/send_quotations.rst index 5dc617841c..15b4be0074 100644 --- a/content/applications/sales/sales/send_quotations.rst +++ b/content/applications/sales/sales/send_quotations.rst @@ -12,6 +12,4 @@ Send Quotations send_quotations/get_signature_to_validate send_quotations/get_paid_to_validate send_quotations/deadline - send_quotations/different_addresses - send_quotations/terms_and_conditions send_quotations/orders_and_variants diff --git a/content/applications/sales/sales/send_quotations/deadline.rst b/content/applications/sales/sales/send_quotations/deadline.rst index 9451f54f7b..b65f0bbccf 100644 --- a/content/applications/sales/sales/send_quotations/deadline.rst +++ b/content/applications/sales/sales/send_quotations/deadline.rst @@ -1,44 +1,60 @@ -=================================================== -Use quotations deadline to stimulate your customers -=================================================== +=================== +Quotation deadlines +=================== -When sending quotations, it is important to set a deadline to encourage your customers to act. -Indeed, this will stimulate them because they will be afraid of missing a good deal and it will also -allow you to protect yourself in case you have to fulfill an order at a price that is no longer -profitable for you. +In the Odoo *Sales* application, it is possible to set deadlines on sales quotations. Doing so +encourages customers to act quickly during sales negotiations, for they might fear for missing out +on a good deal. As well, deadlines also can also act as protection for a company in case an order +has to be fulfilled at a price that is no longer profitable for the business. -Set a deadline -============== +Expiration date deadlines +========================= -With Odoo Sales, it is possible to instantly add an **Expiration Date** from the quotation or the -sales order. +On an Odoo *Sales* quotation, add an expiration date in the :guilabel:`Expiration` field located at +the top of the quotation or sales order form. -.. image:: deadline/quotation_deadlines_1.png +To add an expiration date to a quotation, navigate to :menuselection:`Sales app`, and select a +desired quotation, or create a new one by clicking :guilabel:`Create`. + +On the quotation form, click :guilabel:`Edit` (if modifying a pre-existing quotation), and click the +:guilabel:`Expiration` field. Doing so reveals a drop-down calendar, in which the month and date can +be designated as the expiration date of the quotation. + +.. image:: deadline/quotation-deadlines-expiration-field.png :align: center - :class: img-thumbnail - :alt: How to configure deadlines on Odoo Sales? + :alt: How to configure deadlines on Odoo Sales. + +Once the expiration date is selected, click :guilabel:`Save` to save all changes. + +Deadlines in quotation templates +================================ + +The Odoo *Sales* application also makes it possible to add a deadline to every quotation template. +Whenever a specific quotation template is used in a quote, its associated deadline is automatically +applied. + +To add a deadline to a quotation template, navigate to :menuselection:`Sales app --> Configuration +--> Quotation Templates`, and either select the desired quotation template to which a deadline +should be added, or click :guilabel:`Create` to build a new quotation template from scratch. -Use deadline in your quotation templates -======================================== +On the quotation template detail page, click the :guilabel:`Edit` button to edit the quotation. -It is also possible to add a deadline to every quotation template created. Whenever a specific -quotation template is used in a quote, its associated deadline will be automatically applied. Be -sure to check out our documentation about :doc:`quote_template` to excel in their use. +Then, add a specific number of days to the :guilabel:`Quotation expires after` field, located +beneath the quotation template name. The number of days represents how long the quotation will be +valid for, before it expires. When done, click :guilabel:`Save`. -.. image:: deadline/quotation_deadlines_2.png +.. image:: deadline/quotation-deadlines-expires-after.png :align: center - :class: img-thumbnail - :alt: How to use deadline in a quotation template on Odoo Sales? + :alt: How to use deadline in a quotation template on Odoo Sales. .. tip:: - By clicking on the **Customer Preview** button, you will be able to see when the offer expires. - For your information, the number of days will be the same as those mentioned in the quotation - template. + By clicking the :guilabel:`Customer Preview` button on a quotation, Odoo clearly displays when + that specific offer expires. As a reminder, the number of days is the same as those mentioned in + the quotation template (if a quotation template was used for the initial quotation). - .. image:: deadline/quotation_deadlines_3.png + .. image:: deadline/quotation-deadlines-preview.png :align: center - :class: img-thumbnail - :alt: How customers will see deadlines on Odoo Sales? + :alt: How customers will see deadlines on Odoo Sales. .. seealso:: - - :doc:`quote_template` + :doc:`/applications/sales/sales/send_quotations/quote_template` diff --git a/content/applications/sales/sales/send_quotations/deadline/quotation_deadlines_1.png b/content/applications/sales/sales/send_quotations/deadline/quotation-deadlines-expiration-field.png similarity index 100% rename from content/applications/sales/sales/send_quotations/deadline/quotation_deadlines_1.png rename to content/applications/sales/sales/send_quotations/deadline/quotation-deadlines-expiration-field.png diff --git a/content/applications/sales/sales/send_quotations/deadline/quotation_deadlines_2.png b/content/applications/sales/sales/send_quotations/deadline/quotation-deadlines-expires-after.png similarity index 100% rename from content/applications/sales/sales/send_quotations/deadline/quotation_deadlines_2.png rename to content/applications/sales/sales/send_quotations/deadline/quotation-deadlines-expires-after.png diff --git a/content/applications/sales/sales/send_quotations/deadline/quotation_deadlines_3.png b/content/applications/sales/sales/send_quotations/deadline/quotation-deadlines-preview.png similarity index 100% rename from content/applications/sales/sales/send_quotations/deadline/quotation_deadlines_3.png rename to content/applications/sales/sales/send_quotations/deadline/quotation-deadlines-preview.png diff --git a/content/applications/sales/sales/send_quotations/different_addresses.rst b/content/applications/sales/sales/send_quotations/different_addresses.rst deleted file mode 100644 index 72085473a6..0000000000 --- a/content/applications/sales/sales/send_quotations/different_addresses.rst +++ /dev/null @@ -1,62 +0,0 @@ -========================================== -Deliver and invoice to different addresses -========================================== - -People and businesses often use separate addresses for billing (invoicing) and shipping (delivery) -purposes. With the Odoo *Sales* app, contacts can have different specified addresses for delivery -and invoicing. - -Configure the settings -====================== - -Go to :menuselection:`Invoicing --> Configuration --> Settings` and scroll down to the -:guilabel:`Customer Invoices` section. Then, check the box next to :guilabel:`Customer Addresses`, -and click :guilabel:`Save`. - -.. note:: - Navigating through the *Invoicing* app will not be possible if the *Accounting* app has been - installed. Instead, go through :menuselection:`Accounting --> Configuration --> Settings` to - enable the :guilabel:`Customer Addresses` feature. - -.. image:: different_addresses/customer-addresses-setting.png - :align: center - :alt: Activate the Customer Addresses setting. - -Configure the contact form -========================== - -Navigate to the :menuselection:`Contacts` app (or to :menuselection:`Sales --> Orders --> -Customers`), and click on a customer to open their contact form. - -Under the :guilabel:`Contacts & Addresses` tab, click :guilabel:`Add`. - -.. image:: different_addresses/contact-form-add-address.png - :align: center - :alt: Add a contact/address to the contact form - -Then, select which type of address to add to the contact form (i.e. :guilabel:`Invoice Address` or -:guilabel:`Delivery Address`). - -.. image:: different_addresses/create-contact-window.png - :align: center - :alt: Create a new contact/address on a contact form. - -Enter the address information. Then click :guilabel:`Save & Close` to save the address and close the -:guilabel:`Create Contact` window. Or, click :guilabel:`Save & New` to save this address and -immediately input another one. - -Add addresses to the quotation -============================== - -When a customer is added to a quotation, the :guilabel:`Invoice Address` and :guilabel:`Delivery -Address` fields will autopopulate according to the addresses specified on the customer's contact -form. - -.. image:: different_addresses/quotation-address-autopopulate.png - :align: center - :alt: Invoice and Delivery Addresses autopopulate on a quotation. - -The :guilabel:`Invoice Address` and :guilabel:`Delivery Address` can also be edited directly from -the quotation by clicking on the :guilabel:`Internal link` buttons next to each address line. - -These addresses can be updated at any time to ensure accurate invoicing and delivery. diff --git a/content/applications/sales/sales/send_quotations/different_addresses/customer-addresses-setting.png b/content/applications/sales/sales/send_quotations/different_addresses/customer-addresses-setting.png deleted file mode 100644 index 72b86beb58..0000000000 Binary files a/content/applications/sales/sales/send_quotations/different_addresses/customer-addresses-setting.png and /dev/null differ diff --git a/content/applications/sales/sales/send_quotations/get_signature_to_validate.rst b/content/applications/sales/sales/send_quotations/get_signature_to_validate.rst index 2940b3bee1..57056a69f5 100644 --- a/content/applications/sales/sales/send_quotations/get_signature_to_validate.rst +++ b/content/applications/sales/sales/send_quotations/get_signature_to_validate.rst @@ -1,51 +1,52 @@ -=================================== -Get a signature to confirm an order -=================================== +========================================= +Online signatures for order confirmations +========================================= -Online signatures are like electronic "fingerprints". By using them on Odoo, you will get -automatic orders confirmation. You and your customers will save a lot of time by using this -feature compared to a traditional process. +The Odoo *Sales* application provides customers with the ability to confirm orders via an online +signature directly on the sales order. Once the sales order is electronically signed by the +customer, the salesperson attached to the sales order is automatically notified that the order is +confirmed. -Activate online signature -========================= +Activate online signatures +========================== -Go to :menuselection:`Sales --> Configuration --> Settings` and activate the **Online Signature** -feature. +To activate the *online signature* feature, go to :menuselection:`Sales app --> Configuration --> +Settings`, scroll to the :guilabel:`Quotations & Orders` heading, and activate the :guilabel:`Online +Signature` feature by checking the box beside it. Then, click the :guilabel:`Save` button in the +top-left corner. -.. image:: get_signature_to_validate/signature_1.png +.. image:: get_signature_to_validate/signature-setting.png :align: center - :class: img-thumbnail - :alt: How to enable online signature on Odoo Sales? + :alt: How to enable online signature in Odoo Sales settings. .. note:: - If you are familiar with this documentation: :doc:`quote_template`, you can activate or not the - **Online Signature** feature for each quotation template you use, under their confirmation tab. - Example: + On quotation templates, the :guilabel:`Online Signature` feature is located under the + :guilabel:`Confirmation` tab. - .. image:: get_signature_to_validate/signature_2.png + .. image:: get_signature_to_validate/signature-confirmation-tab.png :align: center - :class: img-thumbnail - :alt: How to enable online signature on Odoo Sales? + :alt: How to enable online signature on a quotation template. -Confirm an order with a signature -================================= + On standard quotations, the :guilabel:`Online Signature` feature is located under the + :guilabel:`Other Info` tab. -When you send quotations to clients, they can instantly accept and sign it online. When they -click on **Sign & Pay**, they have the choice to draw their own signature, automatically fill in the -field with an automated signature or load a file from their computer. Here below, it is an example -of an automated signature: + .. image:: get_signature_to_validate/signature-other-info-tab.png + :align: center + :alt: How to enable online signature on standard quotations. -.. image:: get_signature_to_validate/signature_3.png - :align: center - :class: img-thumbnail - :alt: How to confirm an order with a signature on Odoo Sales? +Order confirmations with online signatures +========================================== -Once signed, you will have the possibility to choose your payment methods. Then, when the quotation -will be paid and confirmed, a delivery order will be created automatically by Odoo. +When quotations are sent to clients, there's an option for them to :guilabel:`Sign & Pay` directly +on the quotation in the online customer portal. When clicked, clients have the option to draw a +signature, fill in the field with an automated signature, or load a file from their computer. + +.. image:: get_signature_to_validate/signature-validate-order.png + :align: center + :alt: How to confirm an order with a signature on Odoo Sales. -.. tip:: - Be careful that delivery orders are only generated for storable products and if the - **Inventory app** is already installed. +Once signed, the various payment method options become available. Then, when the quotation is paid +and confirmed, a delivery order is automatically created (if the Odoo *Inventory* app is installed). .. seealso:: - - :doc:`quote_template` + :doc:`/applications/sales/sales/send_quotations/quote_template` diff --git a/content/applications/sales/sales/send_quotations/get_signature_to_validate/signature_2.png b/content/applications/sales/sales/send_quotations/get_signature_to_validate/signature-confirmation-tab.png similarity index 100% rename from content/applications/sales/sales/send_quotations/get_signature_to_validate/signature_2.png rename to content/applications/sales/sales/send_quotations/get_signature_to_validate/signature-confirmation-tab.png diff --git a/content/applications/sales/sales/send_quotations/get_signature_to_validate/signature-other-info-tab.png b/content/applications/sales/sales/send_quotations/get_signature_to_validate/signature-other-info-tab.png new file mode 100644 index 0000000000..64df83856b Binary files /dev/null and b/content/applications/sales/sales/send_quotations/get_signature_to_validate/signature-other-info-tab.png differ diff --git a/content/applications/sales/sales/send_quotations/get_signature_to_validate/signature_1.png b/content/applications/sales/sales/send_quotations/get_signature_to_validate/signature-setting.png similarity index 100% rename from content/applications/sales/sales/send_quotations/get_signature_to_validate/signature_1.png rename to content/applications/sales/sales/send_quotations/get_signature_to_validate/signature-setting.png diff --git a/content/applications/sales/sales/send_quotations/get_signature_to_validate/signature_3.png b/content/applications/sales/sales/send_quotations/get_signature_to_validate/signature-validate-order.png similarity index 100% rename from content/applications/sales/sales/send_quotations/get_signature_to_validate/signature_3.png rename to content/applications/sales/sales/send_quotations/get_signature_to_validate/signature-validate-order.png diff --git a/content/applications/sales/sales/send_quotations/quote_template.rst b/content/applications/sales/sales/send_quotations/quote_template.rst index ee1caf15c7..4acbf8663e 100644 --- a/content/applications/sales/sales/send_quotations/quote_template.rst +++ b/content/applications/sales/sales/send_quotations/quote_template.rst @@ -1,93 +1,70 @@ -======================= -Use quotation templates -======================= +=================== +Quotation templates +=================== -By creating custom quotation templates, you will save a lot of time. Indeed, with the use of -templates, you will be able to send complete quotations at a fast pace. +Using quotation templates speeds up the creation of sales orders by filling in most quotation fields +automatically. Configuration ============= -To enable this feature, go to :menuselection:`Sales --> Configuration --> Settings` and activate -**Quotation Templates**. +Go to :menuselection:`Sales --> Configuration --> Settings` and enable :guilabel:`Quotation +Templates`. -.. image:: quote_template/quotations_templates_1.png - :align: center - :class: img-thumbnail - :alt: How to enable quotation templates on Odoo Sales? +Create a template +================= -For even more convenience, it is also recommended to add the **Quotation Builder** feature which -will help you design your quotation templates very easily. This option will automatically install -the Odoo Website App. +Go to :menuselection:`Sales --> Configuration --> Quotations Templates` and click :guilabel:`New`. -.. image:: quote_template/quotations_templates_2.png - :align: center - :class: img-thumbnail - :alt: How to enable quotation builder on Odoo Sales? - -Create your first template -========================== - -Quotation templates are under :menuselection:`Sales --> Configuration`. - -You can create a new template or edit an existing one. Once named, you will be able to select -products and quantities as well as the expiration time of the quotation. +.. note:: + Apart from the name, all template fields are optional. -.. image:: quote_template/quotations_templates_3.png - :align: center - :class: img-thumbnail - :alt: Create a new quotation template on Odoo Sales +After having named the template, choose default values for the following fields: -Design your template -==================== +- :guilabel:`Quotation expires after`: choose the number of days for which the quotation is valid. +- :guilabel:`Online confirmation`: after sending the quotation by email, it is possible to ask the + customer to confirm it online on their customer portal: -You will have the possibility to design your template and edit the customer interface in order -to manage what clients will see before accepting and paying the quotation. For example, you will -be able to describe your company, your services and your products. To do so, you can click on -**Edit** and you will be brought to the quotation builder. + - by providing a :guilabel:`Signature`, + - by making a :guilabel:`Payment`, + - or both. -.. image:: quote_template/quotations_templates_4.png - :align: center - :class: img-thumbnail - :alt: Design your quotation template on Odoo Sales +- :guilabel:`Confirmation Mail`: select an email template to automatically send an email to the + customer upon confirming the quotation. -You can easily edit the content of your template by dragging & dropping different building blocks -to organize your quotation. For example, you can add a content block to describe your products. +On the :guilabel:`Lines` tab, add the default products and their quantity. Add :doc:`optional +products ` in the :guilabel:`Optional Products` tab. -.. image:: quote_template/quotations_templates_5.png - :align: center - :class: img-thumbnail - :alt: Drag & drop building blocks to create your quotation template on Odoo Sales +Finally, add any specific sales terms and conditions on the :guilabel:`Terms & Conditions` tab. -Use a quotation template -======================== +.. tip:: + If the terms and conditions are standard across all quotations, :doc:`set them globally in the + Accounting/Invoicing settings + ` instead. -When creating a quotation, you can choose a specific template. +Design a template +================= -.. image:: quote_template/quotations_templates_6.png - :align: center - :class: img-thumbnail - :alt: Select a specific template on Odoo Sales +Customize the appearance of quotations on the customer portal by going to :menuselection:`Sales --> +Configuration --> Settings` and enabling the :guilabel:`Quotation Builder` feature. -.. tip:: - You can select any template of your choice and suggest it as the default template in - the **Sales** settings. +.. note:: + If necessary, Odoo automatically activates the :doc:`Website ` + app when enabling this feature. -Confirm the quotation -===================== +Select a template by going to :menuselection:`Sales --> Configuration --> Quotations Templates` and +clicking on a template. Then click the :guilabel:`Design Template` button. On the website builder, +click :guilabel:`Edit`. Drag and drop the building blocks, edit the content, and :guilabel:`Save`. -Templates facilitate the confirmation process by allowing customers to sign electronically or to -pay online. You can activate these two options directly in the quotation template itself. +.. image:: quote_template/quotation-builder.png + :alt: Using the quotation builder -.. image:: quote_template/quotations_templates_7.png - :align: center - :class: img-thumbnail - :alt: Allow your customers to sign electronically or to pay online on Odoo Sales +Use a template +============== -.. note:: - Every quotation will now have this setting. Of course you can always change it and make it - specific for each quotation. +When creating a quotation, choose a template under the :guilabel:`Quotation Template` field. All the +fields are then filled accordingly. Manually edit any pre-filled field if needed. -.. seealso:: - - :doc:`get_signature_to_validate` - - :doc:`get_paid_to_validate` +.. tip:: + Go to :menuselection:`Sales --> Configuration --> Settings` to select a :guilabel:`Default + Template`. diff --git a/content/applications/sales/sales/send_quotations/quote_template/quotation-builder.png b/content/applications/sales/sales/send_quotations/quote_template/quotation-builder.png new file mode 100644 index 0000000000..633684fbb9 Binary files /dev/null and b/content/applications/sales/sales/send_quotations/quote_template/quotation-builder.png differ diff --git a/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_1.png b/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_1.png deleted file mode 100644 index cb3bb50902..0000000000 Binary files a/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_1.png and /dev/null differ diff --git a/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_2.png b/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_2.png deleted file mode 100644 index 8fdfd5de94..0000000000 Binary files a/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_2.png and /dev/null differ diff --git a/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_3.png b/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_3.png deleted file mode 100644 index 5f3a19a7c0..0000000000 Binary files a/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_3.png and /dev/null differ diff --git a/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_4.png b/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_4.png deleted file mode 100644 index bcf3c4fc10..0000000000 Binary files a/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_4.png and /dev/null differ diff --git a/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_5.png b/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_5.png deleted file mode 100644 index 36faf4ad3d..0000000000 Binary files a/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_5.png and /dev/null differ diff --git a/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_6.png b/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_6.png deleted file mode 100644 index eb7339f573..0000000000 Binary files a/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_6.png and /dev/null differ diff --git a/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_7.png b/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_7.png deleted file mode 100644 index 1d0a3f87c0..0000000000 Binary files a/content/applications/sales/sales/send_quotations/quote_template/quotations_templates_7.png and /dev/null differ diff --git a/content/applications/sales/sales/send_quotations/terms_and_conditions.rst b/content/applications/sales/sales/send_quotations/terms_and_conditions.rst deleted file mode 100644 index 9cb44753f5..0000000000 --- a/content/applications/sales/sales/send_quotations/terms_and_conditions.rst +++ /dev/null @@ -1,117 +0,0 @@ -====================== -Add terms & conditions -====================== - -Specifying terms and conditions is essential to set out important contractual points such as payment -terms, limitation of liability and delivery terms between customers and sellers. Every seller must -declare all formal information concerning products and company policy. On the other hand, each -customer must take note of all these conditions before committing to anything. With Odoo Sales, it -is very easy to include your default terms and conditions on every quotation, sales order, and -invoice that you manage. - -Default Terms & Conditions -========================== - -Configuration -------------- - -Go to :menuselection:`Accounting --> Configuration --> Settings` and activate -*Default Terms & Conditions*. - -.. image:: terms_and_conditions/terms_conditions_1.png - :align: center - :class: img-thumbnail - :alt: How to enable Default Terms & Conditions on Odoo Sales? - -.. note:: - Please note that this feature is activated via the settings of the **Invoicing App** and **not** - via the settings of the **Sales App**. Moreover, you don't need to install the invoicing - application since it is done automatically with the installation of the sales application. - -DT&C on your quotations, sales orders, and invoices ---------------------------------------------------- - -In the settings of the **Invoicing App**, you have the possibility to insert your default terms -and conditions. - -.. image:: terms_and_conditions/terms_conditions_2.png - :align: center - :class: img-thumbnail - :alt: Default Terms & Conditions on quotation on Odoo Sales - -They appear subsequently on every quotation, sales order, and invoice. - -DT&C on your quotation templates --------------------------------- - -According to your business needs, you can specify your terms and conditions on your quotation -templates. This is interesting if you have different terms and conditions within your company. - -.. image:: terms_and_conditions/terms_conditions_3.png - :align: center - :class: img-thumbnail - :alt: Add Default Terms & Conditions to your quotation templates on Odoo Sales - -.. important:: - Be sure to check out our documentation about quotation templates: :doc:`quote_template`, - to master each step of this amazing feature. - -General Terms & Conditions -========================== - -GT&C on your website --------------------- - -Use the **Website App** and create your own general terms and conditions page. For example, here is -the Odoo terms and conditions page: - -.. image:: terms_and_conditions/terms_conditions_4.png - :align: center - :class: img-thumbnail - :alt: General Terms & Conditions on your website - -You can refer to this page in the footer of all your documents. The layout is available in the -**General Settings** under the **Business Documents** category. For example, this footer appears -in every document from Odoo. - -.. image:: terms_and_conditions/terms_conditions_7.png - :align: center - :class: img-thumbnail - :alt: General Terms & Conditions in your business documents - -GT&C as attachment in your emails ---------------------------------- - -Attach an external document with your general terms and conditions when you are about to send your -quotation by email to your customers. - -.. image:: terms_and_conditions/terms_conditions_5.png - :align: center - :class: img-thumbnail - :alt: General Terms & conditions as attachment in your email - -GT&C as attachment in your quotation templates ----------------------------------------------- - -Create and edit email templates to set a default attachment for all quotation emails that you -will send in the future. To do so, you have to go to :menuselection:`Sales --> Configuration ---> Quotation templates` and create a new quotation template or modify an existing one. Under -the confirmation tab, you are now able to activate online signatures, online payments and to set -a confirmation mail in which you have the possibility to configure the default attachment. -There, you can put your general terms & conditions. - -.. image:: terms_and_conditions/terms_conditions_6.png - :align: center - :class: img-thumbnail - :alt: General Terms & conditions as attachment in your quotation templates - -.. tip:: - To customize your email templates, activate the **developer mode** and - go to :menuselection:`Settings --> Technical --> Email --> Templates`. - -With Odoo Sales it is now very simple to deal with terms & conditions. - -.. seealso:: - - :doc:`quote_template` - - :doc:`get_signature_to_validate` - - :doc:`get_paid_to_validate` diff --git a/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_1.png b/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_1.png deleted file mode 100644 index c85f68c44c..0000000000 Binary files a/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_1.png and /dev/null differ diff --git a/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_2.png b/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_2.png deleted file mode 100644 index 7c1e0b4654..0000000000 Binary files a/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_2.png and /dev/null differ diff --git a/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_3.png b/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_3.png deleted file mode 100644 index 0bf7692764..0000000000 Binary files a/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_3.png and /dev/null differ diff --git a/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_4.png b/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_4.png deleted file mode 100644 index 3a31cb215f..0000000000 Binary files a/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_4.png and /dev/null differ diff --git a/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_5.png b/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_5.png deleted file mode 100644 index 919e854ddc..0000000000 Binary files a/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_5.png and /dev/null differ diff --git a/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_6.png b/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_6.png deleted file mode 100644 index 540fac1aa3..0000000000 Binary files a/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_6.png and /dev/null differ diff --git a/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_7.png b/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_7.png deleted file mode 100644 index fe46463e9d..0000000000 Binary files a/content/applications/sales/sales/send_quotations/terms_and_conditions/terms_conditions_7.png and /dev/null differ diff --git a/content/applications/sales/subscriptions.rst b/content/applications/sales/subscriptions.rst index 26b2de474b..39765193f2 100644 --- a/content/applications/sales/subscriptions.rst +++ b/content/applications/sales/subscriptions.rst @@ -40,7 +40,7 @@ To create a new subscription, click on :guilabel:`New` from the *Subscription* o .. tip:: You can define different invoice and delivery addresses by enabling the :doc:`Customer Addresses - ` feature. + ` feature. .. _subscriptions/confirmation: diff --git a/content/applications/sales/subscriptions/plans.rst b/content/applications/sales/subscriptions/plans.rst index 301d7f61d3..cfb884bda3 100644 --- a/content/applications/sales/subscriptions/plans.rst +++ b/content/applications/sales/subscriptions/plans.rst @@ -2,45 +2,101 @@ Subscription plans ================== -Subscription plans are :doc:`quotation templates <../sales/send_quotations/quote_template>` specific -to **subscriptions** used to preconfigure selectable **plans** and **recurrence periods** to -configure quotations quickly. - -Configuration -============= - -To create a new subscription plan or edit an existing one, go to :menuselection:`Subscriptions --> -Configuration --> Plans`, and click :guilabel:`New` or select an existing plan. - -.. image:: plans/subplan-configuration.png - :alt: Subscription plan (quotation template) configuration - -When creating a subscription plan, several options are available: - -- The **name** of the plan; -- :guilabel:`Quotation expires after`: after how many days the quotation expires; -- :guilabel:`Online confirmation`: if the customer's :guilabel:`Signature` or - :guilabel:`Payment` confirms the order. Enable both to leave the choice to the customer; -- :guilabel:`Confirmation Mail`: the **mail template** used for the order confirmation mail; -- :guilabel:`Recurrence`: the recurrence of **recurring products** used with this template. - -Selecting a :guilabel:`Recurrence` enables the following additional options: - -- :guilabel:`Duration`: whether **recurring products** used with this template have no **end date**, - or if they have a :guilabel:`Fixed` duration. Selecting :guilabel:`Fixed` enables an additional - option to select the **duration**; -- :guilabel:`Self Closable`: if enabled, the **customer** can terminate their subscription from - their **customer portal**; -- :guilabel:`Automatic Closing`: the number of days after which **unpaid** subscriptions *past* the - due date are automatically closed; -- :guilabel:`Invoicing Journal`: if set, subscriptions with this template are invoiced in the set - journal. If none, the sales journal with the lowest sequence is used. - -.. note:: - On each template, you can add specific :doc:`Terms & Conditions - <../sales/send_quotations/terms_and_conditions>`. If **terms and conditions** are specified on a - template, these will be used instead of the default **terms and conditions** set in the **Sales** - app settings (if any are set). - -.. image:: plans/subplan-terms.png - :alt: Terms and conditions of subscription plan +*Subscription plans* are :doc:`quotation templates +` used to preconfigure quotations with +subscription products. Use subscription plans to quickly create subscription orders. + +Configure subscription plans +============================ + +To configure subscription plans, go to :menuselection:`Subscriptions --> Configuration --> Plans`. +Then, click :guilabel:`New` to create a new plan, or select an existing plan to edit it. + +Since the Odoo *Subscriptions* app is integrated closely with the *Sales* app, subscription plans +use the same form as quotation templates. + +.. image:: plans/subplan-quotation-template.png + :align: center + :alt: Subscription plan (quotation template) configuration form. + +The subscription plan form contains the following options: + +- :guilabel:`Name`: Enter a name for the subscription plan at the top of the page. +- :guilabel:`Quotation expires after`: Enter the number of days after which the quotation expires, + starting from the day the quotation is sent to the customer. Leave this field at zero for the + quotation to never expire. +- :guilabel:`Online Confirmation`: Check the boxes next to :guilabel:`Signature` or + :guilabel:`Payment` to enable the customer to confirm their subscription order by signing or + paying for the quotation. Enable both to leave the choice to the customer. Enable neither to only + confirm the quotation in the backend. +- :guilabel:`Confirmation Mail`: Select an :doc:`email template + ` for the confirmation email that is + automatically sent to the customer after the quotation is confirmed. Leave this field blank to + send nothing. + + - To create a new email template, enter a name for the template, then click :guilabel:`Create and + edit`. + - To edit an existing email template, select one from the drop-down menu, then click on the + :guilabel:`Internal link` arrow at the end of the line. + +- :guilabel:`Recurrence`: Select the recurrence period used for the plan. The recurrence periods + available here are the same ones that are configured in :menuselection:`Subscriptions --> + Configuration --> Recurrence Periods`. + +Selecting a :guilabel:`Recurrence` turns the quotation template into a subscription plan and enables +the following additional options: + +- :guilabel:`Duration`: Choose whether the subscription plan has no end date (:guilabel:`Forever`) + or a :guilabel:`Fixed` duration. + + - If the duration is :guilabel:`Forever`, then the subscription plan will continually renew until + either the customer or the company manually ends the subscription. + - If the duration is :guilabel:`Fixed`, then enter an :guilabel:`End After` date, which determines + the amount of time after which the subscription will automatically end. + +- :guilabel:`Self Closable`: Check this box to enable the customer to terminate their subscription + from the :doc:`customer portal + `. +- :guilabel:`Automatic Closing`: Enter the number of days after which *unpaid* subscriptions *past* + the due date are automatically closed. +- :guilabel:`Invoicing Journal`: Select the accounting journal in which invoices for this + subscription plan are recorded. Leave this field blank to use the sales journal with the lowest + sequence. + +.. image:: plans/subplan-recurrence.png + :align: center + :alt: Subscription plan with Recurrence selected. + +In the :guilabel:`Lines` tab, create the order lines for the quotation. Click :guilabel:`Add a +product`, select a product to include in the plan, and then enter the :guilabel:`Quantity` and +:guilabel:`Unit of Measure`. Add as many products as desired to the order lines. + +In the :guilabel:`Optional Products` tab, enter any optional products that the customer can add to +their quotation before confirming the order. + +If the subscription plan has unique :doc:`terms and conditions +`, add them in the +:guilabel:`Terms & Conditions` tab. If terms conditions are specified on a plan, these will be used +instead of the default terms and conditions set up in the *Sales* app settings. + +.. image:: plans/subplan-terms-conditions.png + :align: center + :alt: Subscription plan Terms & Conditions tab. + +Use subscription plans on quotations +==================================== + +Quotations for subscription products can be created in both the *Subscriptions* app and the *Sales* +app. + +From the :guilabel:`Subscriptions` dashboard, click :guilabel:`New` to create a new quotation. Then, +select a subscription plan in the :guilabel:`Subscription Plan` field. + +The :guilabel:`Recurrence`, products, and other information from the plan are automatically filled +in. The quotation can then be modified further as needed. + +From the :guilabel:`Sales` dashboard, click :guilabel:`New` to create a new quotation. Then, select +a subscription plan in the :guilabel:`Quotation Template` field. + +All subscription orders will appear on the :guilabel:`Subscriptions` dashboard regardless of whether +they were created in the *Subscriptions* app or the *Sales* app. diff --git a/content/applications/sales/subscriptions/plans/subplan-configuration.png b/content/applications/sales/subscriptions/plans/subplan-configuration.png deleted file mode 100644 index 47893b0b34..0000000000 Binary files a/content/applications/sales/subscriptions/plans/subplan-configuration.png and /dev/null differ diff --git a/content/applications/sales/subscriptions/plans/subplan-quotation-template.png b/content/applications/sales/subscriptions/plans/subplan-quotation-template.png new file mode 100644 index 0000000000..3823f4b9dd Binary files /dev/null and b/content/applications/sales/subscriptions/plans/subplan-quotation-template.png differ diff --git a/content/applications/sales/subscriptions/plans/subplan-recurrence.png b/content/applications/sales/subscriptions/plans/subplan-recurrence.png new file mode 100644 index 0000000000..9539b98d19 Binary files /dev/null and b/content/applications/sales/subscriptions/plans/subplan-recurrence.png differ diff --git a/content/applications/sales/subscriptions/plans/subplan-terms-conditions.png b/content/applications/sales/subscriptions/plans/subplan-terms-conditions.png new file mode 100644 index 0000000000..f87c9e20eb Binary files /dev/null and b/content/applications/sales/subscriptions/plans/subplan-terms-conditions.png differ diff --git a/content/applications/sales/subscriptions/plans/subplan-terms.png b/content/applications/sales/subscriptions/plans/subplan-terms.png deleted file mode 100644 index aae99fb59f..0000000000 Binary files a/content/applications/sales/subscriptions/plans/subplan-terms.png and /dev/null differ diff --git a/content/applications/services/helpdesk.rst b/content/applications/services/helpdesk.rst index 8501583889..905bdfd7e4 100644 --- a/content/applications/services/helpdesk.rst +++ b/content/applications/services/helpdesk.rst @@ -14,5 +14,4 @@ Helpdesk :titlesonly: helpdesk/overview - helpdesk/timesheet_and_invoice helpdesk/advanced diff --git a/content/applications/services/helpdesk/advanced.rst b/content/applications/services/helpdesk/advanced.rst index 5c76233798..19ba503851 100644 --- a/content/applications/services/helpdesk/advanced.rst +++ b/content/applications/services/helpdesk/advanced.rst @@ -9,3 +9,4 @@ Advanced advanced/after_sales advanced/close_tickets + advanced/track_and_bill diff --git a/content/applications/services/helpdesk/advanced/after_sales.rst b/content/applications/services/helpdesk/advanced/after_sales.rst index cf168d8b67..8e77c7a97f 100644 --- a/content/applications/services/helpdesk/advanced/after_sales.rst +++ b/content/applications/services/helpdesk/advanced/after_sales.rst @@ -75,7 +75,7 @@ Once the credit note has been posted, a :guilabel:`Credit Notes` smart button wi :alt: View of smart buttons on a ticket focusing on the credit note button. .. seealso:: - :doc:`/applications/finance/accounting/receivables/customer_invoices/credit_notes` + :doc:`/applications/finance/accounting/customer_invoices/credit_notes` Generate coupons from a ticket ============================== diff --git a/content/applications/services/helpdesk/advanced/track_and_bill.rst b/content/applications/services/helpdesk/advanced/track_and_bill.rst new file mode 100644 index 0000000000..297d9518ce --- /dev/null +++ b/content/applications/services/helpdesk/advanced/track_and_bill.rst @@ -0,0 +1,248 @@ +=================== +Track and bill time +=================== + +Odoo *Helpdesk* provides teams with the ability to track the amount of hours spent working on a +ticket, and to bill a customer for that time. Through integrations with the *Sales*, *Timesheets* +and *Accounting* applications, customers can be charged once the work is completed, or before it has +even begun. + +.. warning:: + Since the *Track & Bill Time* features require integration with other applications, enabling them + may result in the installation of additional modules (or applications). + + Installing a new application on a *One-App-Free* database triggers a 15-day trial. At the end of + the trial, if a paid subscription has not been added to the database, it will no longer be active + or accessible. + +Configure track and bill time features +====================================== + +Before a customer can be invoiced for support services, the *Track & Bill Time* features must first +be enabled. These features must be enabled on each *Helpdesk* team where they will be utilized. + +Enable track and bill time on a helpdesk team +--------------------------------------------- + +To view and enable the :guilabel:`Track & Bill Time` features on a *Helpdesk* team, first navigate +to :menuselection:`Helpdesk --> Configuration --> Teams`. Then select a team from the list or +:doc:`create a new one `. This will reveal +a team's settings page. + +On the team's settings page, scroll to the :guilabel:`Track & Bill Time` section. Check the boxes +labeled :guilabel:`Timesheets` and :guilabel:`Time Billing`. + +Once the :guilabel:`Timesheets` box is checked, a new field appears, labeled :guilabel:`Project`. + +The project selected in this field is where all the timesheets for this team's tickets will be +recorded. Click into the drop-down menu to select a :guilabel:`Project`. + +To create a new project where the timesheets will be recorded, click into the drop-down menu, type a +name for the project, and then click :guilabel:`Create`. + +.. image:: track_and_bill/track-bill-enable-settings.png + :align: center + :alt: View of a helpdesk team settings page emphasizing the track and bill time settings. + +.. _helpdesk/advanced/configure-service-products: + +Configure service products +-------------------------- + +When the :guilabel:`Time Billing` feature is enabled, a new product is created in the *Sales* app +called :guilabel:`Service on Timesheets`. This product can be found under :menuselection:`Sales --> +Products --> Products`. Search for `Service on Timesheets` in the :guilabel:`Search...` bar. This is +the product that will be used when invoicing for *post-paid support services* after they have been +completed. + +Select :guilabel:`Service on Timesheets` from the product page. This reveals the product detail +form. The product is configured with the :guilabel:`Product Type` set to :guilabel:`Service` and the +:guilabel:`Invoicing Policy` set to :guilabel:`Based on Timesheets`. + +.. image:: track_and_bill/track-bill-product-based-on-timesheets.png + :align: center + :alt: View of a service product with the invoicing policy set to 'Based on timesheets'. + +In order to invoice for support services before the work has been completed (also known as *prepaid +support services*), a separate product with a different invoicing policy must be created. + +To create a new service product, go to :menuselection:`Sales --> Products --> Products` and click +:guilabel:`New`. This will reveal a blank product detail form. + +On the new product form, add a :guilabel:`Product Name`, and set the :guilabel:`Product Type` to +:guilabel:`Service`. Then, set the :guilabel:`Invoicing Policy` to :guilabel:`Prepaid/Fixed Price`. +This means an invoice can be generated and payment can be received for this product before any +timesheets entries have been recorded for these services. + +.. image:: track_and_bill/track-bill-product-prepaid-fixed.png + :align: center + :alt: View of a service product with the invoicing policy set to 'prepaid/fixed'. + +Finally, set the :guilabel:`Sales Price`, and confirm that the :guilabel:`Unit of Measure` is set to +:guilabel:`Hours`. + +Invoice prepaid support services +================================ + +When support services are billed on a fixed price, an invoice can be created before any work is +completed on the issue. In this case, a service product with the invoicing policy set to +:guilabel:`Prepaid/Fixed Price` would be used, just like :ref:`the section above +`. + +Create a sales order with prepaid product +----------------------------------------- + +To invoice a customer for prepaid support services, first create a sales order (SO) with the support +services product. To do this, go to :menuselection:`Sales --> Orders --> Quotations --> New`, which +reveals a blank quotation form. + +Then, fill out the quotation form with the customer information. + +Go to the :guilabel:`Order Lines` tab of the quotation and click :guilabel:`Add a Product`. Then, +select the *prepaid services product* configured in the steps above. Update the :guilabel:`Quantity` +field with the number of hours. + +After updating any other necessary information, :guilabel:`Confirm` the quotation. This converts the +quotation into an :abbr:`SO (sales order)`. + +Create and send an invoice for prepaid services +----------------------------------------------- + +Once the :abbr:`SO (sales order)` has been confirmed, click the :guilabel:`Create Invoice` button. +This will open a :guilabel:`Create Invoices` pop-up window. + +If no down payment will be collected, the :guilabel:`Create Invoice` type can remain as +:guilabel:`Regular Invoice`. If a down payment will be collected, choose between either +:guilabel:`Down payment (percentage)` or :guilabel:`Down payment (fixed amount)`. + +When the necessary information has been entered, click :guilabel:`Create Draft Invoice`. + +The invoice can then be sent to the customer for payment. + +Create helpdesk ticket for prepaid services +------------------------------------------- + +To create a *Helpdesk* ticket for prepaid services, navigate to :menuselection:`Helpdesk` and click +the :guilabel:`Tickets` button to reveal a specific team's pipeline. Click :guilabel:`New` to create +a new ticket. + +On the blank ticket form, create a ticket :guilabel:`Title`, and enter the :guilabel:`Customer` +information. + +When the customer name is added, the :guilabel:`Sales Order Item` field will automatically populate +with the most recent prepaid sales order item that has time remaining. + +Track hours on helpdesk ticket +------------------------------ + +Time spent working on a *Helpdesk* ticket is tracked on the *Timesheets* tab on the specific ticket. + +On the ticket detail form, click on the :guilabel:`Timesheets` tab and click :guilabel:`Add a line`. +Choose an :guilabel:`Employee`, add a :guilabel:`Description` of the task, and enter the number of +:guilabel:`Hours Spent`. + +As new lines are added to :guilabel:`Timesheets` tab, the :guilabel:`Remaining Hours on SO` field is +automatically updated. + +.. image:: track_and_bill/track-bill-remaining-hours-total.png + :align: center + :alt: View of the timesheets tab on a ticket with an emphasis on the remaining hours on an SO. + +.. note:: + If the number of hours on the :guilabel:`Timesheets` tab exceeds the number of hours sold, the + :guilabel:`Remaining Hours of SO` will turn red. + +As hours are added to the :guilabel:`Timesheets` tab, they are automatically updated in the +:guilabel:`Delivered` field on the :abbr:`SO (sales order)`, as well. + +Invoice post-paid support services +================================== + +When support services are billed based on the amount of time spent on an issue, an invoice cannot be +created before the total number of hours required to solve the problem have been entered on a +timesheet. In this case, a service product with the invoicing policy set to :guilabel:`Based on +Timesheets` would be used, like the one created above. + +Create a sales order with a time-tracked product +------------------------------------------------ + +To invoice a customer for post-paid support services, first create a sales order (SO) with the +*support services product*. To do this, go to :menuselection:`Sales --> Orders --> Quotations --> +New`. + +Fill out the quotation with the customer information. + +On the :guilabel:`Order Lines` tab, click :guilabel:`Add a Product`. Select the post-paid services +product configured in the steps above. After updating any other necessary information, +:guilabel:`Confirm` the quotation. + +.. note:: + Unlike with the prepaid services quotation, Odoo will not allow an invoice to be created at this + time. That is because no services have been performed; in other words nothing has been delivered, + therefore, there is nothing to invoice. + +Create a helpdesk ticket for time-tracked services +-------------------------------------------------- + +To record a *Timesheet* entry for time-tracker services, go to :menuselection:`Helpdesk` and select +the appropriate team for which these services apply. + +If there is already an existing ticket for this issue, select it from the kanban view. This will +open the ticket details form. If there is no existing ticket for this customer issue, click +:guilabel:`New` to create a new ticket and enter the necessary customer information on the blank +ticket details form. + +After selecting or creating a ticket, go to the :guilabel:`Sales Order Line` drop-down menu. Select +the :abbr:`SO (sales order)` created in the previous step. + +Track support hours on a ticket +------------------------------- + +In order to create an invoice for a product based on timesheets, hours need to be tracked and +recorded. At this point, the service is considered *delivered*. To record hours for this support +service, click on the :guilabel:`Timesheets` tab of the ticket. + +Click :guilabel:`Add a Line` to record a new entry. Select an :guilabel:`Employee` from the +drop-down menu, and record the time spent in the :guilabel:`Hours Spent` column. + +Repeat these steps as needed until all time spent on the issues has been recorded. + +.. image:: track_and_bill/track-bill-record-timesheet-hours.png + :align: center + :alt: View of the timesheets tab on a helpdesk ticket. + +Create an invoice for hours tracked on a ticket +----------------------------------------------- + +After the customer's issue has been solved, and it is determined no new timesheet entries will be +made, an invoice can be created, and the customer can be billed. + +To do this, return to the :abbr:`SO (sales order)` by clicking on the :guilabel:`Sales Order` smart +button at the top of the ticket. + +Before creating the invoice, confirm that the number in the :guilabel:`Delivered` column matches the +total number of :guilabel:`Hours Spent` listed in the :guilabel:`Timesheets` tab on the ticket. + +.. image:: track_and_bill/track-bill-delivered-timesheet-hours.png + :align: center + :alt: View of a sales order with emphasis on the delivered column. + +Then, click :guilabel:`Create Invoice`. This will open a :guilabel:`Create Invoices` pop-up window. +If no down payment will be collected, the :guilabel:`Create Invoice` type can remain as +:guilabel:`Regular Invoice`. If a down payment will be collected, choose between either +:guilabel:`Down payment (percentage)` or :guilabel:`Down payment (fixed amount)`. + +.. important:: + Use the :guilabel:`Timesheets Period` field if this invoice should only include timesheets from a + certain time period. If this field is left blank, *all* applicable timesheets that have not yet + been invoiced will be included. + +.. image:: track_and_bill/track-bill-create-invoice-timesheets-period.png + :align: center + :alt: View of create invoices pop up showing timesheets period fields. + +When the necessary information has been entered, click :guilabel:`Create Invoice`. The invoice can +then be sent to the customer for payment. + +.. seealso:: + :doc:`/applications/inventory_and_mrp/inventory/management/products/uom` diff --git a/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-create-invoice-timesheets-period.png b/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-create-invoice-timesheets-period.png new file mode 100644 index 0000000000..15649f4b0b Binary files /dev/null and b/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-create-invoice-timesheets-period.png differ diff --git a/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-delivered-timesheet-hours.png b/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-delivered-timesheet-hours.png new file mode 100644 index 0000000000..a44e105e40 Binary files /dev/null and b/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-delivered-timesheet-hours.png differ diff --git a/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-enable-settings.png b/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-enable-settings.png new file mode 100644 index 0000000000..5fd4a203d8 Binary files /dev/null and b/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-enable-settings.png differ diff --git a/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-product-based-on-timesheets.png b/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-product-based-on-timesheets.png new file mode 100644 index 0000000000..87b13589f2 Binary files /dev/null and b/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-product-based-on-timesheets.png differ diff --git a/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-product-prepaid-fixed.png b/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-product-prepaid-fixed.png new file mode 100644 index 0000000000..a0d0c077da Binary files /dev/null and b/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-product-prepaid-fixed.png differ diff --git a/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-record-timesheet-hours.png b/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-record-timesheet-hours.png new file mode 100644 index 0000000000..bfd24d0e59 Binary files /dev/null and b/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-record-timesheet-hours.png differ diff --git a/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-remaining-hours-total.png b/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-remaining-hours-total.png new file mode 100644 index 0000000000..a24f5e5a1c Binary files /dev/null and b/content/applications/services/helpdesk/advanced/track_and_bill/track-bill-remaining-hours-total.png differ diff --git a/content/applications/services/helpdesk/overview.rst b/content/applications/services/helpdesk/overview.rst index acf8a59728..022bd4eacb 100644 --- a/content/applications/services/helpdesk/overview.rst +++ b/content/applications/services/helpdesk/overview.rst @@ -11,5 +11,5 @@ Overview overview/sla overview/receiving_tickets overview/reports - overview/forum_and_elearning + overview/help_center overview/ratings diff --git a/content/applications/services/helpdesk/overview/forum_and_elearning.rst b/content/applications/services/helpdesk/overview/forum_and_elearning.rst deleted file mode 100644 index 8c09f24791..0000000000 --- a/content/applications/services/helpdesk/overview/forum_and_elearning.rst +++ /dev/null @@ -1,73 +0,0 @@ -=================== -Forum and eLearning -=================== - -Forum -===== - -To go above and beyond email, live chat, web forms, and phone lines, offer your customers a -support forum. This way, customers might become more attached to your company as they would be -investing time to get into details of your business. You also encourage the exchange of experiences -and knowledge, supporting the feeling of belonging to a community (your community!). - -Set up ------- - -Go to :menuselection:`Helpdesk --> Configuration --> Helpdesk Team` and enable *Help Center*. - -.. image:: forum_and_elearning/help_center_feature.png - :align: center - :alt: Overview of the settings page of a helpdesk team emphasizing the help center feature in - Odoo Helpdesk - -Create, or edit a forum by clicking on the external link. Among the editing options, choose -if you would like the *Forum Mode* to be *Questions*: only one answer is allowed per question or -*Discussions*: multiple answers are allowed per question. - -.. image:: forum_and_elearning/help_center_customer_care.png - :align: center - :alt: Overview of a forum’s settings page in Odoo Helpdesk - -From now on, logged in users can start their discussions. To keep track of posts, go to -:menuselection:`Website --> Forum --> Posts`. - -.. image:: forum_and_elearning/customer_care_website.png - :align: center - :alt: Overview of the Forums page of a website to show the available ones in Odoo Helpdesk - -Turn tickets into forum posts by simply clicking on *Share on the Forum* on the ticket's page. - -.. image:: forum_and_elearning/share_forum.png - :align: center - :alt: Overview of the Forums page of a website to show the available ones in Odoo Helpdesk - -eLearning -========= - -In addition to a forum, offer online courses. When doing so, you link your customers and users’ -needs and questions to useful content, helping to boost efficiency as they can also find their -answers there. - -Set up ------- - -Go to :menuselection:`Helpdesk --> Configuration --> Helpdesk Teams` and enable *eLearning*. - -.. image:: forum_and_elearning/elearning_feature.png - :align: center - :alt: Overview of the settings page of a customer care team emphasizing the feature elearning in - Odoo Helpdesk - -Once the structure and content of your course are ready, *Publish* it by clicking on *Unpublished*. - -.. image:: forum_and_elearning/course_website.png - :align: center - :alt: View of a course being published for Odoo Helpdesk - -To keep track of your course statistics, go to *eLearning* and *View Course*. - -.. image:: forum_and_elearning/view_course_elearning.png - :align: center - :alt: View of the elearning applications dashboard for Odoo Helpdesk - -.. todo:: DETAILS/INFO SHOULD COME FROM ELEARNING DOCS. THEREFORE, LINK DOCS ONCE AVAILABLE! diff --git a/content/applications/services/helpdesk/overview/forum_and_elearning/course_website.png b/content/applications/services/helpdesk/overview/forum_and_elearning/course_website.png deleted file mode 100644 index fac66f08ec..0000000000 Binary files a/content/applications/services/helpdesk/overview/forum_and_elearning/course_website.png and /dev/null differ diff --git a/content/applications/services/helpdesk/overview/forum_and_elearning/customer_care_website.png b/content/applications/services/helpdesk/overview/forum_and_elearning/customer_care_website.png deleted file mode 100644 index 5b3b0e7d6f..0000000000 Binary files a/content/applications/services/helpdesk/overview/forum_and_elearning/customer_care_website.png and /dev/null differ diff --git a/content/applications/services/helpdesk/overview/forum_and_elearning/elearning_feature.png b/content/applications/services/helpdesk/overview/forum_and_elearning/elearning_feature.png deleted file mode 100644 index 791c37d0ae..0000000000 Binary files a/content/applications/services/helpdesk/overview/forum_and_elearning/elearning_feature.png and /dev/null differ diff --git a/content/applications/services/helpdesk/overview/forum_and_elearning/help_center_customer_care.png b/content/applications/services/helpdesk/overview/forum_and_elearning/help_center_customer_care.png deleted file mode 100644 index c06c426c23..0000000000 Binary files a/content/applications/services/helpdesk/overview/forum_and_elearning/help_center_customer_care.png and /dev/null differ diff --git a/content/applications/services/helpdesk/overview/forum_and_elearning/help_center_feature.png b/content/applications/services/helpdesk/overview/forum_and_elearning/help_center_feature.png deleted file mode 100644 index 0e22d4a3f9..0000000000 Binary files a/content/applications/services/helpdesk/overview/forum_and_elearning/help_center_feature.png and /dev/null differ diff --git a/content/applications/services/helpdesk/overview/forum_and_elearning/share_forum.png b/content/applications/services/helpdesk/overview/forum_and_elearning/share_forum.png deleted file mode 100644 index 9b08545242..0000000000 Binary files a/content/applications/services/helpdesk/overview/forum_and_elearning/share_forum.png and /dev/null differ diff --git a/content/applications/services/helpdesk/overview/forum_and_elearning/view_course_elearning.png b/content/applications/services/helpdesk/overview/forum_and_elearning/view_course_elearning.png deleted file mode 100644 index a7e449777d..0000000000 Binary files a/content/applications/services/helpdesk/overview/forum_and_elearning/view_course_elearning.png and /dev/null differ diff --git a/content/applications/services/helpdesk/overview/help_center.rst b/content/applications/services/helpdesk/overview/help_center.rst new file mode 100644 index 0000000000..9d7a8f7ee4 --- /dev/null +++ b/content/applications/services/helpdesk/overview/help_center.rst @@ -0,0 +1,410 @@ +=========== +Help center +=========== + +Odoo *Helpdesk* integrates with the *Forums*, *eLearning*, and *Knowledge* apps to create the *help +center*. + +.. image:: help_center/help-center-enable-features.png + :align: center + :alt: Overview of the settings page of a team emphasizing the help center features. + +The *help center* is a centralized location where teams and customers can search for and share +detailed information about products and services. + +.. note:: + In order to activate any of these features on a *Helpdesk* team, (*Forums*, *eLearning*, or + *Knowledge*), the :guilabel:`Visibility` of the team has to be set to :guilabel:`Invited portal + users and all internal users`. See :doc:`Getting Started + ` for more information on *Helpdesk* + team settings and configuration. + +.. warning:: + Since all of the *help center* features require integration with other applications, enabling any + of them may result in the installation of additional modules or applications. + + Installing a new application on a *One-App-Free* database will trigger a 15-day trial. At the end + of the trial, if a paid subscription has not been added to the database, it will no longer be + active or accessible. + +Knowledge +========= + +Odoo's *Knowledge* application is a collaborative library where users can store, edit, and share +information. The *Knowledge* app is represented throughout the database by a *book* icon. + +.. image:: help_center/help-center-knowledge-book-icon.png + :align: center + :alt: View of a message in Helpdesk focusing on the Knowledge book icon. + +Enable Knowledge on a Helpdesk team +----------------------------------- + +To enable the *Knowledge* feature on a *Helpdesk* team, go to :menuselection:`Helpdesk --> +Configuration --> Teams` and select a team, or create a :doc:`new one +`. + +When a team has been selected or created, Odoo displays that team's detail form. + +On the team's detail form, scroll down to the :guilabel:`Self-Service` section. Click the box next +to :guilabel:`Knowledge` to activate the *Knowledge* feature. When clicked, a new field labeled +:guilabel:`Article` appears. + +Clicking the :guilabel:`Article` field reveals a drop-down menu. At first, there is only one option +in the drop-down menu titled :guilabel:`Help`, which Odoo provides by default. Select +:guilabel:`Help` from the drop-down menu to choose this article. + +.. tip:: + To create a new article, go to the :menuselection:`Knowledge app`, then hover the cursor next to + the :guilabel:`Workspace` section heading, located in the left sidebar. Moving the cursor there + reveals a hidden :guilabel:`➕ (plus sign)` icon. + + Click the :guilabel:`➕ (plus sign)` to create a new article in the :guilabel:`Workspace`. In the + upper right corner of the page, click the :guilabel:`Share` button, and slide the + :guilabel:`Share to Web` toggle switch until it reads :guilabel:`Article Published`. It can then + be added to a *Helpdesk* team. + +Once an article has been created and assigned to a *Helpdesk* team, content can be added and +organized through the *Knowledge* app. + +.. seealso:: + :doc:`Editing Knowledge articles ` + +Search articles from a Helpdesk ticket +-------------------------------------- + +When members of a *Helpdesk* team are trying to solve a ticket, they can search through the content +in the *Knowledge* app for more information on the issue. + +To search *Knowledge* articles, open a ticket — either from the *Helpdesk* app dashboard, or by +going to :menuselection:`Helpdesk app --> Tickets --> All Tickets`, and selecting a +:guilabel:`Ticket` from the list. + +When a :guilabel:`Ticket` is selected, Odoo reveals that ticket's detail form. + +Click the :guilabel:`Knowledge (book)` icon, located above the chatter to open a search window. + +.. image:: help_center/help-center-knowledge-search.png + :align: center + :alt: View of knowledge search window from a helpdesk ticket. + +.. tip:: + *Knowledge* articles can also be searched by pressing :command:`Ctrl + K` to open the command + palette, then typing :command:`?`, followed by the name of the desired article. + +When Odoo reveals the desired article, click it, or highlight the :guilabel:`Article` title, and +press :command:`Enter`. This will open the article in the :guilabel:`Knowledge` application. + +To open the article in a new tab, press :command:`Ctrl + Enter`. + +.. tip:: + If a more in-depth search is required, press :command:`Alt + B`. That will reveal a separate + page, in which a more detailed search can occur. + +Share articles to the help center +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In order for a *Knowledge* article to be available to customers and website visitors, it has to be +published. + +.. note:: + Even though the *Help* article has been enabled on a team, Odoo will not share all the nested + articles to the web. Individual articles intended for customers **must** be published for them to + be viewable on the website. + +To publish an article, navigate to the desired article, by following the above steps, and click +the :guilabel:`Share` icon in the upper-right corner. This will reveal a menu. Slide the toggle +button labeled :guilabel:`Share to Web` to read :guilabel:`Article Published`. + +.. image:: help_center/help-center-knowledge-sharing.png + :align: center + :alt: View of a knowledge article focused on sharing and publishing options. + +Solve tickets with templates +---------------------------- + +*Template* boxes can be added to *Knowledge* articles to allow content to be reused, copied, sent as +messages, or added to the description on a ticket. This allows teams to maintain consistency when +answering customer tickets, and minimize the amount of time spent on responding to repeat questions. + +Add templates to articles +~~~~~~~~~~~~~~~~~~~~~~~~~ + +To create a template, go to :menuselection:`Knowledge --> Help`. Click on an existing nested article +or create a new one by clicking the :guilabel:`➕ (plus sign)` icon next to *Help*. + +Type `/` to open the :guilabel:`Powerbox` and view a list of :doc:`commands +`. Select or type `template`. A gray template +block will be added to the page. Add any necessary content to this block. + +.. image:: help_center/help-center-knowledge-template-options.png + :align: center + :alt: View of a template in knowledge with focus on send and copy options. + +.. note:: + Templates will only display the :guilabel:`Use as description` or :guilabel:`Send as Message` + options if they are accessed directly from *Helpdesk*. + +Use templates in tickets +~~~~~~~~~~~~~~~~~~~~~~~~ + +Templates can be used to respond directly to a *Helpdesk* ticket as a message, or to add information +to the ticket's description. + +To use templates in a *Helpdesk* ticket, first, open a ticket, either from the :guilabel:`Helpdesk` +dashboard or by going to :menuselection:`Helpdesk --> Tickets --> All Tickets` and selecting a +:guilabel:`Ticket` from the list. + +Click on the :guilabel:`Knowledge (book)` icon above the chatter for the ticket. This opens a search +window. In this search window, select, or search for the desired article. Doing so reveals that +article page in the Odoo *Knowledge* application. + +To use a template to respond to a ticket, click :guilabel:`Send as message` in the upper right +corner of the template box, located in the body of the article. + +Doing so opens a :guilabel:`Compose email` pop-up window. In this window, select the recipients, +make any necessary additions or edits to the template, then click :guilabel:`Send`. + +.. tip:: + To use a template to add information to a ticket's description, click :guilabel:`Use as + description` in the upper right corner of the template box, located in the body of the article. + Doing so will not replace the existing text in a ticket's description. The template will be added + as additional text. + +Community Forum +=============== + +A *Community Forum* provides a space for customers to answer each other's questions and share +information. By integrating a forum with a *Helpdesk* team, tickets submitted by customers can be +converted to posts and shared. + +Enable forums on a Helpdesk team +-------------------------------- + +To enable :guilabel:`Community Forums` on a *Helpdesk* team, start by navigating to +:menuselection:`Helpdesk app --> Configuration --> Teams` and select a team, or create a :doc:`new +one `. + +Selecting or creating a team reveals that team's detail form. Scroll down to the +:guilabel:`Self-Service` section of features, and enable :guilabel:`Community Forum`, by checking +the box beside it. + +When activated, a new field labeled :guilabel:`Forums` appears beneath. + +Click the empty :guilabel:`Forums` field to reveal a drop-down menu. By default, there is only one +option to begin with, labeled :guilabel:`Help`. That is the option Odoo automatically created when +the :guilabel:`Community Forums` feature was enabled. Select :guilabel:`Help` from the drop-down +menu to enable that forum. + +To create a new forum, type a name into the blank :guilabel:`Forums` field, then click the +:guilabel:`Create and Edit` option. Multiple forums can be selected in this field. + +Set up a forum +-------------- + +The settings on a forum are managed through either the *Website* or *eLearning* applications. From +the Odoo Dashboard, navigate to :menuselection:`Website --> Configuration --> Forums` or +:menuselection:`eLearning --> Forum --> Forums`. In either case, select a forum to edit from the +list. + +On the forum detail form, select a mode. + +The :guilabel:`Questions` mode allows for one answer/response for each post, while +:guilabel:`Discussion` mode allows for multiple responses. To limit the forum to a single website, +select it from the :guilabel:`Website` field. + +Under the :guilabel:`Order and Visibility` section, in the :guilabel:`Options` tab, choose how the +posts should be sorted, by modifying the :guilabel:`Default Sort` field. Change the +:guilabel:`Privacy` setting to change which users will have access to the forum. + +Below these settings, there is space to add a description for the forum. This description will be +visible on the website where the forum is published. + +.. image:: help_center/help-center-forum-settings.png + :align: center + :alt: Overview of a forum's settings page in Odoo Helpdesk. + +Karma gains and karma related rights +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When users interact on forums - either through posting questions, submitting answers, or upvoting +responses - they earn points, called *karma*. + +Karma points are used to build the credibility of a user within the community. The more positive +interactions a user has on the forum, the more karma points they gain. Certain activities, such as +posting without validation, or editing posts, require users to have earned a specific level of karma +points to prove their legitimacy and trustworthiness. + +These figures can be adjusted on the :guilabel:`Karma gains` and :guilabel:`Karma related rights` +tabs, located on the forums detail form. + +.. tabs:: + + .. tab:: Karma gains + + In the :guilabel:`Karma gains` tab, there are listed actions that will cause users to gain + (or lose) karma points. Those actions are: + + - Asking a question + - Question upvoted + - Question downvoted + - Answer upvoted + - Answer downvoted + - Accepting an answer + - Answer accepted + - Answer flagged + + .. tab:: Karma related rights + + In the :guilabel:`Karma related rights` tab, there are listed activities that users cannot + complete, without having a specific level of karma points. Those activities are: + + - Ask questions + - Answer questions + - Upvote + - Downvote + - Edit own posts + - Edit all posts + - Close own posts + - Close all posts + - Delete own posts + - Delete all posts + - Nofollow links + - Accept an answer on own question + - Accept an answer to all questions + - Editor features: image and links + - Comment on own posts + - Comment on all posts + - Convert own answers to comments (and vice versa) + - Convert all answers to comments (and vice versa) + - Unlink own comments + - Unlink all comments + - Ask questions without validation + - Flag a post as offensive + - Moderate posts + - Change question tags + - Create new tags + +Create a forum post from a Helpdesk ticket +------------------------------------------ + +When a *Helpdesk* team has a *Forum* enabled, tickets submitted to that team can be converted to +forum posts. + +To do that, select a ticket, either from a team's pipeline or from :menuselection:`Tickets --> All +Tickets` in the :guilabel:`Helpdesk` application. + +At the top of the ticket detail form, click the :guilabel:`Share on Forum` button. + +.. image:: help_center/help-center-share-on-forum.png + :align: center + :alt: Overview of the Forums page of a website to show the available ones in Odoo Helpdesk. + +When clicked, a pop-up appears. Here, the post and title can be edited to correct any typos, or +modified to remove any proprietary or client information. :guilabel:`Tags` can also be added to +help organize the post in the forum, making it easier for users to locate during a search. When all +adjustments have been made, click :guilabel:`Create and View Post`. + +eLearning +========= + +Odoo *eLearning* courses offer customers additional training and content in the form of videos, +presentations, and certifications/quizzes. Providing additional training enables customers to work +through issues and find solutions on their own. They can also develop a deeper understanding of the +services and products they are using. + +Enable eLearning courses on a Helpdesk team +------------------------------------------- + +To enable *eLearning* courses on a *Helpdesk* team, go to :menuselection:`Helpdesk --> Configuration +--> Teams` and select a team, or create a :doc:`new one +`. + +On the team's settings page, scroll to the :guilabel:`Self-Service` section, and check the box next +to :guilabel:`eLearning`. A new field will appear below, labeled :guilabel:`Courses`. + +Click the empty field next to :guilabel:`Courses` beneath the :guilabel:`eLearning` feature to +reveal a drop-down menu. Select an available course from the drop-down menu, or type a title into +the field, and click :guilabel:`Create and edit` to create a new course from this page. Multiple +courses can be assigned to a single team. + +Create an eLearning course +-------------------------- + +A new *eLearning* course can be created from the :guilabel:`Helpdesk` team's settings page, as in +the step above, or from the *eLearning* app. + +To create a course directly through the *eLearning* application, navigate to +:menuselection:`eLearning --> New`. This reveals a blank course template that can be customized and +modified as needed. + +On the course template page, add a :guilabel:`Course Title`, and below that, :guilabel:`Tags`. + +Click on the :guilabel:`Options` tab. Under :guilabel:`Access Rights`, choose the :guilabel:`Enroll +Policy`. This determines which users will be allowed to take the course. Under :guilabel:`Display`, +choose the course :guilabel:`Type` and :guilabel:`Visibility`. The :guilabel:`Visibility` setting +determines whether the course will be available to public site visitors or members. + +Add content to an eLearning course +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To add content to a course, click the :guilabel:`Content` tab and select :guilabel:`Add Content`. +Choose the :guilabel:`Content Type` from the drop-down menu and upload the file, or paste the link, +where instructed. Click :guilabel:`Save` when finished. Click :guilabel:`Add Section` to organize +the course in sections. + +.. image:: help_center/help-center-elearning-course-contents-page.png + :align: center + :alt: View of a course being published for Odoo Helpdesk. + +.. note:: + In order to add a certification to a course, go to :menuselection:`eLearning --> Configuration + --> Settings`, check the box labeled :guilabel:`Certifications`, and :guilabel:`Save` to activate + the setting. + +.. seealso:: + `Odoo Tutorials: eLearning `_ + +Publish an eLearning course +--------------------------- + +To allow customers to enroll in a course, both the course and the contents need to be published. + +If the course is published, but the contents of the course are not published, customers can enroll +in the course on the website, but they won't be able to view any of the course content. Knowing +this, it may be beneficial to publish the course first if the course contents are intended to be +released over time, such as classes with a weekly schedule. + +To make the entire course available at once, each piece of course content must be published first, +then the course can be published. + +To publish a course, choose a course from the *eLearning* dashboard. On the course template page, +click the :guilabel:`Go to Website` smart button. + +This will reveal the front end of the course's web page. At the top of the course web page, move +the :guilabel:`Unpublished` toggle switch to :guilabel:`Published`. + +Publish eLearning course contents from the back-end +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To publish *eLearning* course content from the back-end, choose a course from the *eLearning* +dashboard. On the course template page, click the :guilabel:`Published Contents` smart button. + +Doing so reveals a separate page displaying all the published content related to that course. Remove +the default :guilabel:`Published` filter from the search bar in the upper-right corner, to reveal +all the content related to the course - even the non-published content. + +Click the :guilabel:`≣ (List View)` icon in the upper-right corner, directly beneath the search bar +to switch to list view. + +While in :guilabel:`List View`, there is a checkbox on the far left of the screen, above the listed +courses, to the left of the :guilabel:`Title` column. When that checkbox is clicked, all the course +contents are selected at once. + +With all the course content selected, double click any of the boxes in the :guilabel:`Is Published` +column. This reveals a pop-up window, asking for confirmation that all selected records are intended +to be published. Click :guilabel:`OK` to automatically publish all course content. + +.. image:: help_center/help-center-elearning-publish-back-end.png + :align: center + :alt: View of a course contents being published in Odoo Helpdesk back-end. diff --git a/content/applications/services/helpdesk/overview/help_center/help-center-elearning-course-contents-page.png b/content/applications/services/helpdesk/overview/help_center/help-center-elearning-course-contents-page.png new file mode 100644 index 0000000000..301f68d686 Binary files /dev/null and b/content/applications/services/helpdesk/overview/help_center/help-center-elearning-course-contents-page.png differ diff --git a/content/applications/services/helpdesk/overview/help_center/help-center-elearning-publish-back-end.png b/content/applications/services/helpdesk/overview/help_center/help-center-elearning-publish-back-end.png new file mode 100644 index 0000000000..ee34591832 Binary files /dev/null and b/content/applications/services/helpdesk/overview/help_center/help-center-elearning-publish-back-end.png differ diff --git a/content/applications/services/helpdesk/overview/help_center/help-center-enable-features.png b/content/applications/services/helpdesk/overview/help_center/help-center-enable-features.png new file mode 100644 index 0000000000..2aef6c9d0e Binary files /dev/null and b/content/applications/services/helpdesk/overview/help_center/help-center-enable-features.png differ diff --git a/content/applications/services/helpdesk/overview/help_center/help-center-forum-settings.png b/content/applications/services/helpdesk/overview/help_center/help-center-forum-settings.png new file mode 100644 index 0000000000..c196988dab Binary files /dev/null and b/content/applications/services/helpdesk/overview/help_center/help-center-forum-settings.png differ diff --git a/content/applications/services/helpdesk/overview/help_center/help-center-knowledge-book-icon.png b/content/applications/services/helpdesk/overview/help_center/help-center-knowledge-book-icon.png new file mode 100644 index 0000000000..4d02c59986 Binary files /dev/null and b/content/applications/services/helpdesk/overview/help_center/help-center-knowledge-book-icon.png differ diff --git a/content/applications/services/helpdesk/overview/help_center/help-center-knowledge-search.png b/content/applications/services/helpdesk/overview/help_center/help-center-knowledge-search.png new file mode 100644 index 0000000000..488d83413a Binary files /dev/null and b/content/applications/services/helpdesk/overview/help_center/help-center-knowledge-search.png differ diff --git a/content/applications/services/helpdesk/overview/help_center/help-center-knowledge-sharing.png b/content/applications/services/helpdesk/overview/help_center/help-center-knowledge-sharing.png new file mode 100644 index 0000000000..2b6cd044a9 Binary files /dev/null and b/content/applications/services/helpdesk/overview/help_center/help-center-knowledge-sharing.png differ diff --git a/content/applications/services/helpdesk/overview/help_center/help-center-knowledge-template-options.png b/content/applications/services/helpdesk/overview/help_center/help-center-knowledge-template-options.png new file mode 100644 index 0000000000..77cc953e55 Binary files /dev/null and b/content/applications/services/helpdesk/overview/help_center/help-center-knowledge-template-options.png differ diff --git a/content/applications/services/helpdesk/overview/help_center/help-center-share-on-forum.png b/content/applications/services/helpdesk/overview/help_center/help-center-share-on-forum.png new file mode 100644 index 0000000000..b8b2447013 Binary files /dev/null and b/content/applications/services/helpdesk/overview/help_center/help-center-share-on-forum.png differ diff --git a/content/applications/services/helpdesk/timesheet_and_invoice.rst b/content/applications/services/helpdesk/timesheet_and_invoice.rst deleted file mode 100644 index b68dc283f7..0000000000 --- a/content/applications/services/helpdesk/timesheet_and_invoice.rst +++ /dev/null @@ -1,11 +0,0 @@ -:nosearch: - -===================== -Timesheet and Invoice -===================== - -.. toctree:: - :titlesonly: - - timesheet_and_invoice/invoice_time - timesheet_and_invoice/reinvoice_from_project diff --git a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time.rst b/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time.rst deleted file mode 100644 index 6747ff2aa7..0000000000 --- a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time.rst +++ /dev/null @@ -1,112 +0,0 @@ -======================================================== -Invoice Time Spent on Tickets (Prepaid Support Services) -======================================================== - -Have the option to work with prepaid support services, meaning that a sales order and a -corresponding invoice are issued and, once the service is done, you can deduct the time spent. Odoo -allows it to happen because the applications are fully integrated, resulting in faster responses -to your customer needs. - -Set up -====== - -Step 1: Set up a helpdesk team ------------------------------- - -| Go to :menuselection:`Helpdesk --> Configuration --> Helpdesk Teams`, create or edit an existing - team, and enable *Timesheet on Ticket* and *Time Reinvoicing*. -| Select or create a project under *Timesheet on Ticket*. The selected/created is - the one at which employees timesheet on by default. However, it can be ultimately modified on - each ticket. - -.. image:: invoice_time/sell_track_hours.png - :align: center - :alt: View of a helpdesk team settings page emphasizing the timesheet on ticket and time - reinvoicing features in Odoo Helpdesk - -Step 2: Set up a service ------------------------- - -| Go to :menuselection:`Sales --> Configuration --> Settings` and enable *Units of Measure* to - optionally be able to choose *hours* (for example) as the unit of measure of your service. -| Then, go to :menuselection:`Sales --> Products --> Products`, create or edit an existing one, and - set its *Product Type* as *Service*. - -.. image:: invoice_time/product_type_unit.png - :align: center - :alt: View of a product's form emphasizing the product type and unit of measure fields in Odoo - Sales - -Now, select the invoicing management you would like to have under the *Sales* tab. We recommend the -following configuration: - -.. image:: invoice_time/product_invoicing.png - :align: center - :alt: View of a product form and the invoicing options under the tab sales in Odoo Sales - -This configuration ensures that the customer is invoiced by the number of hours predicted in the -sales order, meaning that less or extra hours recorded are not taken into account. It also ensures -that every time a sales order is confirmed, a new task is created under the right project, -automating the process. - -.. tip:: - We recommend setting up a specific project, as it was done for this flow example. The important - thing to remember is that the sales order item needs to be set on the corresponding project or - task, in order to reinvoice the time spent on a ticket. - -Prevision an invoice and record time -==================================== - -Step 1: Place an order ----------------------- - -Go to :menuselection:`Sales --> Orders --> Orders` and create one for the helpdesk service product -you have previously set up, with the customer who needs the ticket to be opened. Set the number of -hours needed to assist the customer and *Confirm* the order. - -.. image:: invoice_time/sales_order_new.png - :align: center - :alt: View of a sales order emphasizing the order lines in Odoo Sales - -Step 2: Invoice the customer ----------------------------- - -In *Sales*, select the respective sales order to *Create Invoice*. - -.. image:: invoice_time/create_invoice.png - :align: center - :height: 330 - :alt: View of a sales order emphasizing the create invoice button in Odoo Sales - -Step 3: Link the task to the ticket ------------------------------------ - -Now, in *Helpdesk*, create or edit the respective ticket and link it to the task created by the -confirmation of the sales order. - -.. image:: invoice_time/helpdesk_task.png - :align: center - :alt: View of a helpdesk ticket emphasizing the field task in Odoo Helpdesk - -Step 4: Record the time spent ------------------------------ - -Still on the respective helpdesk ticket, record the hours performed under the *Timesheets* tab. - -.. image:: invoice_time/helpdesk_timesheet.png - :align: center - :alt: View of a helpdesk ticket emphasizing the timesheets tab in Odoo Helpdesk - -Note that the hours recorded on the ticket form are shown on the *Delivered* column in the sales -order. - -.. image:: invoice_time/quotation_delivered.png - :align: center - :alt: View of a sales order emphasizing the delivered column in Odoo Sales - -.. tip:: - Hours recorded on the ticket are automatically shown in *Timesheets* and on the dedicated task. - -.. seealso:: - - :doc:`reinvoice_from_project` - - :doc:`/applications/inventory_and_mrp/inventory/management/products/uom` diff --git a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/create_invoice.png b/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/create_invoice.png deleted file mode 100644 index f9a6728c78..0000000000 Binary files a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/create_invoice.png and /dev/null differ diff --git a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/helpdesk_task.png b/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/helpdesk_task.png deleted file mode 100644 index 9a65f54fa4..0000000000 Binary files a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/helpdesk_task.png and /dev/null differ diff --git a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/helpdesk_timesheet.png b/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/helpdesk_timesheet.png deleted file mode 100644 index 6a3442b584..0000000000 Binary files a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/helpdesk_timesheet.png and /dev/null differ diff --git a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/product_invoicing.png b/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/product_invoicing.png deleted file mode 100644 index 9e7380716a..0000000000 Binary files a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/product_invoicing.png and /dev/null differ diff --git a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/product_type_unit.png b/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/product_type_unit.png deleted file mode 100644 index e7c6059858..0000000000 Binary files a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/product_type_unit.png and /dev/null differ diff --git a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/quotation_delivered.png b/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/quotation_delivered.png deleted file mode 100644 index c547e037e7..0000000000 Binary files a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/quotation_delivered.png and /dev/null differ diff --git a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/sales_order_new.png b/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/sales_order_new.png deleted file mode 100644 index bb5008665a..0000000000 Binary files a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/sales_order_new.png and /dev/null differ diff --git a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/sell_track_hours.png b/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/sell_track_hours.png deleted file mode 100644 index 24cca0bad4..0000000000 Binary files a/content/applications/services/helpdesk/timesheet_and_invoice/invoice_time/sell_track_hours.png and /dev/null differ diff --git a/content/applications/services/helpdesk/timesheet_and_invoice/reinvoice_from_project.rst b/content/applications/services/helpdesk/timesheet_and_invoice/reinvoice_from_project.rst deleted file mode 100644 index 8ca7cdec61..0000000000 --- a/content/applications/services/helpdesk/timesheet_and_invoice/reinvoice_from_project.rst +++ /dev/null @@ -1,104 +0,0 @@ -========================================================= -Invoice Time Spent on Tickets (Postpaid Support Services) -========================================================= - -The :guilabel:`Timesheets` integration provides more control and transparency over how clients are -charged, and what they're specifically billed for. - -In Odoo, the Helpdesk agent can use the ticket to record timesheets. Once a ticket is solved, the -client can be billed for the time spent on the ticket. Odoo will pull from the ticket's timesheet -to accurately bill the client. - -Configuration -============= - -To turn on the :guilabel:`Timesheets` feature, go to :menuselection:`Helpdesk --> Configuration ---> Helpdesk Teams`, select a Helpdesk team, and then, click :guilabel:`Edit`. Next, enable the -options :guilabel:`Timesheets` and :guilabel:`Time Billing`. Then, click :guilabel:`Save` to apply -these changes to the Helpdesk team settings. - -Once the :guilabel:`Timesheets` feature is enabled, a :guilabel:`Project` drop-down option will -appear below :guilabel:`Timesheets`. The :guilabel:`Project` drop-down option will automatically -be set to a project that Odoo created for the Helpdesk team. The tickets' timesheets -will be stored in the selected project. - -Create a sales order -==================== - -After a ticket comes into the pipeline, go to :menuselection:`Sales --> Create`. Then, add the -customer from the ticket to the :guilabel:`Customer` field in the new quotation. In the -:guilabel:`Order Lines` tab, create or select a product to charge the customer for the time spent -on their Helpdesk ticket. - -If creating a new product from the sales order form, first give the product a name by typing it in -the :guilabel:`Product` column. Then, click :guilabel:`Create and edit`. - -First, in the :guilabel:`General Information` tab, set the :guilabel:`Product Type` to -:guilabel:`Service` and the :guilabel:`Sales Price` to the Helpdesk agent's service rate. Then, set -the :guilabel:`Invoicing Policy` to :guilabel:`Based on Timesheets`. Finally, click -:guilabel:`Save` to create the new product and add it to the quotation. - -Once the product is added, click :guilabel:`Confirm` to turn the quotation into a sales order. - -.. image:: reinvoice_from_project/create-sales-order.png - :align: center - :alt: Create a sales order and add a product. - -Record a timesheet -================== - -To record a timesheet, jump back to the Helpdesk ticket by going to the :guilabel:`Helpdesk` -dashboard, clicking :guilabel:`Tickets` on the team's card, and locating the correct ticket. Then, -click :guilabel:`Edit` and use the :guilabel:`Timesheets` tab to record the time spent on the -ticket. - -.. image:: reinvoice_from_project/record-timesheet-ticket.png - :align: center - :alt: Record time spent on a ticket. - -.. tip:: - The ticket's timesheets can be recorded before or after the sales order is made, the order - doesn't matter. - -Link the Helpdesk ticket to the SO -================================== - -To link the :guilabel:`Sales Order` to the ticket, start on the ticket form and click -:guilabel:`Edit`. Next, select the :guilabel:`Sales Order` that was created earlier from the -:guilabel:`Sales Order Item` drop-down menu. Odoo will automatically filter the options to only -show sales orders that are connected to the ticket's customer. Lastly, click :guilabel:`Save` to -connect the ticket and the :guilabel:`Sales Order Item`. - -.. image:: reinvoice_from_project/link-soi-to-ticket.png - :align: center - :alt: Link the SO item to the ticket. - -.. tip:: - The :guilabel:`Sales Order Item` can be connected to the ticket before or after any timesheets - are recorded, the order doesn't matter. - -Modify billing rates -==================== - -If a timesheet entry is recorded, but the agent does not want to bill the client for that time, go -to the :guilabel:`Timesheets` tab and toggle on the visibility of the :guilabel:`Sales Order Item` -column. When filling out the information for the timesheet entry, make sure to leave the -non-billable timesheet entry's :guilabel:`Sales Order Item` field blank. - -If the agent wants to charge a different rate for a timesheet entry, first, add a new product to -the connected :abbr:`SO (Sales Order)` priced at the new rate. Then, select the new product in the -timesheet entry's :guilabel:`Sales Order Item` field. - -Create the invoice -================== - -When the Helpdesk ticket is completed and the client is ready to be billed for time, begin by -clicking the :guilabel:`Sales Order` smart button on the ticket form to navigate to the sales -order. The :guilabel:`Delivered` column should match the number of hours recorded on the ticket's -timesheet. After checking and filling out the relevant information, click :guilabel:`Create -Invoice` to bill the client for the time spent on the ticket. Odoo will automatically generate an -invoice to send to the client and the Helpdesk ticket can officially be closed. - -.. seealso:: - - :doc:`invoice_time` - - :doc:`/applications/inventory_and_mrp/inventory/management/products/uom` diff --git a/content/applications/services/helpdesk/timesheet_and_invoice/reinvoice_from_project/create-sales-order.png b/content/applications/services/helpdesk/timesheet_and_invoice/reinvoice_from_project/create-sales-order.png deleted file mode 100644 index b95a696410..0000000000 Binary files a/content/applications/services/helpdesk/timesheet_and_invoice/reinvoice_from_project/create-sales-order.png and /dev/null differ diff --git a/content/applications/services/helpdesk/timesheet_and_invoice/reinvoice_from_project/link-soi-to-ticket.png b/content/applications/services/helpdesk/timesheet_and_invoice/reinvoice_from_project/link-soi-to-ticket.png deleted file mode 100644 index 234f3a4f2c..0000000000 Binary files a/content/applications/services/helpdesk/timesheet_and_invoice/reinvoice_from_project/link-soi-to-ticket.png and /dev/null differ diff --git a/content/applications/services/helpdesk/timesheet_and_invoice/reinvoice_from_project/record-timesheet-ticket.png b/content/applications/services/helpdesk/timesheet_and_invoice/reinvoice_from_project/record-timesheet-ticket.png deleted file mode 100644 index 143c38eaa4..0000000000 Binary files a/content/applications/services/helpdesk/timesheet_and_invoice/reinvoice_from_project/record-timesheet-ticket.png and /dev/null differ diff --git a/content/applications/services/project/tasks.rst b/content/applications/services/project/tasks.rst index 5b6dc55b7c..66434bedd3 100644 --- a/content/applications/services/project/tasks.rst +++ b/content/applications/services/project/tasks.rst @@ -8,3 +8,4 @@ Tasks :titlesonly: tasks/email_alias + tasks/recurring_tasks diff --git a/content/applications/services/project/tasks/recurring_tasks.rst b/content/applications/services/project/tasks/recurring_tasks.rst new file mode 100644 index 0000000000..c5cd2b13be --- /dev/null +++ b/content/applications/services/project/tasks/recurring_tasks.rst @@ -0,0 +1,50 @@ +=============== +Recurring tasks +=============== + +When handling a project, the same task often needs to be performed several times: for example, +weekly meetings or status reports. The **recurring tasks** feature allows you to automate the +creation of those tasks. + +.. seealso:: + `Odoo Tutorials: Recurring tasks `_ + +Configuration +============= + +To enable recurring tasks, go to :menuselection:`Project --> Configuration --> Settings`, then +activate :guilabel:`Recurring Tasks`, and press :guilabel:`Save`. + +Recurring tasks are now activated on all existing projects. The feature can be deactivated +on an individual project by clicking the drop-down menu button :guilabel:`⋮` next to the project +name, then going to :menuselection:`Settings --> Settings --> Task Management` and disabling +:guilabel:`Recurring Tasks`. + +Set up task recurrence +---------------------- + +In an existing task, press the :guilabel:`Recurrent` button next to the :guilabel:`Planned date`. +Then, configure :guilabel:`Repeat Every` field according to your needs. + +A new task in recurrence will be created once either of this conditions is met: +- Previous task in recurrence has been closed. +- On the day of the planned recurrence. + +The new task is created on your project dashboard with the following configuration: + +- :guilabel:`Stage`: first stage of the project dashboard (:guilabel:`New` or equivalent); +- :guilabel:`Name`, :guilabel:`Description`, :guilabel:`Project`, :guilabel:`Assignees`, + :guilabel:`Customer`, :guilabel:`Tags`: copied from the original task; +- :guilabel:`Milestones`, :guilabel:`Deadline`, :guilabel:`Timesheets`, :guilabel:`Chatter`, + :guilabel:`Activities`, :guilabel:`Subtasks`: those fields are not copied; + +- A **smart button** on the task displays the total number of existing recurrences. + +Edit or stop task recurrence +---------------------------- + +**To edit** the recurrence, open the last task in recurrence. Any changes made on the task will be +applied to the tasks that will be created in the future. + +**To stop** the recurrence, open the last task in recurrence and press the :guilabel:`Recurrent` +button next to the :guilabel:`Planned date`. diff --git a/content/applications/services/project/tasks/recurring_tasks/project-settings.png b/content/applications/services/project/tasks/recurring_tasks/project-settings.png new file mode 100644 index 0000000000..714a521f57 Binary files /dev/null and b/content/applications/services/project/tasks/recurring_tasks/project-settings.png differ diff --git a/content/applications/websites.rst b/content/applications/websites.rst index 66f276683b..03129ffa13 100644 --- a/content/applications/websites.rst +++ b/content/applications/websites.rst @@ -9,4 +9,5 @@ Websites websites/website websites/ecommerce + websites/elearning websites/livechat diff --git a/content/applications/websites/ecommerce/managing_products/price_management.rst b/content/applications/websites/ecommerce/managing_products/price_management.rst index 7a3cff428c..143679d366 100644 --- a/content/applications/websites/ecommerce/managing_products/price_management.rst +++ b/content/applications/websites/ecommerce/managing_products/price_management.rst @@ -13,13 +13,13 @@ Tax configuration To add a tax on a product, you can either set a tax in the :guilabel:`Customer Taxes` field of the **product template** or use -:doc:`fiscal positions `. +:doc:`fiscal positions `. .. seealso:: - - :doc:`/applications/finance/accounting/taxation/taxes/taxes` - - :doc:`/applications/finance/accounting/taxation/taxes/avatax` - - :doc:`/applications/finance/accounting/taxation/taxes/taxcloud` - - :doc:`/applications/finance/accounting/taxation/taxes/fiscal_positions` + - :doc:`/applications/finance/accounting/taxes` + - :doc:`/applications/finance/accounting/taxes/avatax` + - :doc:`/applications/finance/accounting/taxes/taxcloud` + - :doc:`/applications/finance/accounting/taxes/fiscal_positions` Tax display ----------- @@ -48,7 +48,7 @@ You can choose to display the type of pricing next to the product price by going :alt: Tax type displayed on the product page .. seealso:: - :doc:`/applications/finance/accounting/taxation/taxes/B2B_B2C` + :doc:`/applications/finance/accounting/taxes/B2B_B2C` Price per unit ============== @@ -77,6 +77,8 @@ page. .. seealso:: :doc:`/applications/inventory_and_mrp/inventory/management/products/uom` +.. _ecommerce/pricelists: + Price configuration: pricelists ------------------------------- diff --git a/content/applications/websites/elearning.rst b/content/applications/websites/elearning.rst new file mode 100644 index 0000000000..19ee040ece --- /dev/null +++ b/content/applications/websites/elearning.rst @@ -0,0 +1,252 @@ +========= +eLearning +========= + +The **eLearning** app allows you to easily upload content, define learning objectives, manage +attendees, assess students' progress, and even set up rewards. Engaging participants in a meaningful +learning experience enhances their attentiveness and fosters heightened productivity. + +.. important:: + You can manage your eLearning content on the **front end** or the **back end**. The **front end** + allows you to create content quickly from your website, while the **back end** provides + additional options and allows collaboration. This documentation focuses on using the back end to + create your content. + +.. seealso:: + `Odoo Tutorials: eLearning `_ + +Courses +======= + +By going to :menuselection:`eLearning --> Courses --> Courses`, you can get an overview of all your +courses. + +Click on a course title to edit your course on the back end. Click on :guilabel:`View course` to +access your course on the front end. + +Course creation +--------------- + +Click :guilabel:`New` to create a new course. When the page pops up, you can add your +:guilabel:`Course Title` and one or more :guilabel:`Tags` to describe your course. You can add an +image to illustrate your course by hovering your mouse on the camera placeholder image and clicking +on the edit icon. Four tabs allow you to edit your course further: +:ref:`Content `, :ref:`Description `, +:ref:`Options `, and :ref:`Karma `. + +.. image:: elearning/elearning-course-creation.png + :align: center + :alt: Create your elearning course. + +.. _elearning/content: + +Content tab +~~~~~~~~~~~ + +This tab allows you to manage your course content. Click on :guilabel:`Add Section` to divide your +course into different sections. Click on :guilabel:`Add Content` to create +:ref:`content `. Click on :guilabel:`Add Certification` to assess the +level of understanding of your attendees, certify their skills, and motivate them. **Certification** +is part of the :doc:`Surveys <../marketing/surveys/create>` app. + +.. _elearning/description: + +Description tab +~~~~~~~~~~~~~~~ + +You can add a short description or information related to your course in the :guilabel:`Description` +tab. It appears under your course title on your website. + +.. image:: elearning/course-description.png + :align: center + :alt: Add a description to your course. + +.. _elearning/options: + +Options tab +~~~~~~~~~~~ + +In the :guilabel:`Options` tab, different configurations are available: +:ref:`Course `, :ref:`Communication `, +:ref:`Access rights `, and :ref:`Display `. + +.. image:: elearning/options-tab.png + :align: center + :alt: Overview of the Options tab + +.. _elearning/course: + +Course +****** + +Assign a :guilabel:`Responsible` user for your course. If you have multiple websites, use the +:guilabel:`Website` field to only display the course on the selected website. + +.. _elearning/communication: + +Communication +************* + +- :guilabel:`Allow Reviews`: tick the box to allow attendees to like and comment on your content and + to submit reviews on your course; +- :guilabel:`Forum`: add a dedicated forum to your course (only shown if the **Forum** feature is + enabled in the app's settings); +- :guilabel:`New Content Notification`: select an email template sent to your attendees when you + upload new content. Click on the internal link button (:guilabel:`➜`) to have access to the email + template editor; +- :guilabel:`Completion Notification`: select an email template sent to your attendees once they + reach the end of your course. Click on the internal link button (:guilabel:`➜`) to access the + email template editor; + +.. _elearning/access-rights: + +Access rights +************* + +- :guilabel:`Show course to`: define who can access your course and their content between + :guilabel:`Everyone`, :guilabel:`Signed In` or :guilabel:`Course Attendees`; +- :guilabel:`Enroll Policy`: define how people enroll in your course. Select: + + - :guilabel:`Open`: if you want your course to be available to anyone; + - :guilabel:`On Invitation`: if only people who received an invitation can enroll to your course. + If selected, fill in the :guilabel:`Enroll Message` explaining the course's enrollment process. + This message appears on your website under the course title; + - :guilabel:`On Payment`: if only people who bought your course can attend it. The + :guilabel:`Paid Courses` feature must be enabled to get this option. If you select + :guilabel:`On Payment`, you must add a :guilabel:`Product` for your course. + + .. note:: + Only products set up with :guilabel:`Course` as their :guilabel:`Product Type` are + displayed. + +.. _elearning/display: + +Display +******* + +- :guilabel:`Training`: the course content appears as a training program, and the courses must be + taken in the proposed order. +- :guilabel:`Documentation`: the content is available in any order. If you choose this option, you + can choose which page should be promoted on the course homepage by using the + :guilabel:`Featured Content` field. + +.. _elearning/karma: + +Karma tab +~~~~~~~~~ + +This tab is about gamification to make eLearning fun and interactive. + +In the :guilabel:`Rewards` section, choose how many karma points you want to grant your students +when they :guilabel:`Review` or :guilabel:`Finish` a course. + +In the :guilabel:`Access Rights` section, define the karma needed to :guilabel:`Add Review`, +:guilabel:`Add Comment`, or :guilabel:`Vote` on the course. + +.. note:: + From your course, click the :guilabel:`Contact Attendees` button to reach people who are + enrolled in the course. + +.. _elearning/course-groups: + +Course groups +------------- + +Use the **Course Groups** to inform users and allow them to filter the courses from the +:guilabel:`All Courses` dashboard. + +You can manage them by going to :menuselection:`Configuration --> +Course Groups`. Click :guilabel:`New` to create a new course group. Add the :guilabel:`Course Group +Name`, tick the :guilabel:`Menu Entry` box to allow users to search by course group on the website, +and add tags in the :guilabel:`Tag Name` column. For each tag, you can select a corresponding color. + +Settings +-------- + +You can enable different features to customize your courses by going to :menuselection:`eLearning +--> Configuration --> Settings`: + +- **Certifications**: to evaluate the knowledge of your attendees and certify their skills; +- **Paid courses**: to sell access to your courses on your website and track revenues; +- **Mailing**: to update all your attendees at once through mass mailings; +- **Forum**: to create a community and let attendees answer each other's questions. + +.. _elearning/create-content: + +Content +======= + +Manage your content by going to :menuselection:`eLearning --> Courses --> Contents`. Click +:guilabel:`New` to create content. Add your :guilabel:`Content Title`, and if you want +:ref:`Tags `, then fill in the related information among the different tabs. + +.. image:: elearning/elearning-content-tab.png + :align: center + :alt: Create your content. + +Document tab +------------ + +- :guilabel:`Course`: select the course your content belongs to; +- :guilabel:`Content Type`: select the type of your content; +- :guilabel:`Responsible`: add a responsible person for your content; +- :guilabel:`Duration`: indicate the time required to complete the course; +- :guilabel:`Allow Download`: allow users to download the content of the slide. This option is only + visible when the content is a document; +- :guilabel:`Allow Preview`: the course is accessible by anyone. +- :guilabel:`# of Public Views`: displays the number of views from non-enrolled participants; +- :guilabel:`# Total Views`: displays the total number of views (non-enrolled and enrolled + participants). + +Description tab +--------------- + +You can add a description of your content that appears front end in the :guilabel:`About` section of +your course content. + +Additional Resources tab +------------------------ + +Click :guilabel:`Add a line` to add a link or a file that supports your participants' learning. +It appears in the course content on your website. + +.. image:: elearning/additional-content.png + :align: center + :alt: Additional ressources + +Quiz tab +-------- + +From this tab you can create a quiz to assess your students at the end of the course. + +The :guilabel:`Points Rewards` section lets you give a specific number of karma points depending on +how many tries they need to correctly answer the question. Then, create your questions and the +possible answers by clicking on :guilabel:`Add a line`. A new window pops up, add the question by +filling in the :guilabel:`Question Name` and add multiple answers by clicking on :guilabel:`Add a +line`. Tick the :guilabel:`Is correct answer` to mark one or more answers as correct. You can also +fill in the :guilabel:`Comment` field to display additional information when the answer is chosen by +the participant. + +.. _elearning/tags: + +Content Tags +------------ + +The **Content Tags** help users to classify the content from the :guilabel:`Contents` dashboard. + +You can manage them by going to :menuselection:`eLearning --> Configuration --> Content Tags`. Click +:guilabel:`New` to create a new tag. + +Publish your content +==================== + +Everything created on the back end needs to be published from the front end. Unpublished content is +always visible from your website but still needs to be published to be available to your audience. + +You must be on your website's front end to publish your content. To do so, click on the +:guilabel:`Go To Website` smart button, and tick the :guilabel:`Publish` option available in the +right-hand corner. + +.. image:: elearning/elearning-publish-button.png + :align: center + :alt: Publish your content. diff --git a/content/applications/websites/elearning/additional-content.png b/content/applications/websites/elearning/additional-content.png new file mode 100644 index 0000000000..ff296c8ec1 Binary files /dev/null and b/content/applications/websites/elearning/additional-content.png differ diff --git a/content/applications/websites/elearning/course-description.png b/content/applications/websites/elearning/course-description.png new file mode 100644 index 0000000000..2162a3aae7 Binary files /dev/null and b/content/applications/websites/elearning/course-description.png differ diff --git a/content/applications/websites/elearning/elearning-content-tab.png b/content/applications/websites/elearning/elearning-content-tab.png new file mode 100644 index 0000000000..9acc434d58 Binary files /dev/null and b/content/applications/websites/elearning/elearning-content-tab.png differ diff --git a/content/applications/websites/elearning/elearning-course-creation.png b/content/applications/websites/elearning/elearning-course-creation.png new file mode 100644 index 0000000000..0187af998f Binary files /dev/null and b/content/applications/websites/elearning/elearning-course-creation.png differ diff --git a/content/applications/websites/elearning/elearning-publish-button.png b/content/applications/websites/elearning/elearning-publish-button.png new file mode 100644 index 0000000000..42ad7148e9 Binary files /dev/null and b/content/applications/websites/elearning/elearning-publish-button.png differ diff --git a/content/applications/websites/elearning/options-tab.png b/content/applications/websites/elearning/options-tab.png new file mode 100644 index 0000000000..10e2de774c Binary files /dev/null and b/content/applications/websites/elearning/options-tab.png differ diff --git a/content/applications/websites/elearning/settings.png b/content/applications/websites/elearning/settings.png new file mode 100644 index 0000000000..0cde65eef4 Binary files /dev/null and b/content/applications/websites/elearning/settings.png differ diff --git a/content/applications/websites/livechat.rst b/content/applications/websites/livechat.rst index 15cce91687..92f4f49966 100644 --- a/content/applications/websites/livechat.rst +++ b/content/applications/websites/livechat.rst @@ -5,83 +5,293 @@ Live Chat ========= -Live Chat has the highest satisfaction rating of any communication tool. It allows fast responses -and it is accessible and convenient, as your customers can keep doing what they are doing while -interacting with you. Remember: your customers want to talk to you, so let's make it easy. +Odoo *Live Chat* allows users to communicate with website visitors in real time. With *Live Chat*, +leads can be qualified for their sales potential, support questions can be answered quickly, and +issues can be directed to the appropriate team for further investigation (or follow up). *Live Chat* +also provides the opportunity for instant feedback from customers. -.. seealso:: - - `Live Chat: product page `_ - - :doc:`livechat/ratings` - - :doc:`livechat/responses` +Enable Live Chat +================ + +In order to enable *Live Chat*, the *Live Chat* application needs to be installed. This can be done +in one of two ways. + +- Go to :menuselection:`Apps --> Live Chat` and click :guilabel:`Install`. +- In the :menuselection:`Website` application, go to :menuselection:`Configuration --> Settings`, + scroll to the :guilabel:`Email & Marketing` section, check the box next to :guilabel:`Livechat`, + and click :guilabel:`Save`. + +.. image:: livechat/enable-setting.png + :align: center + :alt: View of the settings page and the live chat feature for Odoo Live Chat. + +After the :guilabel:`Live Chat` application is installed, a live chat :guilabel:`Channel` will be +created by default and automatically selected in the drop-down. + +Create a new live chat channel +============================== + +To create a new live chat *Channel*, go to :menuselection:`Main Odoo Dashboard --> Live Chat app --> +New`. This will open a blank channel detail form. Enter the name of the new channel in the +:guilabel:`Channel Name` field. + +.. image:: livechat/open-channel.png + :align: center + :alt: View of a live chat channel form for Odoo Live Chat. -Set up -====== +To configure the remaining tabs on the channel detail form (:guilabel:`Operators`, +:guilabel:`Options`, :guilabel:`Channel Rules`, and :guilabel:`Widgets`), follow the steps below. -Once *Live Chat* is installed on your database, if your website was created with Odoo, the -application is automatically added to it. All that is left to do is to go to -:menuselection:`Website --> Configuration --> Settings --> Live Chat`. +Operators +--------- -.. image:: livechat/livechat_settings.png - :height: 300 - :alt: View of the settings page and the live chat feature for Odoo Live Chat +*Operators* are the users who will respond to live chat requests from customers. When a user is +added as an operator in a live chat channel, they will be able to receive chats from website +visitors wherever they are in the database. Chat windows will open in the bottom right corner of the +screen. -Select the channel to be linked to your website or create one on the fly. +.. image:: livechat/pop-up.png + :align: center + :alt: View of a live chat pop up window in an Odoo database. -.. image:: livechat/channels.png - :alt: View of a live chat channel form for Odoo Live Chat +The user who originally created the live chat channel will be added as an operator by default. -| For both scenarios, under: -| - **Operators**: add agents to respond to the chat requests. Add as many as you like, and keep in - mind that operators that do not show any activity in Odoo for more than 30min are considered - disconnected. -| - **Options**: set the default text to be shown on the live chat button; an automated welcome - message to be seen by visitors when a conversation is initiated, and the text that prompts the - user to initiate a chat. -| - **Channel Rules**: choose an action for a given URL, and/or per country. In the example below, - the chat window automatically pops-up 3 seconds after users (from any country) land on the - contact us page. +To add additional users, navigate back to the :guilabel:`Website Live Chat Channels` dashboard via +the breadcrumbs and click on the appropriate :guilabel:`Live Chat Channel`. Then, on the channel +detail form, under the :guilabel:`Operators` tab, click :guilabel:`ADD` to reveal an :guilabel:`Add: +Operators` pop-up window. -.. image:: livechat/rules.png - :alt: View of a channel’s rules form for Odoo Live Chat +In the pop-up window, search for the desired user(s). Then, click the checkbox next to the user(s) +to be added, and click :guilabel:`SELECT`. + +New operators can be created and added to the list directly from this pop-up, as well, by clicking +:guilabel:`New`, and filling out the :guilabel:`Create Operators` pop-up form. When the form is +complete, click :guilabel:`SAVE & CLOSE` (or :guilabel:`SAVE & NEW` for multiple record creations). .. note:: - GeoIP, which refers to the process of finding a computer terminal’s geographical location by its - IP address, must be installed on your server. Otherwise, under *Channel Rules*, countries are - not taken into account. + Current operators can be edited (or removed) by clicking on their respective boxes in the + :guilabel:`Operators` tab, which reveals a separate :guilabel:`Open: Operators` pop-up. In that + pop-up, adjust any information as needed, and click :guilabel:`Save`, or click :guilabel:`Remove` + to remove that operator from the channel. + +Options +------- + +The :guilabel:`Options` tab on the live chat channel details form contains the visual and text +settings for the live chat window. + +Livechat button +~~~~~~~~~~~~~~~ + +The *Livechat Button* is the icon that appears in the bottom corner of the website. + +.. image:: livechat/chat-button.png + :align: center + :alt: View of an Odoo website emphasizing the livechat button. + +Change the text in the :guilabel:`Text of the Button` field to update the greeting displayed in the +text bubble when the live chat button appears on the website. + +Change the :guilabel:`Livechat Button Color` by clicking a color bubble to open the color selection +window. Click the :guilabel:`🔄 (refresh)` icon to the right of the color bubbles to reset the +colors to the default selection. + +.. tip:: + Color selection, for the button or header, can be made manually using a slider or through RGB, + HSL, or HEX color code entries from the pop-up color selection window that appears when either of + the color bubbles are clicked. Different options will be available, depending on your operating + system. + +Livechat window +~~~~~~~~~~~~~~~ + +The *Livechat Window* is the space where the live chat conversation with website visitors takes +place. + +Edit the :guilabel:`Welcome Message` to change the message a visitor sees when they open a new chat +session. This message will appear as though it is sent by a live chat operator, and acts as both a +greeting and an invitation to continue the conversation. + +Edit the :guilabel:`Chat Input Placeholder` to alter the text that appears in the box where visitors +will type their replies. + +The *Channel Header* is the colored bar at the top of the chat window. The :guilabel:`Channel Header +Color` can be changed following the same steps as the *Livechat Button Color* above. + +.. figure:: livechat/chat-window.png + :align: center + + The Livechat Window with a purple header. The chat input placeholder reads "Ask Something..." + +Channel rules +------------- + +The :guilabel:`Channel Rules` tab on the live chat channel details form determines when the *Live +Chat Window* opens on the website, by configuring when a :guilabel:`URL Regex` action is triggered +(e.g., a page visit). + +To create a new channel rule, click :guilabel:`Add a line`. This opens the :guilabel:`Open: Rules` +pop-up. + +.. image:: livechat/create-rules.png + :align: center + :alt: View of a channel's rules form for Odoo Live Chat. + +Create new rules +~~~~~~~~~~~~~~~~ + +Fill out the fields on the :guilabel:`Open: Rules` pop-up as instructed below, then click +:guilabel:`Save`. + +.. tabs:: -External options ----------------- + .. tab:: Live Chat Button -| If your website was not created with Odoo, you can find the code to be added to your own, under - the *Widget* tab. -| Odoo also offers an URL you can send to users so they can have access to a single live chat page. + The *Livechat Button* is the icon that appears in the bottom corner of the website. Select + from one of the following display options: -.. image:: livechat/widget.png - :alt: View of the widget tab for Odoo Live Chat + - :guilabel:`Show` displays the chat button on the page(s). + - :guilabel:`Show with notification` displays the chat button, as well as a floating text + bubble next to the button. + - :guilabel:`Open automatically` displays the button and automatically opens the chat window + after a specified amount of time (designated in the :guilabel:`Open automatically timer` + field). + - :guilabel:`Hide` hides the chat button on the page(s). -Managing chat requests -====================== + .. tab:: Chatbot -Conversations initiated by visitors pop up as a direct message, and are shown in *Discuss*. -Therefore, inquiries can be answered wherever you are in Odoo. + If a *Chatbot* will be included on this channel, select it from the dropdown. If the chatbot + will only be active when no operators are active, check the box labeled :guilabel:`Enabled + only if no operator`. -.. image:: livechat/discuss.png - :alt: View of the discuss application with a message sent through live chat in Odoo + .. tab:: URL Regex + + In the :guilabel:`URL Regex` field, input the relative URL of the page where the chat button + should appear. + + .. tab:: Open automatically timer + + This field designates the amount of time (in seconds) a page will be open before the chat + window will open. If the :guilabel:`Livechat Button` for this rule is not set to + :guilabel:`Open automatically`, this field will be ignored. + + .. tab:: Country + + If this channel should only be available to site visitors in specific countries, add them to + the :guilabel:`Country` field. If this field is left blank, the channel will be available to + all site visitors, regardless of location. .. note:: - Conversations are dispatched based on the current workload of the online operators. + In order to track the geographical location of visitors, :guilabel:`GeoIP` must be installed on + the database. While this feature is installed by default on *Odoo Online*, *On-Premise* databases + will require additional :doc:`setup steps + `. + +Widget +------ + +The :guilabel:`Widget` tab on the live chat channel details form provides the shortcode for an +embeddable website widget. This code can be added to a website to provide access to a live chat +window. + +The live chat widget can be added to websites created through Odoo by navigating to the +:menuselection:`Website --> Configuration --> Settings`. Then scroll to the :guilabel:`Livechat` +section, and select the channel to add to the site. Click :guilabel:`Save` to apply. + +To add the widget to a website created on a third-party platform, click the first :guilabel:`COPY` +button on the :guilabel:`Widget` tab and paste the code into the `` tag on the site. + +Likewise, to send a live chat session to a customer, click the second :guilabel:`COPY` button on the +:guilabel:`Widget` tab. This link can be sent directly to a customer, and once they click the link, +it will open a new chat. + +.. image:: livechat/widget-code.png + :align: center + :alt: View of the widget tab for Odoo Live Chat. + +Participate in a conversation +============================= + +As explained above, *operators* are the users who will respond to live chat requests from customers. +The information below outlines the necessary steps for operators participating in live chat +conversations on an Odoo database. + +Set an online chat name +----------------------- + +Before participating in a live chat, operators should update their *Online Chat Name*. This is the +name that will be displayed to site visitors in the live chat conversation. + +To update the :guilabel:`Online Chat Name`, click on the user name in the upper-right corner of any +page in the database. Select :guilabel:`My Profile` to open the Profile page. On the right side of +the :guilabel:`Preferences` tab, locate the :guilabel:`Online Chat Name` field and enter the +preferred name. -Leave or join a channel -======================= +.. image:: livechat/my-profile.png + :align: center + :alt: View of the My Profile option in Odoo. -Go to :menuselection:`Website --> Configuration --> Settings`, access your channel under -*Live Chat*, and *Join Channel* or *Leave Channel*. +If a users :guilabel:`Online Chat Name` is not set, the name displayed will default to the +:guilabel:`User Name`. -.. image:: livechat/joinchannel.png - :alt: View of a channel form and the option to join a channel for Odoo Live Chat +.. example:: + A user has their full name as their :guilabel:`User Name`, but they do not want to include their + last name in a live chat conversation. They would then set their :guilabel:`Online Chat Name` to + include only their first name. + + .. image:: livechat/online-chat-name.png + :align: center + :alt: View of user profile in Odoo, emphasizing the Online Chat name field. + +Join or leave a channel +----------------------- + +To join a live chat channel, go to the :menuselection:`Live Chat` app and click the :guilabel:`JOIN` +button on the kanban card for the appropriate channel. + +Any channel where the user is currently active will show a :guilabel:`LEAVE` button. Click this +button to disconnect from the channel. + +.. image:: livechat/leave-channel.png + :align: center + :alt: View of a channel form and the option to join a channel for Odoo Live Chat. + +.. important:: + *Operators* that do not show any activity in Odoo for more than thirty minutes will be considered + disconnected, and subsequently removed from the channel. + +Manage live chat requests +------------------------- + +When an operator is active in a channel, chat windows will open in the bottom right corner of the +screen, no matter where they are in the database. They can participate in conversations without +leaving their current location. + +.. tip:: + Conversations can also be accessed by clicking the :guilabel:`Conversations` icon in the + menu bar. + + .. image:: livechat/menu-bar.png + :align: center + :alt: View of the menu bar in Odoo emphasizing the conversations icon. + +Live chat conversations can also be viewed by navigating to :menuselection:`Dashboard --> Discuss`. +New conversations will appear in bold under the :guilabel:`LIVECHAT` heading along the left panel. + +.. image:: livechat/managing-chat-responses.png + :align: center + :alt: View of the discuss application with a message sent through live chat in Odoo. + +Click on a conversation in the left panel to select it. This will open the conversation. From this +view, an operator can participate in the chat the same as they would in the normal chat window. + +.. seealso:: + - :doc:`Get Started with Discuss ` + - :doc:`/applications/websites/livechat/responses` .. toctree:: :titlesonly: livechat/ratings livechat/responses + livechat/chatbots diff --git a/content/applications/websites/livechat/channels.png b/content/applications/websites/livechat/channels.png deleted file mode 100644 index 20cafc96ec..0000000000 Binary files a/content/applications/websites/livechat/channels.png and /dev/null differ diff --git a/content/applications/websites/livechat/chat-button.png b/content/applications/websites/livechat/chat-button.png new file mode 100644 index 0000000000..6580103bd5 Binary files /dev/null and b/content/applications/websites/livechat/chat-button.png differ diff --git a/content/applications/websites/livechat/chat-window.png b/content/applications/websites/livechat/chat-window.png new file mode 100644 index 0000000000..7de39c2a65 Binary files /dev/null and b/content/applications/websites/livechat/chat-window.png differ diff --git a/content/applications/websites/livechat/chatbots.rst b/content/applications/websites/livechat/chatbots.rst new file mode 100644 index 0000000000..f5f9bc62d0 --- /dev/null +++ b/content/applications/websites/livechat/chatbots.rst @@ -0,0 +1,241 @@ +======== +Chatbots +======== + +A *Chatbot* is a program designed to mimic a conversation with a live human. Chatbots are assigned a +script of pre-written steps to follow. The scripts are designed to anticipate a visitor's potential +response, and lead them through a series of questions and answers the same way a live team member +would. + +Chatbots can be customized to fill various roles, from customer support, to creating leads, to +collecting contact information. The goal of the chatbot depends on the page of the website they are +assigned, and the messages included in the script, among other criteria. + +.. image:: chatbots/chatbot-visitor-view.png + :align: center + :alt: View of the chat window with a helpdesk ticket created in Odoo Live Chat. + +Build a chatbot +=============== + +Before creating a new chatbot, the *Live Chat* application must first be installed on the database. +This can be done directly from the :menuselection:`Apps` menu by searching for `Live Chat` in the +:guilabel:`search bar` and clicking :guilabel:`Install`. + +Alternatively, *Live Chat* can be installed and enabled by navigating to the :menuselection:`Website +application --> Configuration --> Settings`, and checking the box labeled :guilabel:`Livechat`. Once +enabled, the database will refresh, and the *Live Chat* application is accessible. + +Once the *Live Chat* application has been installed on the database, open it, and go to +:menuselection:`Configuration --> Chatbots`. + +.. note:: + When the *Live Chat* app is installed, a sample chatbot is created, named *Welcome Bot*. This + chatbot has a pre-configured script that walks through a few basic steps, including asking for a + visitor's email address, and forwarding the conversation to an operator. + + *Welcome Bot* can be used as a starting point. The existing steps can be edited or removed, and + new steps can be added to customize the script, as needed. + + *Welcome Bot* can be deleted (or archived). + + .. image:: chatbots/chatbot-welcome-bot.png + :align: center + :alt: View of the Welcome Bot script in Odoo Live Chat. + +To create a new chatbot, navigate to the :guilabel:`Chatbot` page (:menuselection:`Live Chat app --> +Configuration --> Chatbots`) and click :guilabel:`New`. This opens a blank chatbot details page. + +On the blank chatbot details page, enter a name in the :guilabel:`Chatbot Name` field and click on +the :guilabel:`Edit Image` icon in the upper right corner of the form to add a photo. + +Chatbot scripts +--------------- + +Once the new chatbot has been created and named, the next step is to create a script. Chatbot +conversations follow an accompanying script. These scripts are comprised of lines of dialogue, each +designed to either deliver or capture information. + +To create a chatbot script, navigate to the :guilabel:`Script` tab of the chatbot details page, and +click :guilabel:`Add a Line` to open the :guilabel:`Create Script Steps` pop-up form. + +This form must be filled out for each line of text (dialogue) that the chatbot could potentially +deliver during the conversation. + +First, enter the content of the message in the :guilabel:`Message` field. Then, select an option +from the :guilabel:`Step Types` drop-down menu. + +Step types +~~~~~~~~~~ + +The :guilabel:`Step Type` selected depends on the intended purpose of the message. The available +options in the :guilabel:`Step Type` drop-down are listed below, as well as their use, and any +additional information: + +Text +**** + +This step is used for messages where no answer is expected (or necessary). Text steps can be used +for greetings and/or to deliver information. + +.. important:: + Text step types are only intended to deliver information, and do not allow for any visitor input. + As such, they need to be followed by additional steps to continue the conversation. + +Question +******** + +This step asks a question and provides a set of answers. The visitor clicks on one answer, which +either leads to a new step in the conversation, or can lead to an optional link to a new webpage. + +.. tip:: + It is helpful to add a catchall answer to question steps (ex: "Something else"). This helps + visitors continue the conversation, even if their needs don't exactly fit with any of the other + answers. + +Email +***** + +This step prompts visitors to provide their email address, which is stored and can be used by team +members later to follow up with additional information. + +The only accepted inputs for this step type are email addresses that are in a valid format. If a +visitor attempts to enter anything other than a valid email address, the chatbot responds with a +message stating it does not recognize the information submitted. + +.. image:: chatbots/chatbot-invalid-email.png + :align: center + :alt: View of a chatbot responding to an invalid email. + +Phone +***** + +Similar to email, this step type prompts the visitor to enter their phone number, which can be used +at a later time to follow up with additional information, or to schedule demos, and more. + +.. warning:: + Due to the vast number of formats used for phone numbers worldwide, responses to this step type + are **not** validated for formatting. + +Forward to Operator +******************* + +This step forwards the conversation to an active live chat operator, so that they can continue +assisting the visitor. As the conversation transcript is passed on to the operator they are able to +pick up where the chatbot left off. This not only saves time for all parties involved, it can also +help qualify conversations before they reach live human operators. + +.. note:: + If no active operator is available on the channel, the chatbot continues the conversation with + the visitor. Therefore, additional steps should be added after this one to ensure that there is + no abrupt end to the conversation. + + .. image:: chatbots/chatbot-no-operator.png + :align: center + :alt: View of a chatbot follow up messages when no live chat operator is available. + +Free Input/Multi-Line +********************* + +The free input step allows visitors to respond to questions without providing pre-written responses. +Information provided in these responses is stored in the chat transcripts. + +Choose between :guilabel:`Free Input` and :guilabel:`Free Input (Multi-Line)` depending on the type +and amount of information being requested from the visitor. + +Create Lead +*********** + +This step creates a lead in the *CRM* application. Select an option from the :guilabel:`Sales Team` +drop-down to assign the created lead to a specific team. + +Create Ticket +************* + +This step creates a :doc:`ticket ` in +the *Helpdesk* application. Select an option from the :guilabel:`Helpdesk Team` drop-down to assign +the created ticket to a specific team. + +Only if +~~~~~~~ + +Chatbot scripts operate on an if/then basis, which means the next question presented to the visitor +is determined by the answer they provide to the previous question. + +To continue the progression of the conversation, the form for a new step contains a field labeled +:guilabel:`Only If`. This field is where the progression of questions is defined. + +If a step is intended to follow all of the previous messages, this field can be left empty. However, +if a message should **only** be sent conditionally, based on a previous response (or several +previous responses), those responses need to be added to this field. + +.. important:: + If there are any selections made in the :guilabel:`Only If` field, the step will **not** be shown + in a conversation unless **all** of the answers have been selected. Only include selections in + this field if they are necessary for this step to be displayed. + +.. example:: + In the *Welcome Bot* script, a visitor can ask about pricing information. If the visitor selects + this response, a step is included to forward the conversation to an operator. The chatbot first + sends a message informing the visitor that it is checking to see if an operator is available to + chat. + + However, this message should **only** be delivered if the visitor requests pricing information. + In that situation, the conversation would proceed as below: + + - Welcome Bot: "*What are you looking for?*" + - Visitor: "**I have a pricing question.**" + - Welcome Bot: "*Hmmm, let me check if I can find someone that could help you with that...*" + + In the details form for the :guilabel:`Text` step, the *I have a pricing question* response has + been selected in the :guilabel:`Only If` field. As such, this step is **only** shown in + conversations where that response has been selected. + + .. image:: chatbots/chatbot-only-if.png + :align: center + :alt: View of the new message form emphasizing the Only If field. + +Script testing +-------------- + +In order to ensure all visitors have a satisfactory experience with the chatbot, each message needs +to lead to a natural conclusion. Chatbot scripts should be tested to confirm there are no dead-ends, +and to get an understanding of what the visitor sees when they interact with the chatbot. + +.. important:: + If there is an answer or input provided by the visitor that is **not** assigned a corresponding + follow-up response, the conversation stops (*dead-end*). Since the visitor cannot re-engage the + chatbot, they will have to re-start the conversation, by refreshing the chat window, or their + browser. + +To test the performance of a chatbot, first click on the :guilabel:`Test` button at the top-left of +the chatbot script page. Then, upon being redirected to the testing screen, answer the chatbot +prompts the same way a potential site visitor would. + +When the script has reached an end-point, the message *Conversation ended...Restart* appears at the +bottom of the chat window. To begin the conversation at the beginning of the script, click on +:guilabel:`Restart`. To return to the script page, click :guilabel:`Back to edit mode` at the top of +the page. + +Add chatbot to a channel +======================== + +After a chatbot has been created and tested, it needs to be added to a live chat channel. + +First, open the :menuselection:`Live Chat` application, and select the kanban card for a +:guilabel:`Channel`, or create a :doc:`new one `. Click on the +:guilabel:`Channel Rules` tab. Then, open an existing rule, or create a new one by clicking +:guilabel:`Add a line`. + +On the :guilabel:`Create Rules` pop-up detail form, choose the appropriate chatbot in the +:guilabel:`Chatbot` field. + +If the chatbot should **only** be active if there are no available live chat operators, check the +box labeled :guilabel:`Enabled only if no operator`. + +.. image:: chatbots/chatbot-add-to-channel.png + :align: center + :alt: View of the channel rules emphasizing the chatbot field. + +.. seealso:: + :doc:`Live chat channel rules ` diff --git a/content/applications/websites/livechat/chatbots/chatbot-add-to-channel.png b/content/applications/websites/livechat/chatbots/chatbot-add-to-channel.png new file mode 100644 index 0000000000..748fc642a2 Binary files /dev/null and b/content/applications/websites/livechat/chatbots/chatbot-add-to-channel.png differ diff --git a/content/applications/websites/livechat/chatbots/chatbot-invalid-email.png b/content/applications/websites/livechat/chatbots/chatbot-invalid-email.png new file mode 100644 index 0000000000..9a1e1dc98a Binary files /dev/null and b/content/applications/websites/livechat/chatbots/chatbot-invalid-email.png differ diff --git a/content/applications/websites/livechat/chatbots/chatbot-no-operator.png b/content/applications/websites/livechat/chatbots/chatbot-no-operator.png new file mode 100644 index 0000000000..e1d828a434 Binary files /dev/null and b/content/applications/websites/livechat/chatbots/chatbot-no-operator.png differ diff --git a/content/applications/websites/livechat/chatbots/chatbot-only-if.png b/content/applications/websites/livechat/chatbots/chatbot-only-if.png new file mode 100644 index 0000000000..64fd338039 Binary files /dev/null and b/content/applications/websites/livechat/chatbots/chatbot-only-if.png differ diff --git a/content/applications/websites/livechat/chatbots/chatbot-visitor-view.png b/content/applications/websites/livechat/chatbots/chatbot-visitor-view.png new file mode 100644 index 0000000000..3a9e8091b4 Binary files /dev/null and b/content/applications/websites/livechat/chatbots/chatbot-visitor-view.png differ diff --git a/content/applications/websites/livechat/chatbots/chatbot-welcome-bot.png b/content/applications/websites/livechat/chatbots/chatbot-welcome-bot.png new file mode 100644 index 0000000000..9c261cf09e Binary files /dev/null and b/content/applications/websites/livechat/chatbots/chatbot-welcome-bot.png differ diff --git a/content/applications/websites/livechat/create-rules.png b/content/applications/websites/livechat/create-rules.png new file mode 100644 index 0000000000..19a1dcae99 Binary files /dev/null and b/content/applications/websites/livechat/create-rules.png differ diff --git a/content/applications/websites/livechat/discuss.png b/content/applications/websites/livechat/discuss.png deleted file mode 100644 index e7998d9312..0000000000 Binary files a/content/applications/websites/livechat/discuss.png and /dev/null differ diff --git a/content/applications/websites/livechat/enable-setting.png b/content/applications/websites/livechat/enable-setting.png new file mode 100644 index 0000000000..32213f60b2 Binary files /dev/null and b/content/applications/websites/livechat/enable-setting.png differ diff --git a/content/applications/websites/livechat/joinchannel.png b/content/applications/websites/livechat/joinchannel.png deleted file mode 100644 index 052bcf0249..0000000000 Binary files a/content/applications/websites/livechat/joinchannel.png and /dev/null differ diff --git a/content/applications/websites/livechat/leave-channel.png b/content/applications/websites/livechat/leave-channel.png new file mode 100644 index 0000000000..5ff3325be9 Binary files /dev/null and b/content/applications/websites/livechat/leave-channel.png differ diff --git a/content/applications/websites/livechat/livechat_settings.png b/content/applications/websites/livechat/livechat_settings.png deleted file mode 100644 index 80817e5230..0000000000 Binary files a/content/applications/websites/livechat/livechat_settings.png and /dev/null differ diff --git a/content/applications/websites/livechat/managing-chat-responses.png b/content/applications/websites/livechat/managing-chat-responses.png new file mode 100644 index 0000000000..63b25d3d9c Binary files /dev/null and b/content/applications/websites/livechat/managing-chat-responses.png differ diff --git a/content/applications/websites/livechat/menu-bar.png b/content/applications/websites/livechat/menu-bar.png new file mode 100644 index 0000000000..44b2dcf9de Binary files /dev/null and b/content/applications/websites/livechat/menu-bar.png differ diff --git a/content/applications/websites/livechat/my-profile.png b/content/applications/websites/livechat/my-profile.png new file mode 100644 index 0000000000..f25eb21356 Binary files /dev/null and b/content/applications/websites/livechat/my-profile.png differ diff --git a/content/applications/websites/livechat/online-chat-name.png b/content/applications/websites/livechat/online-chat-name.png new file mode 100644 index 0000000000..2818f1d8a0 Binary files /dev/null and b/content/applications/websites/livechat/online-chat-name.png differ diff --git a/content/applications/websites/livechat/open-channel.png b/content/applications/websites/livechat/open-channel.png new file mode 100644 index 0000000000..7f852d806d Binary files /dev/null and b/content/applications/websites/livechat/open-channel.png differ diff --git a/content/applications/websites/livechat/pop-up.png b/content/applications/websites/livechat/pop-up.png new file mode 100644 index 0000000000..a644b1567f Binary files /dev/null and b/content/applications/websites/livechat/pop-up.png differ diff --git a/content/applications/websites/livechat/responses.rst b/content/applications/websites/livechat/responses.rst index 045c915d92..be4ccec8c4 100644 --- a/content/applications/websites/livechat/responses.rst +++ b/content/applications/websites/livechat/responses.rst @@ -1,48 +1,203 @@ ============================= -Commands and Canned Responses +Commands and canned responses ============================= -Using canned responses can help you save time and have a previous, well-thought response, to some -of your most common questions and comments. +In the Odoo *Live Chat* application, *commands* allow the user to perform specific actions both +inside the chat window, and through other Odoo applications. The *Live Chat* app also includes +*canned responses*. These are customized, pre-configured substitutions that allow users to replace +shortcut entries in place of longer, well-thought out responses to some of the most common questions +and comments. -Use commands -============ +Both commands and canned responses save time, and allow users to maintain a level of consistency +throughout their conversations. -Commands are shortcuts that do specific actions within the chat window: +Execute a command +================= -#. **/help**: shows a help message. -#. **/helpdesk**: creates a helpdesk ticket. -#. **/helpdesk_search**: searches for a helpdesk ticket. -#. **/history**: shows the last 15 visited pages. -#. **/lead**: creates a new lead. -#. **/leave**: leaves the channel. +Live chat *commands* are keywords that trigger pre-configured actions. When a live chat *operator* +is participating in a conversation with a customer or website visitor, they can execute a command by +typing `/`, followed by the command. + +Commands, and the resulting actions, are only visible in the conversation window for the live chat +operator. A customer will not see any commands that an operator uses in a conversation from their +view of the chat. + +.. image:: responses/responses-ticket-link.png + :align: center + :alt: View of the chat window with a helpdesk ticket created in Odoo Live Chat. + +More information about each available command can be found below. + +Help +---- + +If an operator types `/help` in the chat window, an informative message that includes the potential +entry types an operator can make is displayed. + +- Type `@username` to mention a user in the conversation. A notification will be sent to that user's + inbox or email, depending on their notification settings. +- Type `#channel` to mention a *Discuss* channel. +- Type `/command` to execute a command. +- Type `:shortcut` to insert a :ref:`canned response `. + +.. image:: responses/responses-help.png + :align: center + :alt: View of the message generated from using the /help command in Odoo Live Chat. + +.. seealso:: + - :doc:`/applications/productivity/discuss/overview/get_started` + - :doc:`/applications/productivity/discuss/overview/team_communication` + +Helpdesk & Helpdesk search +-------------------------- + +The `/helpdesk` and `/helpdesk_search` commands allow operators to both create helpdesk tickets +directly from a conversation, and search through existing tickets by keyword or ticket number. .. important:: - | - For *helpdesk tickets*: make sure the application is installed on your database and the - option *Live Chat* under :menuselection:`Helpdesk --> Configuration --> Helpdesk Teams` - is enabled. - | - For *leads*: the *CRM* application must be installed on your database. + The `/helpdesk` and `/helpdesk_search` commands can only be used if the *Helpdesk* app has been + installed, and *Live Chat* has been activated on a *Helpdesk* team. To activate :guilabel:`Live + Chat`, go to :menuselection:`Helpdesk application --> Configuration --> Teams`, and select a + team. Scroll to the :guilabel:`Channels` section and check the box labeled :guilabel:`Live Chat`. + +Create a ticket from a live chat +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -To access the ticket or lead created from the chat, click on the shortcut link. +If an operator types `/helpdesk` in the chat window, the conversation is used to create a *Helpdesk* +ticket. -.. image:: responses/create_ticket.png +.. important:: + In version 16.3, the command to create a new ticket is `/ticket`. This only applies to databases + running version 16.3. + +After entering the `/helpdesk` command, type a title for the ticket into the chat window, then press +`Enter`. + +.. image:: responses/helpdesk.png :align: center - :alt: View of the chat window with a helpdesk ticket created in Odoo Live Chat + :alt: View of the results from a helpdesk search in a Live Chat conversation. -.. tip:: - Helpdesk tickets created from the chat automatically add the conversation as a description of - the ticket. The same goes for the creation of a lead. +The newly created ticket will be added to the *Helpdesk* team that has live chat enabled. If more +than one team has live chat enabled, the ticket will automatically be assigned based on the team's +priority. + +The transcript from the conversation will be added to the new ticket, under the +:guilabel:`Description` tab. + +To access the new ticket, click on the link in the chat window, or go to the +:menuselection:`Helpdesk app` and click the :guilabel:`Tickets` button on the kanban card for the +appropriate team. + +Search for a ticket from a live chat +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If an operator types `/helpdesk_search` in the chat window, they can search through *Helpdesk* +tickets by ticket number or keyword. -Send canned responses -===================== +.. important:: + In version 16.3, the command to search through *Helpdesk* tickets is `/search_tickets`. This only + applies to databases running version 16.3. -| Canned responses allow you to have a full piece of text being placed when you type a shortcut word. - To create them, go to :menuselection:`Live Chat --> Configuration --> Canned Responses`. -| To use them during a conversation, simply type **:** followed by the shortcut word you created. +After entering the `/helpdesk_search` command, type a keyword or ticket number, then press `Enter`. +If one or more related tickets are found, a list of links will be generated in the conversation +window. -.. image:: responses/canned_response.png +.. image:: responses/helpdesk-search.png :align: center - :alt: View of a chat window and the use of a canned response in Odoo Live Chat + :alt: View of the results from a helpdesk search in a Live Chat conversation. + +.. note:: + Results from the search command will only be seen by the operator, not the customer. + +History +------- + +If an operator types `/history` in the chat window, it will generate a list of the most recent pages +the visitor has viewed on the website (up to 15). + +.. image:: responses/responses-history.png + :align: center + :alt: View of the results from a /history command in a Live Chat conversation. + +Lead +---- + +By typing `/lead` in the chat window, an operator can create a *lead* in the *CRM* application. + +.. image:: responses/responses-lead.png + :align: center + :alt: View of the results from a /lead command in a Live Chat conversation. + +.. important:: + The `/lead` command can only be used if the *CRM* app has been installed. + +After typing `/lead`, create a title for this new lead, then press `Enter`. A link with the lead +title appears. Click the link, or navigate to the :menuselection:`CRM` app to view the +:guilabel:`Pipeline`. + +.. note:: + The link to the new lead can only be seen and accessed by the operator, not the customer. + +The transcript of that specific live chat conversation (where the lead was created) is added to the +:guilabel:`Internal Notes` tab of the lead form. + +On the :guilabel:`Extra Information` tab of the lead form, the :guilabel:`Source` will be listed as +:guilabel:`Livechat`. + +Leave +----- + +If an operator types `/leave` in the chat window, they can automatically exit the conversation. This +command does not cause the customer to be removed from the conversation, nor does it automatically +end the conversation. .. seealso:: - - :doc:`ratings` + - :doc:`/applications/sales/crm/acquire_leads` + - :doc:`/applications/services/helpdesk/overview/getting_started` + +.. _live-chat/canned-responses: + +Canned responses +================ + +*Canned responses* are customizable inputs where a *shortcut* stands in for a longer response. An +operator will enter the shortcut, and it will automatically be replaced by the expanded +*substitution* response in the conversation. + +Create canned responses +----------------------- + +To create a new canned response, go to :menuselection:`Live Chat app --> Configuration --> Canned +Responses --> New`. + +From here, type the shortcut command into the :guilabel:`Shortcut` field. + +Then, click into the :guilabel:`Substitution` field, and enter the custom message that will be sent +to visitors in place of the shortcut. Click :guilabel:`Save`. + +.. tip:: + Try to connect the shortcut to the topic of the substitution. The easier it is for the operators + to remember, the easier it will be to use the canned responses in conversations. + +Use canned responses in a live chat conversation +------------------------------------------------ + +To use a canned response during a live chat conversation, type a colon (`:`) into the chat window, +followed by the shortcut. + +.. example:: + An operator is chatting with a visitor. As soon as they type `:` they would see a list of + available responses. They can manually select one from the list, or continue to type. If they + want to use the canned response `'I am sorry to hear that.'`, they would type `:sorry`. + +.. image:: responses/canned-responses.png + :align: center + :alt: View of a chat window and the use of a canned response in Odoo Live Chat. + +.. tip:: + Typing `:` into a chat window on its own will generate a list of available canned responses. + Responses can be manually selected from the list, in addition to the use of shortcuts. + + .. image:: responses/response-list.png + :align: center + :alt: View of a chat window and the list of available canned responses. diff --git a/content/applications/websites/livechat/responses/canned-responses.png b/content/applications/websites/livechat/responses/canned-responses.png new file mode 100644 index 0000000000..7923bef648 Binary files /dev/null and b/content/applications/websites/livechat/responses/canned-responses.png differ diff --git a/content/applications/websites/livechat/responses/helpdesk-search.png b/content/applications/websites/livechat/responses/helpdesk-search.png new file mode 100644 index 0000000000..00cddd649b Binary files /dev/null and b/content/applications/websites/livechat/responses/helpdesk-search.png differ diff --git a/content/applications/websites/livechat/responses/helpdesk.png b/content/applications/websites/livechat/responses/helpdesk.png new file mode 100644 index 0000000000..43c535c1f1 Binary files /dev/null and b/content/applications/websites/livechat/responses/helpdesk.png differ diff --git a/content/applications/websites/livechat/responses/response-list.png b/content/applications/websites/livechat/responses/response-list.png new file mode 100644 index 0000000000..45731f8a65 Binary files /dev/null and b/content/applications/websites/livechat/responses/response-list.png differ diff --git a/content/applications/websites/livechat/responses/responses-help.png b/content/applications/websites/livechat/responses/responses-help.png new file mode 100644 index 0000000000..f2958bc1a2 Binary files /dev/null and b/content/applications/websites/livechat/responses/responses-help.png differ diff --git a/content/applications/websites/livechat/responses/responses-history.png b/content/applications/websites/livechat/responses/responses-history.png new file mode 100644 index 0000000000..99eb3a48c7 Binary files /dev/null and b/content/applications/websites/livechat/responses/responses-history.png differ diff --git a/content/applications/websites/livechat/responses/responses-lead.png b/content/applications/websites/livechat/responses/responses-lead.png new file mode 100644 index 0000000000..3fbc1799a9 Binary files /dev/null and b/content/applications/websites/livechat/responses/responses-lead.png differ diff --git a/content/applications/websites/livechat/responses/responses-ticket-link.png b/content/applications/websites/livechat/responses/responses-ticket-link.png new file mode 100644 index 0000000000..39180205b3 Binary files /dev/null and b/content/applications/websites/livechat/responses/responses-ticket-link.png differ diff --git a/content/applications/websites/livechat/rules.png b/content/applications/websites/livechat/rules.png deleted file mode 100644 index e91e3579b0..0000000000 Binary files a/content/applications/websites/livechat/rules.png and /dev/null differ diff --git a/content/applications/websites/livechat/widget-code.png b/content/applications/websites/livechat/widget-code.png new file mode 100644 index 0000000000..90d6d459b8 Binary files /dev/null and b/content/applications/websites/livechat/widget-code.png differ diff --git a/content/applications/websites/livechat/widget.png b/content/applications/websites/livechat/widget.png deleted file mode 100644 index dd2ea28344..0000000000 Binary files a/content/applications/websites/livechat/widget.png and /dev/null differ diff --git a/content/applications/websites/website/configuration.rst b/content/applications/websites/website/configuration.rst index 455be2a81a..21a77b3f3e 100644 --- a/content/applications/websites/website/configuration.rst +++ b/content/applications/websites/website/configuration.rst @@ -11,4 +11,5 @@ Configuration configuration/translate configuration/multi_website configuration/unsplash + configuration/spam_protection configuration/on-premise_geo-ip-installation diff --git a/content/applications/websites/website/configuration/multi_website.rst b/content/applications/websites/website/configuration/multi_website.rst index d741cc59a8..696cdc7698 100644 --- a/content/applications/websites/website/configuration/multi_website.rst +++ b/content/applications/websites/website/configuration/multi_website.rst @@ -2,316 +2,164 @@ Multiple websites ================= -.. image:: multi_website/multi_website04.png - :align: center +Odoo allows you to create multiple websites from the same database. This can be useful, for example, +if you have multiple brands operating under your organization, or to create separate websites for +different products/services, or different audiences. In these cases, having different websites can +help avoid confusion and make it easier to tailor your digital outreach strategies and reach your +target audience. + +Each website can be designed and configured independently with its own :doc:`domain name +`, theme, pages, +menus, :doc:`languages `, :doc:`products <../../ecommerce/managing_products/products>`, +assigned sales team, etc. They can also :ref:`share content and pages +`. -Odoo’s Multi-Websites opens up broad possibilities of diversification and -customer segmentation for your business. A multiplied audience and -boosted revenue are now just a few clicks away! - -Each website can work in a fully independent way, with its theme, -branding, domain name, header & footer, pages, languages, products, blog -posts, forum, slides, events, live chat channels, etc. Let’s go for a -tour! - -Setup -===== - -To create a new website, go to :menuselection:`Website --> Configuration --> Settings`. -The button, *Create a new website*, lays in the first section. - - - -.. image:: multi_website/multi_website05.png - :align: center +.. tip:: + Duplicate content (i.e., pages and content shared between multiple websites) can have a negative + impact on :doc:`../pages/seo`. -In the upcoming prompt, set a name for your new website and a specific -domain name. Leave empty to publish the new website under the default -domain of your Odoo database. You can later set some country groups to -redirect visitors to it using Geo IP. +Website creation +================ -.. image:: multi_website/multi_website01.png - :align: center +To create a new website, proceed as follows: -Then, select a theme. This new website might have an entirely different -purpose or audience than the first one. So feel free to go for a -different theme! +#. Go to :menuselection:`Website --> Configuration --> Settings`. +#. Click :guilabel:`+ New Website`. -Once the theme is selected, you can start to build the homepage of your -website. Follow the purple drops; they will help you in the first steps. + .. image:: multi_website/create-website.png + :alt: New website button -.. image:: multi_website/multi_website08.png - :align: center +#. Specify the :guilabel:`Website Name` and :guilabel:`Website domain`. Each website must be + published under its own :doc:`domain `. +#. Adapt the :guilabel:`Company name`, :guilabel:`Languages` and :guilabel:`Default language` + if needed. +#. Click the :guilabel:`Create` button. +You can then start building your new website. .. note:: - If you run Odoo Online, don’t forget to redirect any new domain name to your Odoo database - (``CNAME``) and to authorize it Odoo-side. See :ref:`domain-name/existing`. - -Create the menu -=============== + By default, all website-related apps that you have installed (e.g. **eCommerce**, + **Forum**, **Blog**, etc.) and their related website pages are also available on the + new website. You can remove them by amending the website's menu. -The new website has a default menu with all the installed applications. -To edit it, click :menuselection:`Pages --> Edit Menu`. Moving forward you only edit -the menu of the current website. +Switching websites +================== -Switch from one website to another -================================== +To switch from one website to another, click the menu next to the :guilabel:`+New` button in the +top right corner and select the website you want to switch to. - -As easy as ABC! There is a website switcher in the right corner of the -edit bar. Switching to another website will connect to the domain of -this website. If you use another domain for the website, the user is -requested to sign in. - -.. image:: multi_website/multi_website03.png - :align: center +.. image:: multi_website/switch-websites.png + :alt: Website selector .. note:: - When switching, you are redirected to the same domain path on the other website - (e.g., ``/shop/myproduct``). If this URL is not used, you will be redirected to a 404 page but - prompted to create a new page from there. - -Add features -============ - -The website apps you install (e.g., Slides, Blogs) are made available on -all your websites. You can, of course, keep them hidden in one website by -removing the menu item. - -Each website comes with a high range of specific options in the -settings. First, select the website to configure. - -.. image:: multi_website/multi_website15.png - :align: center - -Then, take a look at the options flagged with the earth icon. It means -they only impact the very website you are working on. - -.. image:: multi_website/multi_website12.png - :align: center + When you switch websites, you are redirected to the other website, to the same page (URL) as the + current one. If the page you are currently viewing does not exist on the other website, you are + redirected to a 404 error page. Once redirected, click :guilabel:`Create page` to create the + page. -You can, for instance, set specific : + .. image:: multi_website/404-create-page.png + :alt: Create a page from a 404 error page -- languages, +Website-specific configuration +============================== -- domain names, - -- social media links, - -- customer portal mode (B2C vs. B2B), - -- dedicated live chat channels, - -- etc. - -The other options are global and apply to all your websites. - -Manage domain names -=================== - -As said earlier, your websites can either share the same domain name or -use a specific one. If you share it and want to adapt the content per -region, set country groups in the setting of each website. Visitors will -be redirected to the right website using GeoIP. - -.. image:: multi_website/multi_website18.png - :align: center +Most website settings are website-specific, which means they can be enabled/disabled per website. To +adapt the settings for a website, go to :menuselection:`Website --> Configuration --> Settings`. +Select the desired website in the field :guilabel:`Settings of Website` at the top of the +:guilabel:`Settings` page, in the **yellow** banner. Then, adapt the options for that specific +website. .. note:: - Geo IP is installed by default in Odoo Online. If you run Odoo - on-premise, don’t forget to install *GeoIP* library. - See :doc:`on-premise_geo-ip-installation` + - Websites are created with the default settings; the settings are not copied from one website to + the other. + - In a :doc:`multi-company environment <../../../general/users/companies>`, each website can be + linked to a specific company in your database so that only company-related data (e.g., + products, jobs, events, etc.) is displayed on the website. To display company-specific data, + set the desired company in the :guilabel:`Company` field. -.. seealso:: - - :doc:`/administration/maintain/domain_names` +.. _multi-website/website_content: -If you setup an extra website and specify the domain name you will have to -do three things to get this feature to work: +Content availability +-------------------- -#. Setup an A-record in the DNS configuration of your hosting provider so - that "www.mywebsite2.ext" is redirected to the IP of your Odoo instance. -#. Create an extra Nginx ``server`` block in which you set the - ``server_name`` that you've set in the :guilabel:`Website domain` field. -#. Reload and restart your Nginx instance to use the new ``server`` block. +By default, pages, products, events, etc. created from the frontend (using the +:guilabel:`+New` button) are only available on the website from which it was created. Records +created from the backend, however, are made available on all websites by default. The content's +availability can be changed in the backend, in the :guilabel:`Website` field. For example, for +products, go to :menuselection:`eCommerce --> Products`, then select the product and go to the +:guilabel:`Sales` tab. For forums, go to :menuselection:`Configuration --> Forums`, then select the +forum. -Customize the visitor experience -================================ +.. image:: multi_website/forum-multi-website.png + :alt: Website field in Forum form +.. _website_field: -The customer experience can be customized very profoundly thanks to the menu -\*Customize\*. All the visual options available there are specific to -each website. Go through the different pages to adapt them to this new -audience. Focus on workflows, and automatic pages (eCommerce checkout, -blogs, events, etc.) as the number of available options is higher there. +Records and features can be made available: -.. image:: multi_website/multi_website14.png - :align: center +- On all websites: leave the :guilabel:`Website` field empty; +- Only on one website: set the :guilabel:`Website` field accordingly; +- On some websites: in this case, you should duplicate the item and set the :guilabel:`Website` + field. -Publish specific content per website ------------------------------------- +Website pages +~~~~~~~~~~~~~ +To modify the website on which a page is to be published, proceed as follows: -Like static pages, any content created from the front-end (product, blog -post, etc.) is always only published in the current website. You can -change that from the edit form view in the backend and leave the -*Website* field blank. This will publish it in all the websites. +#. Go to :menuselection:`Website --> Site --> Pages`. +#. Open the search panel and select the website on which the page is currently published. -.. image:: multi_website/multi_website06.png - :align: center + .. image:: multi_website/pages-switch-websites.png + :alt: Display pages per website -Here are all the objects that you can link to *either one or all the -websites*: - -1. Products - -2. Product Categories for eCommerce - -3. Blogs - -4. Slide Channels - -5. Forums - -6. Events - -7. Job Positions +#. Tick the check box next to the page(s) you want to change. +#. Click the :guilabel:`Website` field and select the website, or empty it to publish the page on + all websites. .. note:: - When you create the record from the backend and publish it, - typically a product or an event, it is made available in all websites. - -Publish a page in all websites ------------------------------- + Each website must have its own homepage; you may not use the same homepage for several websites. -A new static page is created and only made available in the current -website. You can duplicate it to other websites from -:menuselection:`Website --> Configuration --> Pages`. To do so, leave the *Website* field empty. +eCommerce features +================== -If you want to duplicate it in just one other website, duplicate the -page and set the new website. - -.. image:: multi_website/multi_website09.png - :align: center - -When you edit the page again, the change only affects the current -website. A new page is duplicated and tied up to the website. -The original page still being linked to all websites. - -.. tip:: - By grouping pages by URL in the page manager, you quickly find - the original page behind each edited page. - -.. image:: multi_website/multi_website10.png - :align: center - -Multi-companies -=============== - -Each website can be linked to a specific company of your system, in a -multi-companies environment. - -.. image:: multi_website/multi_website16.png - :align: center - -With such a configuration, only company-related data appear on the -website (products, jobs, events, etc.). - -Website editors can only view and edit the pages of the records they -have access to, typically the ones belonging to their current company -(and to their subsidiaries, or child companies in Odoo language). And so -is it for visitors. - -.. note:: - If websites are multi-companies, you don’t change company when switching websites. To change the company and see the related content, use the company selector in the menu. - -.. image:: multi_website/multi_website02.png - :align: center - -Configure your eCommerce website -================================ - -eCommerce is a crucial feature in the multi-websites environment. We made it -so that the entire flow can be customized to fit the very audience of -each website. - -Products only available on one website --------------------------------------- - -We already saw earlier how to publish a specific record in only one -website. You will find the \*Website\* field in the eCommerce tab of the -product edit form. Empty means available in all websites. - -.. image:: multi_website/multi_website13.png - :align: center - -Products available on *some* websites -------------------------------------- - -To make a product available on some websites, but not all of them, you -should duplicate the product for each website. - -If you need a unique reference to manage in your inventory, you should -install *Manufacturing\ and create *Kits* BoMs (bills of materials). -Each kit will link each published “virtual” product to the main -reference managed in your inventory. That way, any item sold from your -website will be converted into the storable item in the delivery order. - -Pricelists ----------- - -To manage specific prices by websites, you can activate *Multiple Sales -Prices per Product* in Website settings. - -Then, go to :menuselection:`Website --> Products --> Pricelists` to create additional pricelists. -You can also choose to have a pricelist available *only* on a specific website. - -.. seealso:: - :doc:`../../ecommerce/managing_products/price_management`. - -.. image:: multi_website/multi_website07.png - :align: center - -Leaving the field empty means that you make it work in all websites if -*Selectable* is selected. Otherwise, it makes it only available for -backend operations of Sales and Point of Sale applications. - -Payment Providers and Delivery Methods --------------------------------------- - -By default, published payment providers and delivery methods are deployed in all websites. -You could already use specific payment providers per country using Geo -IP by defining countries in their configuration. Now you can also do it -per website by filling in the *Website* field. +eCommerce features such as products, eCommerce categories, pricelists, discounts, payment providers, +etc. can be restricted to :ref:`a specific website `. Customer accounts ----------------- -There is a setting to choose how to manage customer accounts in Website -settings. You can either allow customers to use one account through all -the websites or compel them to create one account for each website. This -last option is convenient if your websites shouldn’t be related to each -other in the visitor mind. +You can :doc:`allow your customers to use the same account +<../../ecommerce/ecommerce_management/customer_accounts>` on all of your websites by enabling the +:guilabel:`Shared Customer Accounts` check box in the website settings. + +Pricing +------- + +Products can be priced differently based on the website using :ref:`pricelists +`. The following configuration is required: -.. image:: multi_website/multi_website17.png - :align: center +#. Go to :menuselection:`Website --> Configuration --> Settings`. +#. Scroll down to the :guilabel:`Shop - Products` section and select the :guilabel:`Pricelists` + option :guilabel:`Multiple prices per product`. +#. Click :guilabel:`Pricelists` to define new pricelists or edit existing ones. +#. Select the pricelist or click :guilabel:`New` to create a new one, then select the + :guilabel:`Configuration` tab and set the :guilabel:`Website` field. -Technical hints for customization -================================= +Reporting +========= -If you want to publish custom objects on the website, here are a few -tips to make it work with multi websites: +Analytics +--------- -- Sitemap: don’t forget the domain in the route to only publish - available records in each website’s sitemap. +Each website has its own :doc:`analytics <../reporting/plausible>`. To switch between websites, +click the buttons in the upper right corner. -- Access: you should call the method - *can_access_from_current_website* in the controller to make - sure the visitor can see a record in the current website. +.. image:: multi_website/analytics-switch-websites.png + :alt: Switch websites in analytics -- Search: when a list of records is displayed, don’t forget to specify - the domain to only display records available for the current - website. +Other reporting data +-------------------- -.. image:: multi_website/multi_website11.png - :align: center +Other reporting data such as eCommerce dashboard data, online sales analyses and visitors can be +grouped by website if necessary. Open the search panel and select :guilabel:`Group by --> Website`. diff --git a/content/applications/websites/website/configuration/multi_website/404-create-page.png b/content/applications/websites/website/configuration/multi_website/404-create-page.png new file mode 100644 index 0000000000..f5f322b1ee Binary files /dev/null and b/content/applications/websites/website/configuration/multi_website/404-create-page.png differ diff --git a/content/applications/websites/website/configuration/multi_website/analytics-switch-websites.png b/content/applications/websites/website/configuration/multi_website/analytics-switch-websites.png new file mode 100644 index 0000000000..7a7d26ca3d Binary files /dev/null and b/content/applications/websites/website/configuration/multi_website/analytics-switch-websites.png differ diff --git a/content/applications/websites/website/configuration/multi_website/create-website.png b/content/applications/websites/website/configuration/multi_website/create-website.png new file mode 100644 index 0000000000..5e54e3d6c9 Binary files /dev/null and b/content/applications/websites/website/configuration/multi_website/create-website.png differ diff --git a/content/applications/websites/website/configuration/multi_website/forum-multi-website.png b/content/applications/websites/website/configuration/multi_website/forum-multi-website.png new file mode 100644 index 0000000000..f4ace72509 Binary files /dev/null and b/content/applications/websites/website/configuration/multi_website/forum-multi-website.png differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website01.png b/content/applications/websites/website/configuration/multi_website/multi_website01.png deleted file mode 100644 index 5b17a97ffc..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website01.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website02.png b/content/applications/websites/website/configuration/multi_website/multi_website02.png deleted file mode 100644 index 669eaec710..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website02.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website03.png b/content/applications/websites/website/configuration/multi_website/multi_website03.png deleted file mode 100644 index 2d0fe90ae0..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website03.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website04.png b/content/applications/websites/website/configuration/multi_website/multi_website04.png deleted file mode 100644 index 831fe9ea21..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website04.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website05.png b/content/applications/websites/website/configuration/multi_website/multi_website05.png deleted file mode 100644 index cadaa8b47c..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website05.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website06.png b/content/applications/websites/website/configuration/multi_website/multi_website06.png deleted file mode 100644 index 42a5e66055..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website06.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website07.png b/content/applications/websites/website/configuration/multi_website/multi_website07.png deleted file mode 100644 index 70b5366cf8..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website07.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website08.png b/content/applications/websites/website/configuration/multi_website/multi_website08.png deleted file mode 100644 index a4ec92d99e..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website08.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website09.png b/content/applications/websites/website/configuration/multi_website/multi_website09.png deleted file mode 100644 index c407fe1e75..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website09.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website10.png b/content/applications/websites/website/configuration/multi_website/multi_website10.png deleted file mode 100644 index 90e2fe17f2..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website10.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website11.png b/content/applications/websites/website/configuration/multi_website/multi_website11.png deleted file mode 100644 index 9b379dfdb0..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website11.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website12.png b/content/applications/websites/website/configuration/multi_website/multi_website12.png deleted file mode 100644 index 5a90e432d4..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website12.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website13.png b/content/applications/websites/website/configuration/multi_website/multi_website13.png deleted file mode 100644 index fb50060867..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website13.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website14.png b/content/applications/websites/website/configuration/multi_website/multi_website14.png deleted file mode 100644 index c88186e52a..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website14.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website15.png b/content/applications/websites/website/configuration/multi_website/multi_website15.png deleted file mode 100644 index 1614df842b..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website15.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website16.png b/content/applications/websites/website/configuration/multi_website/multi_website16.png deleted file mode 100644 index 5234238f3f..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website16.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website17.png b/content/applications/websites/website/configuration/multi_website/multi_website17.png deleted file mode 100644 index 601f28daec..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website17.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/multi_website18.png b/content/applications/websites/website/configuration/multi_website/multi_website18.png deleted file mode 100644 index af4644ad20..0000000000 Binary files a/content/applications/websites/website/configuration/multi_website/multi_website18.png and /dev/null differ diff --git a/content/applications/websites/website/configuration/multi_website/pages-switch-websites.png b/content/applications/websites/website/configuration/multi_website/pages-switch-websites.png new file mode 100644 index 0000000000..0a0b416b5b Binary files /dev/null and b/content/applications/websites/website/configuration/multi_website/pages-switch-websites.png differ diff --git a/content/applications/websites/website/configuration/multi_website/switch-websites.png b/content/applications/websites/website/configuration/multi_website/switch-websites.png new file mode 100644 index 0000000000..b08556958f Binary files /dev/null and b/content/applications/websites/website/configuration/multi_website/switch-websites.png differ diff --git a/content/applications/websites/website/configuration/spam_protection.rst b/content/applications/websites/website/configuration/spam_protection.rst new file mode 100644 index 0000000000..b3c913e567 --- /dev/null +++ b/content/applications/websites/website/configuration/spam_protection.rst @@ -0,0 +1,145 @@ +===================== +Forms spam protection +===================== + +:ref:`Cloudflare Turnstile ` and :ref:`Google reCAPTCHA v3 ` +protect website forms against spam and abuse. They attempt to distinguish between human and bot +submissions using non-interactive challenges based on telemetry and visitor behavior. + +.. tip:: + **Cloudflare Turnstile is recommended** as it is possible to add an interactive check if the + automated check fails. Also, Google reCAPTCHA v3 is limited to `1 million assessments per month + per domain `_. + +.. note:: + All pages using the :guilabel:`Form`, :guilabel:`Newsletter Block`, :guilabel:`Newsletter Popup` + snippets, and the eCommerce :guilabel:`Extra Step During Checkout` form are protected by both + tools. + +.. seealso:: + - `Cloudflare Turnstile's documentation `_ + - `Google's reCAPTCHA v3 guide `_ + +.. _cloudflare-turnstile: + +Cloudflare Turnstile configuration +================================== + +On Cloudflare +------------- + +- `Create `_ a Cloudflare account or use an existing one and + `log in `_. +- On the dashboard navigation sidebar, click :guilabel:`Turnstile`. +- On the :guilabel:`Turnstile Sites` page, click :guilabel:`Add Site`. +- Add a :guilabel:`Site name` to identify it easily. +- Enter or select the website's :guilabel:`Domain` (e.g., *example.com* or *subdomain.example.com*). +- Select a :guilabel:`Widget Mode`: + + - The :guilabel:`Managed` mode is **recommended**, as visitors can be prompted to check a box + confirming they are human if deemed necessary by Turnstile. + + .. image:: spam_protection/turnstile-human.png + :alt: Cloudflare Turnstile human verification widget + + - For the :guilabel:`Non-interactive` and :guilabel:`Invisible` modes, visitors are never + prompted to interact. In :guilabel:`Non-interactive` mode, a loading widget can be displayed to + warn visitors that Turnstile protects the form; however, the widget is not supported by Odoo. + + .. note:: + If the Turnstile check fails, visitors are not able to submit the form, and the following + error message is displayed: + + .. image:: spam_protection/turnstile-error.png + :alt: Cloudflare Turnstile verification error message + +- Click :guilabel:`Create`. + +.. image:: spam_protection/turnstile-configuration.png + :alt: Adding a website to Cloudflare Turnstile + +The generated keys are then displayed. Leave the page open for convenience, as copying the keys in +Odoo is required next. + +On Odoo +------- + +- From the database dashboard, click :guilabel:`Settings`. Under :guilabel:`Integrations`, enable + :guilabel:`Cloudflare Turnstile` and click :guilabel:`Save`. +- Open the Cloudflare Turnstile page, copy the :guilabel:`Site Key`, and paste it into the + :guilabel:`CF Site Key` field in Odoo. +- Open the Cloudflare Turnstile page, copy the :guilabel:`Secret Key`, and paste it into the + :guilabel:`CF Secret Key` field in Odoo. +- Click :guilabel:`Save`. + +.. tip:: + Navigate to Turnstile on your Cloudflare account to view the solve rates and access more + settings. + +.. _google-recaptcha: + +reCAPTCHA v3 configuration +========================== + +On Google +--------- + +Open `the reCAPTCHA website registration page `_. Log +in or create a Google account if necessary. + +On the website registration page: + +- Give the website a :guilabel:`Label`. +- Leave the :guilabel:`reCAPTCHA type` on :guilabel:`Score based (v3)`. +- Enter one or more :guilabel:`Domains` (e.g., *example.com* or *subdomain.example.com*). +- Under :guilabel:`Google Cloud Platform`, a project is automatically selected if one was already + created with the logged-in Google account. If not, one is automatically created. Click + :guilabel:`Google Cloud Platform` to select a project yourself or rename the automatically created + project. +- Agree to the terms of service. +- Click :guilabel:`Submit`. + +.. image:: spam_protection/recaptcha-google-configuration.png + :alt: reCAPTCHA website registration example + +A new page with the generated keys is then displayed. Leave it open for convenience, as copying the +keys to Odoo is required next. + +On Odoo +------- + +- From the database dashboard, click :guilabel:`Settings`. Under :guilabel:`Integrations`, enable + :guilabel:`reCAPTCHA` if needed. + + .. warning:: + Do not disable the :guilabel:`reCAPTCHA` feature or uninstall the :guilabel:`Google reCAPTCHA + integration` module, as many other modules would also be removed. + +- Open the Google reCAPTCHA page, copy the :guilabel:`Site key`, and paste it into the + :guilabel:`Site Key` field in Odoo. +- Open the Google reCAPTCHA page, copy the :guilabel:`Secret key`, and paste it into the + :guilabel:`Secret Key` field in Odoo. +- Change the default :guilabel:`Minimum score` (`0.50`) if necessary, using a value between `1.00` + and `0.00`. The higher the threshold is, the more difficult it is to pass the reCAPTCHA, and vice + versa. +- Click :guilabel:`Save`. + +You can notify visitors that reCAPTCHA protects a form. To do so, open the website editor and +navigate to the form. Then, click somewhere on the form, and on the right sidebar's +:guilabel:`Customize` tab, toggle :guilabel:`Show reCAPTCHA Policy` found under the :guilabel:`Form` +section. + +.. image:: spam_protection/recaptcha-policy.png + :alt: reCAPTCHA policy message displayed on a form + +.. note:: + If the reCAPTCHA check fails, the following error message is displayed: + + .. image:: spam_protection/recaptcha-error.png + :alt: Google reCAPTCHA verification error message + +.. tip:: + Analytics and additional settings are available on `Google's reCAPTCHA administration page + `_. For example, you can receive email alerts if Google + detects suspicious traffic on your website or view the percentage of suspicious requests, which + could help you determine the right minimum score. diff --git a/content/applications/websites/website/configuration/spam_protection/recaptcha-error.png b/content/applications/websites/website/configuration/spam_protection/recaptcha-error.png new file mode 100644 index 0000000000..b7947e564f Binary files /dev/null and b/content/applications/websites/website/configuration/spam_protection/recaptcha-error.png differ diff --git a/content/applications/websites/website/configuration/spam_protection/recaptcha-google-configuration.png b/content/applications/websites/website/configuration/spam_protection/recaptcha-google-configuration.png new file mode 100644 index 0000000000..c3bbea65ab Binary files /dev/null and b/content/applications/websites/website/configuration/spam_protection/recaptcha-google-configuration.png differ diff --git a/content/applications/websites/website/configuration/spam_protection/recaptcha-policy.png b/content/applications/websites/website/configuration/spam_protection/recaptcha-policy.png new file mode 100644 index 0000000000..a335a45ebe Binary files /dev/null and b/content/applications/websites/website/configuration/spam_protection/recaptcha-policy.png differ diff --git a/content/applications/websites/website/configuration/spam_protection/turnstile-configuration.png b/content/applications/websites/website/configuration/spam_protection/turnstile-configuration.png new file mode 100644 index 0000000000..195309fb86 Binary files /dev/null and b/content/applications/websites/website/configuration/spam_protection/turnstile-configuration.png differ diff --git a/content/applications/websites/website/configuration/spam_protection/turnstile-error.png b/content/applications/websites/website/configuration/spam_protection/turnstile-error.png new file mode 100644 index 0000000000..d70b2d61fd Binary files /dev/null and b/content/applications/websites/website/configuration/spam_protection/turnstile-error.png differ diff --git a/content/applications/websites/website/configuration/spam_protection/turnstile-human.png b/content/applications/websites/website/configuration/spam_protection/turnstile-human.png new file mode 100644 index 0000000000..12926b5b6b Binary files /dev/null and b/content/applications/websites/website/configuration/spam_protection/turnstile-human.png differ diff --git a/content/applications/websites/website/pages.rst b/content/applications/websites/website/pages.rst index ac79dd99de..80780fd649 100644 --- a/content/applications/websites/website/pages.rst +++ b/content/applications/websites/website/pages.rst @@ -1,9 +1,192 @@ -:nosearch: +git:show-content: ===== Pages ===== +Odoo allows you to create pages for your website and customize their content and appearance to your +needs. + +.. note:: + *Static* pages are pages that have stable content, such as the homepage. You can manually create + new ones, define their URL, adapt their :ref:`properties `, etc. + *Dynamic* pages, on the other hand, are generated dynamically. All pages generated automatically + by Odoo, for example when you install an app or module (e.g., `/shop` or `/blog`) or publish a + new product or blog post, are dynamic pages and are therefore managed differently. + +Page creation +============= + +Website pages can be created from the **frontend** and the **backend**. To create a new website +page, proceed as follows: + + #. - Either open the **Website** app, click :guilabel:`+ New` in the top-right corner, then select + :guilabel:`Page`; + - Or go to :menuselection:`Website --> Site --> Pages` and click :guilabel:`New`. + #. Enter a :guilabel:`Page Title`; this title is used in the menu, as well as in the page's URL. + #. Click :guilabel:`Create`. + #. Customize the page's content and appearance using the website builder, then click + :guilabel:`Save`. + #. :ref:`Publish ` the page. + +.. note:: + Disable :guilabel:`Add to menu` if the page should not appear in the menu. + +Page management +=============== + +.. _website/un-publish-page: + +Publishing/unpublishing pages +----------------------------- + +Pages need to be published to make them accessible to website visitors. To publish or unpublish a +page, access it, then toggle the switch in the upper-right corner from :guilabel:`Unpublished` +to :guilabel:`Published`, or vice versa. + +.. image:: pages/un-published_toggle.png + :alt: Unpublished/Published toggle + +.. note:: + It is also possible to: + + - publish/unpublish a page from the :ref:`page properties `, where you + can define a publishing date and/or restrict the page's visibility if needed; + - publish/unpublish several pages at once: go to :menuselection:`Website --> Site --> Pages`, + select the pages, then, click :guilabel:`Action` and select :guilabel:`Publish` or + :guilabel:`Unpublish`. + +Homepage +-------- + +By default, when you create a website, Odoo creates a dedicated :guilabel:`Home` page, but you can +define any website page as your homepage. To do so, go to :menuselection:`Website --> Configuration +--> Settings`, then, in the :guilabel:`Website info` section, define the URL of the desired page in +the field :guilabel:`Homepage URL` (e.g., `/shop`). + +Alternatively, you can define any static page as your homepage by going to :menuselection:`Website +--> Site --> Properties`. Select the :guilabel:`Publish` tab and enable :guilabel:`Use as Homepage`. + +.. _website/page_properties: + +Page properties +--------------- + +To modify a static page's properties, access the page you wish to modify, then go to +:menuselection:`Site --> Properties`. + +The :guilabel:`Name` tab allows you to: + +- rename the page using the :guilabel:`Page Name` field; +- modify the :guilabel:`Page URL`. In this case, you can redirect the old URL to the new one if + needed. To do so, enable :guilabel:`Redirect Old URL`, then select the :guilabel:`Type` of + :ref:`redirection `: + + - :guilabel:`301 Moved permanently`: to redirect the page permanently; + - :guilabel:`302 Moved temporarily`: to redirect the page temporarily. + + .. image:: pages/page-redirection.png + :alt: Redirect old URL + +You can further adapt the page's properties in the :guilabel:`Publish` tab: + +- :guilabel:`Show in Top Menu`: Disable if you don't want the page to appear in the menu; +- :guilabel:`Use as Homepage`: Enable if you want the page to be the homepage of your website; +- :guilabel:`Indexed`: Disable if you don't want the page to be shown in search engine results; +- :guilabel:`Published`: Enable to publish the page; +- :guilabel:`Publishing Date`: To publish the page at a specific moment, select the date, + click the clock icon to set the time, then click the green check mark to validate your selection. +- :guilabel:`Visibility`: Select who can access the page: + + - :guilabel:`All` + - :guilabel:`Signed In` + - :guilabel:`Restricted Group`: Select the :doc:`user access group(s) + ` in the :guilabel:`Authorized group` field. + - :guilabel:`With Password`: Enter the password in the :guilabel:`Password` field. + +.. tip:: + *Some* of these properties can also be modified from :menuselection:`Website --> Site --> Pages`. + +Duplicating pages +~~~~~~~~~~~~~~~~~ + +To duplicate a page, access the page, then go to :menuselection:`Site --> Properties` and click +:guilabel:`Duplicate Page`. Enter a :guilabel:`Page Name`, then click :guilabel:`OK`. By default, +the new page is added after the duplicated page in the menu, but you can remove it from the menu or +change its position using the menu editor. + +.. _website/delete-page: + +Deleting pages +~~~~~~~~~~~~~~ + +To delete a page, proceed as follows: + +#. Access the page, then go to :menuselection:`Site --> Properties` and click :guilabel:`Delete + Page`. +#. A pop-up window appears on the screen with all links referring to the page you want to delete, + organized by category. To ensure website visitors don't land on a 404 error page, you must update + all the links on your website referring to the page. To do so, expand a category, then click on a + link to open it in a new window. Alternatively, you can set up a :ref:`redirection + ` for the deleted page. +#. Once you have updated the links (or set up a :ref:`redirection `), + select the :guilabel:`I am sure about this` check box, then click :guilabel:`OK`. + +.. _website/URL-redirection: + +URL redirects +------------- + +Redirecting URLs consists in sending visitors and search engines to a URL that is different from the +one they originally requested. This technique is used, for example, to prevent broken links when you +:ref:`delete a page `, :ref:`modify its URL `, or move +your site to a new :doc:`domain `. It can also be used to +improve :doc:`pages/seo`. + +To access existing URL redirections and create new ones, :doc:`activate the developer mode +` and go to :menuselection:`Website --> Configuration --> +Redirects`. + +.. note:: + - A record is added automatically every time you :ref:`modify a page's URL + ` and enable :guilabel:`Redirect Old URL`. + - You can set up redirections for static and dynamic pages. + +To create a new redirection, click the :guilabel:`New` button, then fill in the fields: + +- :guilabel:`Name`: Enter a name to identify the redirect. +- :guilabel:`Action`: Select the type of redirection: + + - :guilabel:`404 Not found`: visitors are redirected to a 404 error page when they try to access + the page. + - :guilabel:`301 Moved Permanently`: for permanent redirections of static pages; the new URL is + shown in search engine results and the redirect is cached by browsers. + - :guilabel:`302 Moved Temporarily`: for short-term redirections, for example, if you are + redesigning or updating the page. The new URL is neither cached by browsers, nor shown in + search engine results. + - :guilabel:`308 Redirect / Rewrite`: for permanent redirections of dynamic pages; the new URL is + shown in search engine results and the redirect is cached by browsers. Use this redirect type + to rename a dynamic page, for example, if you wish to rename `/shop` into `/market`. + +- :guilabel:`URL from`: Enter the URL to be redirected (e.g., `/about-the-company`) or search for + the desired dynamic page and select it from the list. +- :guilabel:`URL to`: For 301, 302 and 308 redirects, enter the URL to be redirected to. If you want + to redirect to an external URL, make sure to include the protocol (e.g., `https://`). +- :guilabel:`Website`: Select a specific website. +- :guilabel:`Sequence`: to define the order in which redirections are performed, e.g., in the case + of redirect chains (i.e., a series of redirects where one URL is redirected to another one, which + is itself further redirected to another URL). + +Toggle the :guilabel:`Activate` switch to deactivate the redirection. + +.. note:: + 404, 301 and 302 redirections only work if the original page has been :ref:`unpublished + ` or :ref:`deleted `. + +.. seealso:: + - `Google documentation on redirects and search `_ + - :doc:`pages/seo` + .. toctree:: :titlesonly: diff --git a/content/applications/websites/website/pages/menu-bar.png b/content/applications/websites/website/pages/menu-bar.png new file mode 100644 index 0000000000..60c3d27610 Binary files /dev/null and b/content/applications/websites/website/pages/menu-bar.png differ diff --git a/content/applications/websites/website/pages/page-redirection.png b/content/applications/websites/website/pages/page-redirection.png new file mode 100644 index 0000000000..e5fbb3a5cc Binary files /dev/null and b/content/applications/websites/website/pages/page-redirection.png differ diff --git a/content/applications/websites/website/pages/seo/mega-menu-item.png b/content/applications/websites/website/pages/seo/mega-menu-item.png new file mode 100644 index 0000000000..1019100ce0 Binary files /dev/null and b/content/applications/websites/website/pages/seo/mega-menu-item.png differ diff --git a/content/applications/websites/website/pages/un-published_toggle.png b/content/applications/websites/website/pages/un-published_toggle.png new file mode 100644 index 0000000000..54ac8673ca Binary files /dev/null and b/content/applications/websites/website/pages/un-published_toggle.png differ diff --git a/content/contributing/development/coding_guidelines.rst b/content/contributing/development/coding_guidelines.rst index c01f02af46..d473fa63b3 100644 --- a/content/contributing/development/coding_guidelines.rst +++ b/content/contributing/development/coding_guidelines.rst @@ -904,7 +904,7 @@ Symbols and Conventions def _onchange_date_begin(self): ... - # CRUD methods (and name_get, name_search, ...) overrides + # CRUD methods (and name_search, _search, ...) overrides def create(self, values): ... diff --git a/content/contributing/documentation/rst_cheat_sheet.rst b/content/contributing/documentation/rst_cheat_sheet.rst index 7239d0b3d3..f89477c83a 100644 --- a/content/contributing/documentation/rst_cheat_sheet.rst +++ b/content/contributing/documentation/rst_cheat_sheet.rst @@ -145,7 +145,7 @@ Use the `abbr` markup to write a self-defining abbreviation that is displayed as .. _contributing/markups/guilabel: -:abbr:`GUI (Graphical User Interface)` element +:abbr:`GUI (graphical user interface)` element ---------------------------------------------- Use the `guilabel` markup to identify any text of the interactive user interface (e.g., button @@ -1070,7 +1070,7 @@ Document metadata | `code-column` | | Show a dynamic side column that can be used to display interactive | | | tutorials or code excerpts. | | | | For example, see | -| | :doc:`/applications/finance/accounting/getting_started/cheat_sheet`. | +| | :doc:`/applications/finance/accounting/get_started/cheat_sheet`. | +-----------------+--------------------------------------------------------------------------------+ | `hide-page-toc` | Hide the "On this page" sidebar and use full page width for the content. | +-----------------+--------------------------------------------------------------------------------+ diff --git a/content/developer/howtos/accounting_localization.rst b/content/developer/howtos/accounting_localization.rst index 5c6630048d..2b8d3ac0cc 100644 --- a/content/developer/howtos/accounting_localization.rst +++ b/content/developer/howtos/accounting_localization.rst @@ -107,7 +107,7 @@ Accounts .. seealso:: - :ref:`Account References ` - - :doc:`/applications/finance/accounting/getting_started/initial_configuration/chart_of_accounts` + - :doc:`/applications/finance/accounting/get_started/chart_of_accounts` Obviously, :guilabel:`Chart of Accounts` cannot exist without :guilabel:`Accounts`. You need to specify them in :file:`data/account.account.template.csv`. @@ -152,7 +152,7 @@ Taxes .. seealso:: - :ref:`Tax References ` - - :doc:`/applications/finance/accounting/taxation/taxes/taxes` + - :doc:`/applications/finance/accounting/taxes/` To add taxes you first need to specify tax groups. You normally need just one tax group for every tax rate, except for the 0% as you need to often distinguish between exempt, 0%, not subject, ... taxes. This model only has two required fields: `name` and `country`. Create the file :file:`data/template/account.tax.group-xx.csv` and list the groups. @@ -188,7 +188,7 @@ The tax report is declared in the :guilabel:`Invoicing` (`account`) app, but the .. seealso:: - :doc:`/developer/reference/standard_modules/account/account_report_line` - - :doc:`/applications/finance/accounting/reporting/declarations/tax_returns` + - :doc:`/applications/finance/accounting/reporting/tax_returns` In the previous section, you noticed the fields `invoice_repartition_line_ids` or `refund_repartition_line_ids` and probably understood nothing about them. Good news: you are not alone on this incomprehension. Bad news: you have to figure it out a bit. The topic is complicated. Indeed: @@ -230,7 +230,7 @@ Fiscal positions .. seealso:: - :ref:`Fiscal Position References ` - - :doc:`/applications/finance/accounting/taxation/taxes/fiscal_positions` + - :doc:`/applications/finance/accounting/taxes/fiscal_positions` Specify fiscal positions in the :file:`data/template/account.fiscal.position-xx.csv` file. @@ -264,7 +264,7 @@ Accounting reports
Enterprise feature
.. seealso:: - :doc:`/applications/finance/accounting/reporting/overview` + :doc:`/applications/finance/accounting/reporting` Accounting reports should be added via a separate module `l10n_XX_reports` that should go to the `enterprise repository <{GITHUB_ENT_PATH}>`_. @@ -289,7 +289,7 @@ Basic :file:`__manifest__.py` file for such a module looks as following: } -Functional overview of financial reports is here: :doc:`/applications/finance/accounting/reporting/overview/main_reports`. +Functional overview of financial reports is here: :doc:`/applications/finance/accounting/reporting`. Some good examples: diff --git a/content/developer/reference/backend/mixins.rst b/content/developer/reference/backend/mixins.rst index 7fe9ba0b8f..c7509a39ff 100644 --- a/content/developer/reference/backend/mixins.rst +++ b/content/developer/reference/backend/mixins.rst @@ -81,13 +81,14 @@ to manage followers on your record: Post a new message in an existing thread, returning the new mail.message ID. - :param str body: body of the message, usually raw HTML that will - be sanitized + :param str | Markup body: body of the message. Will be escaped if `str`. Use + a :class:`~markupsafe.Markup` object for HTML content. :param str message_type: see mail_message.message_type field :param int parent_id: handle reply to a previous message by adding the parent partners to the message in case of private discussion :param list(tuple(str,str)) attachments: list of attachment tuples in the form ``(name,content)``, where content is NOT base64 encoded + :param bool body_is_html: indicates whether `body` should be treated as HTML, even if `str`. :param `\**kwargs`: extra keyword arguments will be used as default column values for the new mail.message record :return: ID of newly created mail.message diff --git a/content/developer/reference/backend/orm.rst b/content/developer/reference/backend/orm.rst index 15cfe53029..7313674382 100644 --- a/content/developer/reference/backend/orm.rst +++ b/content/developer/reference/backend/orm.rst @@ -407,6 +407,13 @@ Automatic fields Raise an Error otherwise. +.. attribute:: Model.display_name + + Name :class:`field ` displayed by default in the web client + + By default, it equals to :attr:`~odoo.models.BaseModel._rec_name` value field + but the behavior can be customized by overriding :attr:`~odoo.models.BaseModel._compute_display_name` + .. _reference/fields/automatic/log_access: Access Log fields @@ -471,13 +478,6 @@ behavior is desired: .. automethod:: Model.action_archive .. automethod:: Model.action_unarchive -.. .. attribute:: sequence - -.. Alterable ordering criteria, allows drag-and-drop reordering of models -.. in list views. - -.. :class:`~odoo.fields.Integer` - .. attribute:: Model.state lifecycle stages of the object, used by the ``states`` attribute on @@ -995,8 +995,6 @@ Record(set) information .. automethod:: Model.ensure_one -.. automethod:: Model.name_get - .. automethod:: Model.get_metadata .. _reference/orm/records/operations: diff --git a/content/developer/reference/backend/orm/changelog.rst b/content/developer/reference/backend/orm/changelog.rst index 4ea33293c3..45cb6cc682 100644 --- a/content/developer/reference/backend/orm/changelog.rst +++ b/content/developer/reference/backend/orm/changelog.rst @@ -4,6 +4,13 @@ Changelog ========= +Odoo Online version 16.4 +======================== + +- `odoo.models.Model.name_get` has been deprecated with + `#122085 `_. + Read `display_name` instead. + Odoo Online version 16.3 ======================== diff --git a/content/developer/reference/backend/views.rst b/content/developer/reference/backend/views.rst index d9e74a7366..ec3ca5f720 100644 --- a/content/developer/reference/backend/views.rst +++ b/content/developer/reference/backend/views.rst @@ -467,12 +467,12 @@ calendar view are: open events (or records) in a FormViewDialog. Otherwise, it will open events in a new form view (with a do_action) ``quick_add`` - enables quick-event creation on click: only asks the user for a ``name`` - (the field to which this values is saved can be controlled through - ``rec_name``) and tries to create a new event with just that and the clicked - event time. Falls back to a full form dialog if the quick creation fails -``quick_create_form_view_id`` - view to open when the user tries to quick create a record. + When a boolean value is passed, enables quick-event creation on click: only + asks the user for a ``name`` (the field to which this values is saved can be + controlled through ``rec_name``) and tries to create a new event with just that + and the clicked event time. Falls back to a full form dialog if the quick + creation fails. This attribute also accepts a form view id, which will be used + instead of the quick create default dialog. ``create_name_field`` name of the record's field holding the textual representation of the record, this is used when creating records through the 'quick create' mechanism @@ -1819,6 +1819,10 @@ Possible children elements of the list view are: ``nolabel`` if set to "1", the column header will remain empty. Also, the column won't be sortable. + ``optional`` + makes the column optional. If set to "hide", the column is hidden by + default. If set to "show", the column is visible by default. + User visibility choices are stored in the browser local storage. .. note:: @@ -2321,11 +2325,14 @@ Possible children elements of the search view are: - + if both filters are selected, will select the records whose ``state`` is ``draft`` **and** ``delay`` is below 15. + .. note:: XML does not allow ``<`` to be used within XML elements, + an entity reference (``<``) should be used instead. + ``separator`` can be used to separates groups of filters in simple search views diff --git a/content/developer/reference/cli.rst b/content/developer/reference/cli.rst index 715511208f..7e380fdb15 100644 --- a/content/developer/reference/cli.rst +++ b/content/developer/reference/cli.rst @@ -620,6 +620,8 @@ Some conversions don't match the pattern: * :option:`--i18n-import` and :option:`--i18n-export` aren't available at all from configuration files +.. _reference/cmdline/config_file: + The default configuration file is :file:`{$HOME}/.odoorc` which can be overridden using :option:`--config `. Specifying :option:`--save ` will save the current configuration state back diff --git a/content/developer/reference/external_api.rst b/content/developer/reference/external_api.rst index 93355536fa..ee83134de3 100644 --- a/content/developer/reference/external_api.rst +++ b/content/developer/reference/external_api.rst @@ -72,6 +72,15 @@ If you already have an Odoo server installed, you can just use its parameters. username = "admin", password = ; + .. code-tab:: go + + var ( + url = + db = + username = "admin" + password = + ) + .. _api/external_api/keys: API Keys @@ -180,6 +189,27 @@ database: The examples do not include imports as these imports couldn't be pasted in the code. + .. group-tab:: Go + + .. code-block:: go + + client, err := xmlrpc.NewClient("https://demo.odoo.com/start", nil) + if err != nil { + log.Fatal(err) + } + info := map[string]string{} + client.Call("start", nil, &info) + url = info["host"].(string) + db = info["database"].(string) + username = info["user"].(string) + password = info["password"].(string) + + .. note:: + These examples use the `github.com/kolo/xmlrpc library `_. + + The examples do not include imports as these imports couldn't be + pasted in the code. + Logging in ---------- @@ -217,6 +247,17 @@ the login. common_config.setServerURL(new URL(String.format("%s/xmlrpc/2/common", url))); client.execute(common_config, "version", emptyList()); + .. code-tab:: go + + client, err := xmlrpc.NewClient(fmt.Sprintf("%s/xmlrpc/2/common", url), nil) + if err != nil { + log.Fatal(err) + } + common := map[string]any{} + if err := client.Call("version", nil, &common); err != nil { + log.Fatal(err) + } + Result: .. code-block:: json @@ -247,6 +288,16 @@ Result: int uid = (int)client.execute(common_config, "authenticate", asList(db, username, password, emptyMap())); + .. code-tab:: go + + var uid int64 + if err := client.Call("authenticate", []any{ + db, username, password, + map[string]any{}, + }, &uid); err != nil { + log.Fatal(err) + } + .. _api/external_api/calling_methods: Calling methods @@ -303,6 +354,22 @@ Each call to ``execute_kw`` takes the following parameters: new HashMap() {{ put("raise_exception", false); }} )); + .. code-tab:: go + + models, err := xmlrpc.NewClient(fmt.Sprintf("%s/xmlrpc/2/object", url), nil) + if err != nil { + log.Fatal(err) + } + var result bool + if err := models.Call("execute_kw", []any{ + db, uid, password, + "res.partner", "check_access_rights", + []string{"read"}, + map[string]bool{"raise_exception": false}, + }, &result); err != nil { + log.Fatal(err) + } + Result: .. code-block:: json @@ -345,6 +412,19 @@ database identifiers of all records matching the filter. asList("is_company", "=", true))) ))); + .. code-tab:: go + + var records []int64 + if err := models.Call("execute_kw", []any{ + db, uid, password, + "res.partner", "search", + []any{[]any{ + []any{"is_company", "=", true}, + }}, + }, &records); err != nil { + log.Fatal(err) + } + Result: .. code-block:: json @@ -384,6 +464,20 @@ available to only retrieve a subset of all matched records. new HashMap() {{ put("offset", 10); put("limit", 5); }} ))); + .. code-tab:: go + + var records []int64 + if err := models.Call("execute_kw", []any{ + db, uid, password, + "res.partner", "search", + []any{[]any{ + []any{"is_company", "=", true}, + }}, + map[string]int64{"offset": 10, "limit": 5}, + }, &records); err != nil { + log.Fatal(err) + } + Result: .. code-block:: json @@ -424,6 +518,19 @@ only the number of records matching the query. It takes the same asList("is_company", "=", true))) )); + .. code-tab:: go + + var counter int64 + if err := models.Call("execute_kw", []any{ + db, uid, password, + "res.partner", "search_count", + []any{[]any{ + []any{"is_company", "=", true}, + }}, + }, &counter); err != nil { + log.Fatal(err) + } + Result: .. code-block:: json @@ -488,6 +595,30 @@ which tends to be a huge amount. // count the number of fields fetched by default record.size(); + .. code-tab:: go + + var ids []int64 + if err := models.Call("execute_kw", []any{ + db, uid, password, + "res.partner", "search", + []any{[]any{ + []any{"is_company", "=", true}, + }}, + map[string]int64{"limit": 1}, + }, &ids); err != nil { + log.Fatal(err) + } + var records []any + if err := models.Call("execute_kw", []any{ + db, uid, password, + "res.partner", "read", + ids, + }, &records); err != nil { + log.Fatal(err) + } + // count the number of fields fetched by default + count := len(records) + Result: .. code-block:: json @@ -521,6 +652,20 @@ which tends to be a huge amount. }} ))); + .. code-tab:: go + + var recordFields []map[string]any + if err := models.Call("execute_kw", []any{ + db, uid, password, + "res.partner", "read", + ids, + map[string][]string{ + "fields": {"name", "country_id", "comment"}, + }, + }, &recordFields); err != nil { + log.Fatal(err) + } + Result: .. code-block:: json @@ -569,6 +714,20 @@ updating a record). }} )); + .. code-tab:: go + + recordFields := map[string]string{} + if err := models.Call("execute_kw", []any{ + db, uid, password, + "res.partner", "fields_get", + []any{}, + map[string][]string{ + "attributes": {"string", "help", "type"}, + }, + }, &recordFields); err != nil { + log.Fatal(err) + } + Result: .. code-block:: json @@ -652,6 +811,23 @@ if that list is not provided it will fetch all fields of matched records). }} ))); + .. code-tab:: go + + var recordFields []map[string]any + if err := models.Call("execute_kw", []any{ + db, uid, password, + "res.partner", "search_read", + []any{[]any{ + []any{"is_company", "=", true}, + }}, + map[string]any{ + "fields": []string{"name", "country_id", "comment"}, + "limit": 5, + }, + }, &recordFields); err != nil { + log.Fatal(err) + } + Result: .. code-block:: json @@ -723,6 +899,19 @@ set through the mapping argument, the default value will be used. asList(new HashMap() {{ put("name", "New Partner"); }}) )); + .. code-tab:: go + + var id int64 + if err := models.Call("execute_kw", []any{ + db, uid, password, + "res.partner", "create", + []map[string]string{ + {"name": "New Partner"}, + }, + }, &id); err != nil { + log.Fatal(err) + } + Result: .. code-block:: json @@ -760,20 +949,20 @@ a record). models.execute_kw(db, uid, password, 'res.partner', 'write', [[id], {'name': "Newer partner"}]) # get record name after having changed it - models.execute_kw(db, uid, password, 'res.partner', 'name_get', [[id]]) + models.execute_kw(db, uid, password, 'res.partner', 'read', [[id], ['display_name']]) .. code-tab:: ruby models.execute_kw(db, uid, password, 'res.partner', 'write', [[id], {name: "Newer partner"}]) # get record name after having changed it - models.execute_kw(db, uid, password, 'res.partner', 'name_get', [[id]]) + models.execute_kw(db, uid, password, 'res.partner', 'read', [[id], ['display_name']]) .. code-tab:: php $models->execute_kw($db, $uid, $password, 'res.partner', 'write', array(array($id), array('name'=>"Newer partner"))); // get record name after having changed it $models->execute_kw($db, $uid, $password, - 'res.partner', 'name_get', array(array($id))); + 'res.partner', 'read', array(array($id), array('display_name'))); .. code-tab:: java @@ -788,10 +977,35 @@ a record). // get record name after having changed it asList((Object[])models.execute("execute_kw", asList( db, uid, password, - "res.partner", "name_get", - asList(asList(id)) + "res.partner", "read", + asList(asList(id), asList("display_name")) ))); + .. code-tab:: go + + var result bool + if err := models.Call("execute_kw", []any{ + db, uid, password, + "res.partner", "write", + []any{ + []int64{id}, + map[string]string{"name": "Newer partner"}, + }, + }, &result); err != nil { + log.Fatal(err) + } + // get record name after having changed it + var record []any + if err := models.Call("execute_kw", []any{ + db, uid, password, + "res.partner", "name_get", + []any{ + []int64{id}, + }, + }, &record); err != nil { + log.Fatal(err) + } + Result: .. code-block:: json @@ -841,6 +1055,30 @@ Records can be deleted in bulk by providing their ids to asList(asList(asList("id", "=", 78))) ))); + .. code-tab:: go + + var result bool + if err := models.Call("execute_kw", []any{ + db, uid, password, + "res.partner", "unlink", + []any{ + []int64{id}, + }, + }, &result); err != nil { + log.Fatal(err) + } + // check if the deleted record is still in the database + var record []any + if err := models.Call("execute_kw", []any{ + db, uid, password, + "res.partner", "search", + []any{[]any{ + []any{"id", "=", id}, + }}, + }, &record); err != nil { + log.Fatal(err) + } + Result: .. code-block:: json @@ -953,6 +1191,34 @@ Provides information about Odoo models via its various fields. }} )); + .. code-tab:: go + + var id int64 + if err := models.Call("execute_kw", []any{ + db, uid, password, + "ir.model", "create", + []map[string]string{ + { + "name": "Custom Model", + "model": "x_custom_model", + "state": "manual", + }, + }, + }, &id); err != nil { + log.Fatal(err) + } + recordFields := map[string]string{} + if err := models.Call("execute_kw", []any{ + db, uid, password, + "x_custom_model", "fields_get", + []any{}, + map[string][]string{ + "attributes": {"string", "help", "type"}, + }, + }, &recordFields); err != nil { + log.Fatal(err) + } + Result: .. code-block:: json @@ -1118,6 +1384,57 @@ custom fields without using Python code. asList(asList(record_id)) )); + .. code-tab:: go + + var id int64 + if err := models.Call("execute_kw", []any{ + db, uid, password, + "ir.model", "create", + []map[string]string{ + { + "name": "Custom Model", + "model": "x_custom", + "state": "manual", + }, + }, + }, &id); err != nil { + log.Fatal(err) + } + var fieldId int64 + if err := models.Call("execute_kw", []any{ + db, uid, password, + "ir.model.fields", "create", + []map[string]any{ + { + "model_id": id, + "name": "x_name", + "ttype": "char", + "state": "manual", + "required": true, + }, + }, + }, &fieldId); err != nil { + log.Fatal(err) + } + var recordId int64 + if err := models.Call("execute_kw", []any{ + db, uid, password, + "x_custom", "create", + []map[string]string{ + {"x_name": "test record"}, + }, + }, &recordId); err != nil { + log.Fatal(err) + } + var recordFields []map[string]any + if err := models.Call("execute_kw", []any{ + db, uid, password, + "x_custom", "read", + [][]int64{{recordId}}, + }, recordFields); err != nil { + log.Fatal(err) + } + Result: .. code-block:: json diff --git a/content/developer/reference/frontend/assets.rst b/content/developer/reference/frontend/assets.rst index 1ed250f05e..ec68f118cb 100644 --- a/content/developer/reference/frontend/assets.rst +++ b/content/developer/reference/frontend/assets.rst @@ -88,14 +88,11 @@ know: :file:`boot.js` file, which defines the odoo module system. - `web.assets_backend`: this bundle contains the code specific to the web client - (notably the web client/action manager/views) + (notably the web client/action manager/views/static XML templates) - `web.assets_frontend`: this bundle is about all that is specific to the public website: ecommerce, portal, forum, blog, ... -- `web.assets_qweb`: all static XML templates used in the backend environment - and in the point of sale. - - `web.qunit_suite_tests`: all javascript qunit testing code (tests, helpers, mocks) - `web.qunit_mobile_suite_tests`: mobile specific qunit testing code diff --git a/content/developer/reference/frontend/javascript_reference.rst b/content/developer/reference/frontend/javascript_reference.rst index b941345e82..cc6ed4fb3d 100644 --- a/content/developer/reference/frontend/javascript_reference.rst +++ b/content/developer/reference/frontend/javascript_reference.rst @@ -1257,41 +1257,21 @@ the AbstractView, AbstractController, AbstractRenderer and AbstractModel classes .. _reference/js/widgets: -Field Widgets -============= +Fields +====== A good part of the web client experience is about editing and creating data. Most of that work is done with the help of field widgets, which are aware of the field type and of the specific details on how a value should be displayed and edited. -AbstractField -------------- - -The *AbstractField* class is the base class for all widgets in a view, for all -views that support them (currently: Form, List, Kanban). - -There are many differences between the v11 field widgets and the previous versions. -Let us mention the most important ones: - -- the widgets are shared between all views (well, Form/List/Kanban). No need to - duplicate the implementation anymore. Note that it is possible to have a - specialized version of a widget for a view, by prefixing it with the view name - in the view registry: *list.many2one* will be chosen in priority over *many2one*. -- the widgets are no longer the owner of the field value. They only represent - the data and communicate with the rest of the view. -- the widgets do no longer need to be able to switch between edit and readonly - mode. Now, when such a change is necessary, the widget will be destroyed and - rerendered again. It is not a problem, since they do not own their value - anyway -- the field widgets can be used outside of a view. Their API is slightly - awkward, but they are designed to be standalone. +.. _reference/javascript_reference/field_decoration: Decorations ----------- Like the list view, field widgets have a simple support for decorations. The goal of decorations is to have a simple way to specify a text color depending on -the record current state. For example, +the record current state. For example: .. code-block:: xml @@ -1299,14 +1279,14 @@ the record current state. For example, The valid decoration names are: -- decoration-bf -- decoration-it -- decoration-danger -- decoration-info -- decoration-muted -- decoration-primary -- decoration-success -- decoration-warning +- `decoration-bf` +- `decoration-it` +- `decoration-danger` +- `decoration-info` +- `decoration-muted` +- `decoration-primary` +- `decoration-success` +- `decoration-warning` Each decoration *decoration-X* will be mapped to a css class *text-X*, which is a standard bootstrap css class (except for *text-it* and *text-bf*, which are @@ -1314,775 +1294,753 @@ handled by odoo and correspond to italic and bold, respectively). Note that the value of the decoration attribute should be a valid python expression, which will be evaluated with the record as evaluation context. -Non relational fields +Non-relational fields --------------------- We document here all non relational fields available by default, in no particular order. -integer (FieldInteger) - This is the default field type for fields of type *integer*. +Integer (`integer`) + This is the default field type for fields of type `integer`. - - Supported field types: *integer* + - Supported field types: `integer` Options: - - type: setting the input type (*text* by default, can be set on *number*) + - `type`: setting the input type (`"text"` by default, can be set on `"number"`) - On edit mode, the field is rendered as an input with the HTML attribute type - set on *number* (so user can benefit the native support, especially on - mobile). In this case, the default formatting is disabled to avoid incompability. + In edit mode, the field is rendered as an input with the HTML attribute type + set on `"number"` (so user can benefit the native support, especially on + mobile). In this case, the default formatting is disabled to avoid incompability. - .. code-block:: xml + .. code-block:: xml - + - - step: set the step to the value up and down when the user click on buttons - (only for input of type number, 1 by default) + - `step`: set the step to the value up and down when the user click on buttons + (only for input of type number, `1` by default) - .. code-block:: xml + .. code-block:: xml - + - - format: should the number be formatted. (true by default) + - `format`: should the number be formatted. (`true` by default) - By default, numbers are formatted according to locale parameters. + By default, numbers are formatted according to locale parameters. This option will prevent the field's value from being formatted. - .. code-block:: xml + .. code-block:: xml - + -float (FieldFloat) - This is the default field type for fields of type *float*. +Float (`float`) + This is the default field type for fields of type `float`. - - Supported field types: *float* + - Supported field types: `float` Attributes: - - digits: displayed precision + - `digits`: displayed precision - .. code-block:: xml + .. code-block:: xml - + Options: - - type: setting the input type (*text* by default, can be set on *number*) + - `type`: setting the input type (`"text"` by default, can be set on `"number"`) - On edit mode, the field is rendered as an input with the HTML attribute type - set on *number* (so user can benefit the native support, especially on - mobile). In this case, the default formatting is disabled to avoid incompability. + In edit mode, the field is rendered as an input with the HTML attribute type + set on `"number"` (so user can benefit the native support, especially on + mobile). In this case, the default formatting is disabled to avoid incompability. - .. code-block:: xml + .. code-block:: xml - + - - step: set the step to the value up and down when the user click on buttons - (only for input of type number, 1 by default) + - `step`: set the step to the value up and down when the user click on buttons + (only for input of type number, `1` by default) - .. code-block:: xml + .. code-block:: xml - + - - format: should the number be formatted. (true by default) + - `format`: should the number be formatted. (`true` by default) - By default, numbers are formatted according to locale parameters. + By default, numbers are formatted according to locale parameters. This option will prevent the field's value from being formatted. - .. code-block:: xml + .. code-block:: xml - + -float_time (FieldFloatTime) - The goal of this widget is to display properly a float value that represents - a time interval (in hours). So, for example, 0.5 should be formatted as 0:30, - or 4.75 correspond to 4:45. +Time (`float_time`) + The goal of this widget is to display properly a float value that represents + a time interval (in hours). So, for example, `0.5` should be formatted as `0:30`, + or `4.75` correspond to `4:45`. - - Supported field types: *float* + - Supported field types: `float` -float_factor (FieldFloatFactor) - This widget aims to display properly a float value that converted using a factor - given in its options. So, for example, the value saved in database is 0.5 and the - factor is 3, the widget value should be formatted as 1.5. +Float Factor (`float_factor`) + This widget aims to display properly a float value that converted using a factor + given in its options. So, for example, the value saved in database is `0.5` and the + factor is `3`, the widget value should be formatted as `1.5`. - - Supported field types: *float* + - Supported field types: `float` -float_toggle (FieldFloatToggle) - The goal of this widget is to replace the input field by a button containing a - range of possible values (given in the options). Each click allows the user to loop - in the range. The purpose here is to restrict the field value to a predefined selection. - Also, the widget support the factor conversion as the *float_factor* widget (Range values - should be the result of the conversion). +Float Toggle (`float_toggle`) + The goal of this widget is to replace the input field by a button containing a + range of possible values (given in the options). Each click allows the user to loop + in the range. The purpose here is to restrict the field value to a predefined selection. + Also, the widget support the factor conversion as the `float_factor` widget (Range values + should be the result of the conversion). - - Supported field types: *float* + - Supported field types: `float` - .. code-block:: xml - - - -boolean (FieldBoolean) - This is the default field type for fields of type *boolean*. + .. code-block:: xml - - Supported field types: *boolean* + -char (FieldChar) - This is the default field type for fields of type *char*. +Boolean (`boolean`) + This is the default field type for fields of type `boolean`. - - Supported field types: *char* + - Supported field types: `boolean` -date (FieldDate) - This is the default field type for fields of type *date*. Note that it also - works with datetime fields. It uses the session timezone when formatting - dates. +Char (`char`) + This is the default field type for fields of type `char`. - - Supported field types: *date*, *datetime* + - Supported field types: `char` - Options: +.. _reference/javascript_reference/date_field: - - datepicker: extra settings for the datepicker_ widget. +Date (`date`) + This is the default field type for fields of type `date`. It consists of a text + box and a date picker. - .. code-block:: xml + - Supported field types: `date` - + Options: -datetime (FieldDateTime) - This is the default field type for fields of type *datetime*. + - `min_date` / `max_date`: sets limit dates for accepted values. By default, the earliest + accepted date is **1000-01-01** and the latest is **9999-12-31**. + Accepted values are SQL-formatted dates (`yyyy-MM-dd HH:mm:ss`) or `"today"`. - - Supported field types: *date*, *datetime* + .. code-block:: xml - Options: + - - datepicker: extra settings for the datepicker_ widget. + - warn_future: displays a warning if the value is in the future (based on today). - .. code-block:: xml + .. code-block:: xml - + -daterange (FieldDateRange) - This widget allows the user to select start and end date into a single picker. +.. _reference/javascript_reference/datetime_field: - - Supported field types: *date*, *datetime* +Date & Time (`datetime`) + This is the default field type for fields of type `datetime`. The values are always + in the client's timezone. - Options: + - Supported field types: `datetime` - - related_start_date: apply on end date field to get start date value which - is used to display range in the picker. - - related_end_date: apply on start date field to get end date value which - is used to display range in the picker. - - picker_options: extra settings for picker. - - .. code-block:: xml + Options: - + - see :ref:`Date Field ` options -remaining_days (RemainingDays) - This widget can be used on date and datetime fields. In readonly, it displays - the delta (in days) between the value of the field and today. The widget is - intended to be used for informative purpose: therefore the value cannot be - modified in edit mode. + - `rounding`: increment used to generate available minutes in the time picker. + This does not affect the actual value, just the amount of available options in + the select dropdown (default: `5`). - - Supported field types: *date*, *datetime* + .. code-block:: xml -monetary (FieldMonetary) - This is the default field type for fields of type 'monetary'. It is used to - display a currency. If there is a currency fields given in option, it will - use that, otherwise it will fall back to the default currency (in the session) + - - Supported field types: *monetary*, *float* +Date Range (`daterange`) + This widget allows the user to select start and end date from a single picker. - Options: + - Supported field types: `date`, `datetime` - - currency_field: another field name which should be a many2one on currency. + Options: - .. code-block:: xml + - see :ref:`Date Field ` or :ref:`Date & Time Field ` options - + - `start_date_field`: field used to get/set the start value of the date range + (cannot be used with `end_date_field`). -text (FieldText) - This is the default field type for fields of type *text*. + .. code-block:: xml - - Supported field types: *text* + + - `end_date_field`: field used to get/set the end value of the date range + (cannot be used with `start_date_field`). -handle (HandleWidget) - This field's job is to be displayed as a *handle*, and allows reordering the - various records by drag and dropping them. + .. code-block:: xml - .. warning:: It has to be specified on the field by which records are sorted. - .. warning:: Having more than one field with a handle widget on the same list is not supported. + - - Supported field types: *integer* +Remaining Days (`remaining_days`) + This widget can be used on date and datetime fields. In readonly, it displays + the delta (in days) between the value of the field and today. The widget turns + into a regular date or datetime field in edit mode. + - Supported field types: `date`, `datetime` -email (FieldEmail) - This field displays email address. The main reason to use it is that it - is rendered as an anchor tag with the proper href, in readonly mode. +Monetary (`monetary`) + This is the default field type for fields of type `monetary`. It is used to + display a currency. If there is a currency fields given in option, it will + use that, otherwise it will fall back to the default currency (in the session) - - Supported field types: *char* + - Supported field types: `monetary`, `float` -phone (FieldPhone) - This field displays a phone number. The main reason to use it is that it - is rendered as an anchor tag with the proper href, in readonly mode, but - only in some cases: we only want to make it clickable if the device can - call this particular number. + Options: - - Supported field types: *char* + - `currency_field`: another field name which should be a many2one on currency. -url (UrlWidget) - This field displays an url (in readonly mode). The main reason to use it is - that it is rendered as an anchor tag with the proper css classes and href. + .. code-block:: xml - Also, the text of the anchor tag can be customized with the *text* attribute - (it won't change the href value). + - .. code-block:: xml +Text (`text`) + This is the default field type for fields of type `text`. - + - Supported field types: `text` - Options: - - website_path: (default:false) by default, the widget forces (if not already - the case) the href value to begin with http:// except if this option is set - to true, thus allowing redirections to the database's own website. +Handle (`handle`) + This field's job is to be displayed as a `handle`, and allows reordering the + various records by drag and dropping them. - - Supported field types: *char* + .. warning:: It has to be specified on the field by which records are sorted. + .. warning:: Having more than one field with a handle widget on the same list is not supported. -domain (FieldDomain) - The "Domain" field allows the user to construct a technical-prefix domain - thanks to a tree-like interface and see the selected records in real time. - In debug mode, an input is also there to be able to enter the prefix char - domain directly (or to build advanced domains the tree-like interface does - not allow to). + - Supported field types: `integer` - Note that this is limited to 'static' domain (no dynamic expression, or access - to context variable). - - Supported field types: *char* +Email (`email`) + This field displays email address. The main reason to use it is that it + is rendered as an anchor tag with the proper href, in readonly mode. -link_button (LinkButton) - The LinkButton widget actually simply displays a span with an icon and the - text value as content. The link is clickable and will open a new browser - window with its value as url. + - Supported field types: `char` - - Supported field types: *char* +Phone (`phone`) + This field displays a phone number. The main reason to use it is that it + is rendered as an anchor tag with the proper href, in readonly mode, but + only in some cases: we only want to make it clickable if the device can + call this particular number. -image (FieldBinaryImage) - This widget is used to represent a binary value as an image. In some cases, - the server returns a 'bin_size' instead of the real image (a bin_size is a - string representing a file size, such as 6.5kb). In that case, the widget - will make an image with a source attribute corresponding to an image on the - server. + - Supported field types: `char` - - Supported field types: *binary* +URL (`url`) + This field displays an url (in readonly mode). The main reason to use it is + that it is rendered as an anchor tag with the proper css classes and href. - Options: + Also, the text of the anchor tag can be customized with the *text* attribute + (it won't change the href value). - - preview_image: if the image is only loaded as a 'bin_size', then this - option is useful to inform the web client that the default field name is - not the name of the current field, but the name of another field. + - Supported field types: `char` - - accepted_file_extensions: the file extension the user can pick from the file input dialog box (default value is `image/\*`) - (cf: ``accept`` attribute on ) + .. code-block:: xml - .. code-block:: xml + - + Options: -binary (FieldBinaryFile) - Generic widget to allow saving/downloading a binary file. + - `website_path`: (default: `false`) by default, the widget forces (if not already + the case) the href value to begin with `"http://"` except if this option is set + to `true`, thus allowing redirections to the database's own website. - - Supported field types: *binary* +Domain (`domain`) + The `domain` field allows the user to construct a technical-prefix domain + thanks to a tree-like interface and see the selected records in real time. + In debug mode, an input is also there to be able to enter the prefix char + domain directly (or to build advanced domains the tree-like interface does + not allow to). - Options: + Note that this is limited to **static** domains (no dynamic expressions, or access + to context variable). - - accepted_file_extensions: the file extension the user can pick from the file input dialog box - (cf: ``accept`` attribute on ) + - Supported field types: `char` - Attribute: +Link button (`link_button`) + The `LinkButton` widget actually simply displays a span with an icon and the + text value as content. The link is clickable and will open a new browser + window with its value as url. - - filename: saving a binary file will lose its file name, since it only - saves the binary value. The filename can be saved in another field. To do - that, an attribute filename should be set to a field present in the view. + - Supported field types: `char` - .. code-block:: xml +Image File (`image`) + This widget is used to represent a binary value as an image. In some cases, + the server returns a `bin_size` instead of the real image (a `bin_size` is a + string representing a file size, such as `"6.5kb"`). In that case, the widget + will make an image with a source attribute corresponding to an image on the + server. - + - Supported field types: `binary` -priority (PriorityWidget) - This widget is rendered as a set of stars, allowing the user to click on it - to select a value or not. This is useful for example to mark a task as high - priority. + Options: - Note that this widget also works in 'readonly' mode, which is unusual. + - `preview_image`: if the image is only loaded as a `bin_size`, then this + option is useful to inform the web client that the default field name is + not the name of the current field, but the name of another field. - - Supported field types: *selection* + .. code-block:: xml -attachment_image (AttachmentImage) - Image widget for many2one fields. If the field is set, this widget will be - rendered as an image with the proper src url. This widget does not have a - different behaviour in edit or readonly mode, it is only useful to view an - image. + - - Supported field types: *many2one* + - `accepted_file_extensions`: the file extension the user can pick from the file input dialog box + (default value is `"image/\*"`) - .. code-block:: xml + (cf: ``accept`` attribute on ``) - +Binary File (`binary`) + Generic widget to allow saving/downloading a binary file. -image_selection (ImageSelection) - Allow the user to select a value by clicking on an image. + - Supported field types: `binary` - - Supported field types: *selection* + Attributes: - Options: a dictionary with a mapping from a selection value to an object with - the url for an image (*image_link*) and a preview image (*preview_link*). + - `filename`: saving a binary file will lose its file name, since it only + saves the binary value. The file name can be saved in another field. To do + that, a `filename` attribute should be set to a field present in the view. - Note that this option is not optional! + .. code-block:: xml - .. code-block:: xml + - + Options: -label_selection (LabelSelection) - This widget renders a simple non-editable label. This is only useful to - display some information, not to edit it. + - `accepted_file_extensions`: the file extension the user can pick from the file input dialog box - - Supported field types: *selection* + (cf: ``accept`` attribute on ``) - Options: +Priority (`priority`) + This widget is rendered as a set of stars, allowing the user to click on it + to select a value or not. This is useful for example to mark a task as high + priority. - - classes: a mapping from a selection value to a css class + Note that this widget also works in `readonly` mode, which is unusual. - .. code-block:: xml + - Supported field types: `selection` - +Image Attachment (`attachment_image`) + Image widget for `many2one` fields. If the field is set, this widget will be + rendered as an image with the proper src url. This widget does not have a + different behaviour in edit or readonly mode, it is only useful to view an + image. -state_selection (StateSelectionWidget) - This is a specialized selection widget. It assumes that the record has some - hardcoded fields, present in the view: *stage_id*, *legend_normal*, - *legend_blocked*, *legend_done*. This is mostly used to display and change - the state of a task in a project, with additional information displayed in - the dropdown. + - Supported field types: `many2one` - - Supported field types: *selection* + .. code-block:: xml - .. code-block:: xml + - +Label Selection (`label_selection`) + This widget renders a simple non-editable label. This is only useful to + display some information, not to edit it. -kanban_state_selection (StateSelectionWidget) - This is exactly the same widget as state_selection + - Supported field types: `selection` - - Supported field types: *selection* + Options: -list.state_selection (ListStateSelectionWidget) - In list views, the state_selection widget displays by default the label next to the icon. + - `classes`: a mapping from a selection value to a CSS class name - - Supported field types: *selection* + .. code-block:: xml - Options: + - - hide_label: hide the label next to the icon +State Selection (`state_selection`) + This is a specialized selection widget. It assumes that the record has some + hardcoded fields, present in the view: `stage_id`, `legend_normal`, + `legend_blocked`, `legend_done`. This is mostly used to display and change + the state of a task in a project, with additional information displayed in + the dropdown. - .. code-block:: xml + - Supported field types: `selection` - + .. code-block:: xml -boolean_favorite (FavoriteWidget) - This widget is displayed as an empty (or not) star, depending on a boolean - value. Note that it also can be edited in readonly mode. + - - Supported field types: *boolean* +State Selection - List View (`list.state_selection`) + In list views, the `state_selection` field displays by default the label next to the icon. -boolean_button (FieldBooleanButton) - The Boolean Button widget is meant to be used in a stat button in a form view. - The goal is to display a nice button with the current state of a boolean - field (for example, 'Active'), and allow the user to change that field when - clicking on it. + - Supported field types: `selection` - Note that it also can be edited in readonly mode. + Options: - - Supported field types: *boolean* + - `hide_label`: hide the label next to the icon - Options: + .. code-block:: xml - - terminology: it can be either 'active', 'archive', 'close' or a customized - mapping with the keys *string_true*, *string_false*, *hover_true*, *hover_false* + - .. code-block:: xml +Favorite (`boolean_favorite`) + This widget is displayed as an empty (or not) star, depending on a boolean + value. Note that it also can be edited in readonly mode. - + - Supported field types: `boolean` -boolean_toggle (BooleanToggle) - Displays a toggle switch to represent a boolean. This is a subfield of - FieldBoolean, mostly used to have a different look. +Toggle (`boolean_toggle`) + Displays a toggle switch to represent a boolean. This is a subfield of the + `boolean` field, mostly used to have a different look. -statinfo (StatInfo) - This widget is meant to represent statistical information in a *stat button*. - It is basically just a label with a number. + - Supported field types: `boolean` - - Supported field types: *integer, float* +Stat Info (`statinfo`) + This widget is meant to represent statistical information in a `stat button`. + It is basically just a label with a number. - Options: + - Supported field types: `integer`, `float` - - label_field: if given, the widget will use the value of the label_field as - text. + Options: - .. code-block:: xml + - `label_field`: if given, the widget will use the value of the `label_field` as text. - + .. code-block:: xml -percentpie (FieldPercentPie) - This widget is meant to represent statistical information in a *stat button*. - This is similar to a statinfo widget, but the information is represented in - a *pie* chart (empty to full). Note that the value is interpreted as a - percentage (a number between 0 and 100). + - - Supported field types: *integer, float* +Percent Pie (`percentpie`) + This widget is meant to represent statistical information in a `stat button`. + This is similar to a statinfo widget, but the information is represented in + a **pie chart** (empty to full). Note that the value is interpreted as a + percentage (a number between `0` and `100`). - .. code-block:: xml + - Supported field types: `integer`, `float` - + .. code-block:: xml -progressbar (FieldProgressBar) - Represent a value as a progress bar (from 0 to some value) + - - Supported field types: *integer, float* +Progress Bar (`progressbar`) + Represent a value as a progress bar (from `0` to some value) - Options: + - Supported field types: `integer`, `float` - - editable: boolean if value is editable - - current_value: get the current_value from the field that must be present in the view - - max_value: get the max_value from the field that must be present in the view - - edit_max_value: boolean if the max_value is editable - - title: title of the bar, displayed on top of the bar --> not translated, - use parameter (not option) "title" instead + Options: - .. code-block:: xml + - `editable`: boolean determining whether the `value` is editable - + - `current_value`: get the current value from the field that must be present in the view -toggle_button (FieldToggleBoolean) - This widget is intended to be used on boolean fields. It toggles a button - switching between a green bullet / gray bullet. It also set up a tooltip, - depending on the value and some options. + - `max_value`: get the maximum value from the field that must be present in the view - - Supported field types: *boolean* + - `edit_max_value`: boolean determining whether the `max_value` is editable - Options: + - `title`: title of the bar, displayed on top of the bar - - active: the string for the tooltip that should be set when boolean is true - - inactive: the tooltip that should be set when boolean is false + -> not translated, use `title` attribute (not option) instead if the term must be translated - .. code-block:: xml + .. code-block:: xml - + -dashboard_graph (JournalDashboardGraph) - This is a more specialized widget, useful to display a graph representing a - set of data. For example, it is used in the accounting dashboard kanban view. +Journal Dashboard Graph (`dashboard_graph`) + This is a more specialized widget, useful to display a graph representing a + set of data. For example, it is used in the accounting dashboard kanban view. - It assumes that the field is a JSON serialization of a set of data. + It assumes that the field is a JSON serialization of a set of data. - - Supported field types: *char* + - Supported field types: `char` - Attribute + Attributes: - - graph_type: string, can be either 'line' or 'bar' + - `graph_type`: string, can be either `"line"` or `"bar"` - .. code-block:: xml + .. code-block:: xml - + -ace (AceEditor) - This widget is intended to be used on Text fields. It provides Ace Editor - for editing XML and Python. +Ace Editor (`ace`) + This widget is intended to be used on Text fields. It provides Ace Editor + for editing XML and Python. - - Supported field types: *char, text* + - Supported field types: `char`, `text` -- badge (FieldBadge) +Badge (`badge`) Displays the value inside a bootstrap badge pill. - - Supported field types: *char*, *selection*, *many2one* + - Supported field types: `char`, `selection`, `many2one` - By default, the badge has a lightgrey background, but it can be customized - by using the decoration-X mechanism. For instance, to display a red badge - under a given condition: + By default, the badge has a light grey background, but it can be customized + by using the :ref:`Decoration ` mechanism. + For instance, to display a red badge under a given condition: .. code-block:: xml - + Relational fields ----------------- -.. class:: web.relational_fields.FieldSelection +Selection (`selection`) - Supported field types: *selection* + - Supported field types: `selection` - .. attribute:: placeholder + Attributes: - a string which is used to display some info when no value is selected + - `placeholder`: a string which is used to display some info when no value is selected - .. code-block:: xml + .. code-block:: xml - + -radio (FieldRadio) - This is a subfield of FielSelection, but specialized to display all the - valid choices as radio buttons. +Radio (`radio`) + This is a subfield of `FielSelection`, but specialized to display all the + valid choices as radio buttons. - Note that if used on a many2one records, then more rpcs will be done to fetch - the name_gets of the related records. + Note that if used on a many2one records, then more rpcs will be done to fetch + the name_gets of the related records. - - Supported field types: *selection, many2one* + - Supported field types: `selection`, `many2one` - Options: + Options: - - horizontal: if true, radio buttons will be displayed horizontally. + - `horizontal`: if `true`, radio buttons will be displayed horizontally. - .. code-block:: xml + .. code-block:: xml - + -selection_badge (FieldSelectionBadge) - This is a subfield of FieldSelection, but specialized to display all the - valid choices as rectangular badges. +Badge Selection (`selection_badge`) + This is a subfield of `selection` field, but specialized to display all the + valid choices as rectangular badges. - - Supported field types: *selection, many2one* + - Supported field types: `selection`, `many2one` - .. code-block:: xml + .. code-block:: xml - + -many2one (FieldMany2One) - Default widget for many2one fields. +Many2one (`many2one`) + Default widget for many2one fields. - - Supported field types: *many2one* + - Supported field types: `many2one` - Attributes: + Attributes: - - can_create: allow the creation of related records (take precedence over no_create - option) - - can_write: allow the editing of related records (default: true) + - `can_create`: allow the creation of related records + (takes precedence over `no_create` option) - Options: + - `can_write`: allow the editing of related records (default: `true`) - - quick_create: allow the quick creation of related records (default: true) - - no_create: prevent the creation of related records - hide both the 'Create "xxx"' - and "Create and Edit..." dropdown menu items (default: false) - - no_quick_create: prevent the quick creation of related records - hide the 'Create "xxx"' - dropdown menu item (default: false) - - no_create_edit: hide the "Create and Edit..." dropdown menu item (default: false) - - create_name_field: when creating a related record, if this option is set, the value of the *create_name_field* will be filled with the value of the input (default: *name*) - - always_reload: boolean, default to false. If true, the widget will always - do an additional name_get to fetch its name value. This is used for the - situations where the name_get method is overridden (please do not do that) - - no_open: boolean, default to false. If set to true, the many2one will not - redirect on the record when clicking on it (in readonly mode) + Options: - .. code-block:: xml + - `quick_create`: allow the quick creation of related records (default: `true`) - + - `no_create`: prevent the creation of related records - hide both the **Create "xxx"** + and **Create and Edit** dropdown menu items (default: `false`) -list.many2one (ListFieldMany2One) - Default widget for many2one fields (in list view). + - `no_quick_create`: prevent the quick creation of related records - hide the **Create "xxx"** + dropdown menu item (default: `false`) - Specialization of many2one field for list views. The main reason is that we - need to render many2one fields (in readonly mode) as a text, which does not - allow opening the related records. + - `no_create_edit`: hide the **Create and Edit** dropdown menu item (default: `false`) - - Supported field types: *many2one* + - `create_name_field`: when creating a related record, if this option is set, + the value of the `create_name_field` will be filled with the value of the input + (default: `name`) -many2one_barcode (FieldMany2OneBarcode) - Widget for many2one fields allows to open the camera from a mobile device (Android/iOS) to scan a barcode. + - `always_reload`: boolean, default to `false`. If `true`, the widget will always + do an additional `name_get` to fetch its name value. This is used for the + situations where the `name_get` method is overridden (please do not do that) - Specialization of many2one field where the user is allowed to use the native camera to scan a barcode. - Then it uses name_search to search this value. + - `no_open`: boolean, default to `false`. If set to `true`, the many2one will not + redirect on the record when clicking on it (in readonly mode) - If this widget is set and user is not using the mobile application, - it will fallback to regular many2one (FieldMany2One) + .. code-block:: xml - - Supported field types: *many2one* + -many2one_avatar (Many2OneAvatar) - This widget is only supported on many2one fields pointing to a model which - inherits from 'image.mixin'. In readonly, it displays the image of the - related record next to its display_name. Note that the display_name isn't a - clickable link in this case. In edit, it behaves exactly like the regular - many2one. +Many2one Barcode (`many2one_barcode`) + Widget for `many2one` fields allows to open the camera from a mobile device (Android/iOS) to scan a barcode. - - Supported field types: *many2one* + Specialization of `many2one` field where the user is allowed to use the native camera to scan a barcode. + Then it uses `name_search` to search this value. -many2one_avatar_user (Many2OneAvatarUser) - This widget is a specialization of the Many2OneAvatar. When the avatar is - clicked, we open a chat window with the corresponding user. This widget can - only be set on many2one fields pointing to the 'res.users' model. + If this widget is set and user is not using the mobile application, + it will fallback to regular `many2one` (`Many2OneField`) - - Supported field types: *many2one* (pointing to 'res.users') + - Supported field types: `many2one` -many2one_avatar_employee (Many2OneAvatarEmployee) - Same as Many2OneAvatarUser, but for many2one fields pointing to 'hr.employee'. +Many2one Avatar (`many2one_avatar`) + This widget is only supported on `many2one` fields pointing to a model which + inherits from `image.mixin`. In readonly, it displays the image of the + related record next to its `display_name`. Note that the `display_name` isn't a + clickable link in this case. In edit, it behaves exactly like the regular + `many2one`. - - Supported field types: *many2one* (pointing to 'hr.employee') + - Supported field types: `many2one` -kanban.many2one (KanbanFieldMany2One) - Default widget for many2one fields (in kanban view). We need to disable all - editing in kanban views. +Many2one Avatar User (`many2one_avatar_user`) + This widget is a specialization of the `Many2OneAvatar`. When the avatar is + clicked, we open a chat window with the corresponding user. This widget can + only be set on `many2one` fields pointing to the `res.users` model. - - Supported field types: *many2one* + - Supported field types: `many2one` (pointing to `res.users`) -many2many (FieldMany2Many) - Default widget for many2many fields. +Many2one Avatar Employee (`many2one_avatar_employee`) + Same as `many2one_avatar_user`, but for `many2one` fields pointing to `hr.employee`. - - Supported field types: *many2many* + - Supported field types: `many2one` (pointing to `hr.employee`) - Attributes: +Many2many (`many2many`) + Default widget for `many2many` fields. - - mode: string, default view to display - - domain: restrict the data to a specific domain + - Supported field types: `many2many` - Options: + Attributes: - - create_text: allow the customization of the text displayed when adding a - new record - - link: domain determining whether or not records can be added to the relation (default: True). - - unlink: domain determining whether or not records can be removed from the relation (default: True). + - `mode`: string, default view to display -many2many_binary (FieldMany2ManyBinaryMultiFiles) - This widget helps the user to upload or delete one or more files at the same - time. + - `domain`: restrict the data to a specific domain - Note that this widget is specific to the model 'ir.attachment'. + Options: - - Supported field types: *many2many* + - `create_text`: allow the customization of the text displayed when adding a new record - Options: + - `link`: domain determining whether records can be added to the relation (default: `true`). - - accepted_file_extensions: the file extension the user can pick from the file input dialog box - (cf: ``accept`` attribute on ) + - `unlink`: domain determining whether records can be removed from the relation (default: `true`). -many2many_tags (FieldMany2ManyTags) - Display many2many as a list of tags. +Many2many Binary File (`many2many_binary`) + This widget helps the user to upload or delete one or more files at the same time. - - Supported field types: *many2many* + Note that this widget is specific to the model `ir.attachment`. - Options: + - Supported field types: `many2many` - - create: domain determining whether or not new tags can be created (default: True). + Options: - .. code-block:: xml + - `accepted_file_extensions`: the file extension the user can pick from the file input dialog box - + (cf: ``accept`` attribute on ``) - - color_field: the name of a numeric field, which should be present in the - view. A color will be chosen depending on its value. +Many2many Tags (`many2many_tags`) + Display a `many2many` field as a list of tags. - .. code-block:: xml + - Supported field types: `many2many` + + Options: - + - `create`: domain determining whether or not new tags can be created (default: `true`). - - no_edit_color: set to True to remove the possibility to change the color of the tags (default: False). + .. code-block:: xml - .. code-block:: xml + - + - `color_field`: the name of a numeric field, which should be present in the view. + A color will be chosen depending on its value. -form.many2many_tags (FormFieldMany2ManyTags) - Specialization of many2many_tags widget for form views. It has some extra - code to allow editing the color of a tag. + .. code-block:: xml - - Supported field types: *many2many* + -kanban.many2many_tags (KanbanFieldMany2ManyTags) - Specialization of many2many_tags widget for kanban views. + - `no_edit_color`: set to `true` to remove the possibility to change the color of the tags + (default: `false`). - - Supported field types: *many2many* + .. code-block:: xml -many2many_checkboxes (FieldMany2ManyCheckBoxes) - This field displays a list of checkboxes and allows the user to select a - subset of the choices. Note that the number of displayed values is limited to - 100. This limit isn't customizable. It simply allows to handle extreme cases - where this widget is wrongly set on a field with a huge comodel. In those - cases, a list view is more adequate as it allows pagination and filtering. + - - Supported field types: *many2many* +Many2many Tags - Form View (`form.many2many_tags`) + Specialization of `many2many_tags` widget for form views. It has some extra + code to allow editing the color of a tag. -one2many (FieldOne2Many) - Default widget for one2many fields. + - Supported field types: `many2many` - It usually displays data in a sub list view, or a sub kanban view. +Many2many Tags - Kanban View (`kanban.many2many_tags`) + Specialization of `many2many_tags` widget for kanban views. - - Supported field types: *one2many* + - Supported field types: `many2many` - Options: +Many2many Checkboxes (`many2many_checkboxes`) + This field displays a list of checkboxes and allows the user to select a + subset of the choices. Note that the number of displayed values is limited to + `100`. This limit isn't customizable. It simply allows to handle extreme cases + where this widget is wrongly set on a field with a huge comodel. In those + cases, a list view is more adequate as it allows pagination and filtering. - - create: domain determining whether or not related records can be created (default: True). + - Supported field types: `many2many` - - delete: domain determining whether or not related records can be deleted (default: True). +One2many (`one2many`) + Default widget for `one2many` fields. + It usually displays data in a sub list view, or a sub kanban view. - .. code-block:: xml + - Supported field types: `one2many` - + Options: - - create_text: a string that is used to customize the 'Add' label/text. + - `create`: domain determining whether or not related records can be created (default: `true`). - .. code-block:: xml + - `delete`: domain determining whether or not related records can be deleted (default: `true`). + + .. code-block:: xml - + -statusbar (FieldStatus) - This is a really specialized widget for the form views. It is the bar on top - of many forms which represent a flow, and allow selecting a specific state. + - `create_text`: a string that is used to customize the 'Add' label/text. - - Supported field types: *selection, many2one* + .. code-block:: xml -reference (FieldReference) - The FieldReference is a combination of a select (for the model) and a - FieldMany2One (for its value). It allows the selection of a record on an - arbitrary model. + - - Supported field types: *char, reference* +Status Bar (`statusbar`) + This is a field specific to the form views. It is the bar on top + of many forms which represent a flow, and allow selecting a specific state. + + - Supported field types: `selection`, `many2one` + +Reference (`reference`) + The `reference` field is a combination of a select (for the model) and a + `many2one` field (for its value). It allows the selection of a record on an + arbitrary model. + + - Supported field types: `char`, `reference` Options: - - model_field: name of a FieldMany2One('ir.model') containing the model of the records that can be selected. - When this option is set, the select part of the FieldReference isn't displayed. + - `model_field`: name of an `ir.model` containing the model of the records that can be selected. + When this option is set, the select part of the `reference` field isn't displayed. Widgets ------- -week_days (WeekDays) - This field displays a list of checkboxes for week days, 1 checkbox for each day - and allow the user to select a subset of the choices. +Week Days (`week_days`) + This widget displays a list of checkboxes for week days, 1 checkbox for each day + and allow the user to select a subset of the choices. - .. code-block:: xml + .. code-block:: xml - + Client actions ============== diff --git a/content/developer/reference/frontend/owl_components.rst b/content/developer/reference/frontend/owl_components.rst index d645658c15..f677268fc2 100644 --- a/content/developer/reference/frontend/owl_components.rst +++ b/content/developer/reference/frontend/owl_components.rst @@ -1019,6 +1019,31 @@ The shape of a `group` is the following: :alt: Example of SelectMenu used with multiple selection :align: center + For more advanced use cases, you can customize the bottom area of the dropdown, using the `bottomArea` slot. Here, we choose to display + a button with the corresponding value set in the search input. + + .. code-block:: javascript + + MyComponent.template = owl.tags.xml` + + Select something + +
+ +
+
+
+ `; + + .. image:: owl_components/select_menu_bottomArea.png + :width: 400 px + :alt: Example of SelectMenu's bottom area customization + :align: center + .. _frontend/tags_list: TagsList @@ -1062,6 +1087,7 @@ Props The shape of a `tag` is the following: - `colorIndex` is an optional color id. + - `icon` is an optional icon displayed just before the displayed text. - `id` is a unique identifier for the tag. - `img` is an optional image displayed in a circle, just before the displayed text. - `onClick` is an optional callback that can be given to the element. This allows the parent element to handle any functionality depending on the tag clicked. diff --git a/content/developer/reference/frontend/owl_components/select_menu_bottomArea.png b/content/developer/reference/frontend/owl_components/select_menu_bottomArea.png new file mode 100644 index 0000000000..09bed513d7 Binary files /dev/null and b/content/developer/reference/frontend/owl_components/select_menu_bottomArea.png differ diff --git a/content/developer/reference/frontend/patching_code.rst b/content/developer/reference/frontend/patching_code.rst index e74fb4d7fe..99e0a3f779 100644 --- a/content/developer/reference/frontend/patching_code.rst +++ b/content/developer/reference/frontend/patching_code.rst @@ -18,24 +18,18 @@ Description The patch function is located in `@web/core/utils/patch`: -.. js:function:: patch(obj, patchName, patchValue, options) +.. js:function:: patch(objToPatch, extension) - :param Object obj: object that should be patched - :param string patchName: unique string describing the patch - :param Object patchValue: an object mapping each key to a patchValue - :param Object options: option object (see below) + :param object objToPatch: the object that should be patched + :param object extension: an object mapping each key to an extension + :returns: a function to remove the patch - The `patch` function modifies in place the `obj` object (or class) and - applies all key/value described in the `patchValue` object. This operation - is registered under the `patchName` name, so it can be unpatched later if - necessary. + The `patch` function modifies in place the `objToPatch` object (or class) and + applies all key/value described in the `extension` object. An unpatch + function is returned, so it can be used to remove the patch later if necessary. Most patch operations provide access to the parent value by using the - `_super` property (see below in the examples). To do that, the `patch` method - wraps each pair key/value in a getter that dynamically binds `_super`. - - The only option is `pure (boolean)`. If set to `true`, the patch operation - does not bind the `_super` property. + native `super` keyword (see below in the examples). Patching a simple object ======================== @@ -53,7 +47,7 @@ Here is a simple example of how an object can be patched: }, }; - patch(object, "patch name", { + patch(object, { fn() { // do things }, @@ -61,49 +55,45 @@ Here is a simple example of how an object can be patched: When patching functions, we usually want to be able to access the ``parent`` -function. Since we are working with patch objects, not ES6 classes, we cannot -use the native ``super`` keyword. So, Odoo provides a special method to simulate -this behaviour: ``this._super``: +function. To do so, we can simply use the native ``super`` keyword: .. code-block:: javascript - patch(object, "_super patch", { + patch(object, { fn() { - this._super(...arguments); + super.fn(...arguments); // do other things }, }); .. warning:: - ``this._super`` is reassigned after each patched function is called. - This means that if you use an asynchronous function in the patch then you - cannot call ``this._super`` after an ``await``, because it may or may not be - the function that you expect. The correct way to do that is to keep a reference - to the initial ``_super`` method: - - .. code-block:: javascript + ``super`` can only be used in a method not a function. This means that the + following constructs are invalid for javascript. - patch(object, "async _super patch", { - async myAsyncFn() { - const _super = this._super.bind(this); - await Promise.resolve(); - await _super(...arguments); - // await this._super(...arguments); // this._super is undefined. - }, - }); + .. code-block:: javascript + const obj = { + a: function () { + // Throws: "Uncaught SyntaxError: 'super' keyword unexpected here" + super.a(); + }, + b: () => { + // Throws: "Uncaught SyntaxError: 'super' keyword unexpected here" + super.b(); + }, + }; Getters and setters are supported too: .. code-block:: javascript - patch(object, "getter/setter patch", { + patch(object, { get number() { - return this._super() / 2; + return super.number / 2; }, set number(value) { - this._super(value * 2); + super.number = value; }, }); @@ -124,12 +114,12 @@ the `prototype`: } // this will patch static properties!!! - patch(MyClass, "static patch", { + patch(MyClass, { myStaticFn() {...}, }); // this is probably the usual case: patching a class method - patch(MyClass.prototype, "prototype patch", { + patch(MyClass.prototype, { myPrototypeFn() {...}, }); @@ -149,9 +139,9 @@ constructor and patch that method instead: } } - patch(MyClass.prototype, "constructor", { + patch(MyClass.prototype, { setup() { - this._super(...arguments); + super.setup(...arguments); this.doubleNumber = this.number * 2; }, }); @@ -165,11 +155,11 @@ Patching a component Components are defined by javascript classes, so all the information above still holds. For these reasons, Owl components should use the `setup` method, so they -can easily be patched as well (see the section on :ref:`best practices`. +can easily be patched as well (see the section on :ref:`best practices`). .. code-block:: javascript - patch(MyComponent.prototype, "my patch", { + patch(MyComponent.prototype, { setup() { useMyHook(); }, @@ -178,19 +168,91 @@ can easily be patched as well (see the section on :ref:`best practices`_). +A function returning the object used to patch can be used to make it unique. + +.. code-block:: javascript + + const obj1 = { + method() { + doSomething(); + }, + }; + + const obj2 = { + method() { + doThings(); + }, + }; + + function createExtensionObj() { + return { + method() { + super.method(); + doCommonThings(); + }, + }; + } + + patch(obj1, createExtensionObj()); + patch(obj2, createExtensionObj()); + +.. warning:: + + If an `extension` is based on another then the two extensions should + be applied separately. Do not copy/clone an extension. + + .. code-block:: javascript - patch(object, "patch name", { ... }); - // test stuff here - unpatch(object, "patch name"); + const object = { + method1() { + doSomething(); + }, + method2() { + doAnotherThing(); + }, + }; + + const ext1 = { + method1() { + super.method1(); + doThings(); + }, + }; + + const invalid_ext2 = { + ...ext1, // this will not work: super will not refer to the correct object in methods coming from ext1 + method2() { + super.method2(); + doOtherThings(); + }, + }; + + patch(object, invalid_ext2); + object.method1(); // throws: Uncaught TypeError: (intermediate value).method1 is not a function + + const valid_ext2 = { + method2() { + super.method2(); + doOtherThings(); + }, + }; + + patch(object, ext1); // first patch base extension + patch(object, valid_ext2); // then the new one + object.method1(); // works as expected diff --git a/content/developer/tutorials/getting_started/04_basicmodel.rst b/content/developer/tutorials/getting_started/04_basicmodel.rst index 16887d63be..1c4e2d2310 100644 --- a/content/developer/tutorials/getting_started/04_basicmodel.rst +++ b/content/developer/tutorials/getting_started/04_basicmodel.rst @@ -57,12 +57,11 @@ model:: from odoo import models class TestModel(models.Model): - _name = "test.model" + _name = "test_model" -This definition is enough for the ORM to generate a database table named ``test_model``. The -``.`` in the model ``_name`` is automatically converted into a ``_`` by the ORM. By convention all -models are located in a ``models`` directory and each model is defined in its own Python -file. +This definition is enough for the ORM to generate a database table named `test_model`. By +convention all models are located in a `models` directory and each model is defined in its own +Python file. Take a look at how the ``crm_recurring_plan`` table is defined and how the corresponding Python file is imported: @@ -123,7 +122,7 @@ defined as attributes in the model class:: from odoo import fields, models class TestModel(models.Model): - _name = "test.model" + _name = "test_model" _description = "Test Model" name = fields.Char() diff --git a/content/developer/tutorials/getting_started/07_basicviews.rst b/content/developer/tutorials/getting_started/07_basicviews.rst index bc8d3acc60..f919bb0941 100644 --- a/content/developer/tutorials/getting_started/07_basicviews.rst +++ b/content/developer/tutorials/getting_started/07_basicviews.rst @@ -218,6 +218,16 @@ services *OR* have a unit price which is *NOT* between 1000 and 2000':: ('unit_price', '>=', 1000), ('unit_price', '<', 2000)] +.. note:: XML does not allow ``<`` and ``&`` to be used inside XML + elements. To avoid parsing errors, entity references should be used: + ``<`` for ``<`` and ``&`` for ``&``. Other entity references + (``>``, ``'`` & ``"``) are optional. + + .. example:: + .. code-block:: xml + + + .. exercise:: Add filter and Group By. The following should be added to the previously created search view: diff --git a/content/developer/tutorials/getting_started/13_inheritance.rst b/content/developer/tutorials/getting_started/13_inheritance.rst index dbf7077853..bf1fe5ac0b 100644 --- a/content/developer/tutorials/getting_started/13_inheritance.rst +++ b/content/developer/tutorials/getting_started/13_inheritance.rst @@ -151,11 +151,12 @@ By convention, each inherited model is defined in its own Python file. In our ex - Add the following field to ``res.users``: - ===================== ====================================================== + ===================== ================================================================ Field Type - ===================== ====================================================== - property_ids One2many inverse of ``user_id`` to ``estate.property`` - ===================== ====================================================== + ===================== ================================================================ + property_ids One2many inverse of the field that references the salesperson in + ``estate.property`` + ===================== ================================================================ - Add a domain to the field so it only lists the available properties. diff --git a/content/legal/terms/i18n/enterprise_pt_BR.rst b/content/legal/terms/i18n/enterprise_pt_BR.rst new file mode 100644 index 0000000000..fffee25f1c --- /dev/null +++ b/content/legal/terms/i18n/enterprise_pt_BR.rst @@ -0,0 +1,664 @@ +.. _enterprise_agreement_pt: + +=========================================== +Odoo Enterprise Subscription Agreement (PT) +=========================================== + +.. only:: html + + `Download PDF `_ +.. warning:: + Esta é uma tradução em português do Contrato “Odoo Enterprise Subscription Agreement”. + A tradução é fornecida com o intuito de facilitar a sua compreensão, mas não tem + valor legal. A única referência oficial aos termos do Contrato “Odoo Enterprise Subscription Agreement” + é a :ref:`versão original em inglês `. + +.. note:: Versão 10a - 2022-10-27 + +.. v6: add "App" definition + update pricing per-App +.. v7: remove possibility of price change at renewal after prior notice +.. 7.1: specify that 7% renewal increase applies to all charges, not just per-User. +.. v8.0: adapt for "Self-Hosting" + "Data Protection" for GDPR +.. v8a: minor wording changes, tuned User definition, + copyright guarantee +.. v9.0: add "Working with an Odoo Partner" + Maintenance of [Covered] Extra Modules + simplifications +.. v9a: clarification wrt second-level assistance for standard features +.. v9b: clarification that maintenance is opt-out + name of `cloc` command (+ paragraph 5.1 was partially outdated in FR) +.. v9c: minor wording changes, tuned User definition, + copyright guarantee (re-application of v8a changes + on all branches) +.. v9c2: minor simplification in FR wording +.. v10: fall 2022 pricing change - removal of "per app" notions +.. v10.001FR: typo: removed 1 leftover 16€/10LoC price +.. v10a: clarified wording for Section 5.1 "(at that time)" + +Ao assinar os serviços do Odoo Enterprise (os "Serviços") fornecidos pela Odoo SA e suas +afiliadas (coletivamente, "Odoo SA") em relação ao Odoo Enterprise Edition ou Odoo +Community Edition (o "Logiciel"), hospedado nas plataformas de nuvem da Odoo SA ("Cloud +Platform") ou no local ("Hospedagem Própria"), você (o "Cliente") concorda em estar +vinculado aos seguintes termos e condições (o "Contrato"). + +.. _term_pt: + +1 Vigência do Contrato +====================== + +A duração deste Contrato (a "Vigência") será especificada por escrito no ato da celebração +deste Contrato, começando a partir da data de assinatura. O Contrato é automaticamente +renovado por uma Vigência igual, a menos que qualquer uma das partes forneça um aviso por +escrito de rescisão para a outra parte, no mínimo 30 dias antes do final da Vigência. + +.. _definitions_pt: + +2 Definições +============ + +Usuário + Qualquer conta de usuário indicada como ativa no Software, com acesso ao modo de criação e/ou edição. + Contas de usuário desativadas e contas usadas por pessoas externas (ou sistemas) + que têm apenas acesso limitado ao Software por meio das instalações do portal (conhecidas como + "Usuários do Portal") não são consideradas como Usuários. + +App + Um "Aplicativo" (App) é um grupo especializado de recursos disponíveis para instalação no Software. + +Parceiro Odoo + Um Parceiro Odoo é uma empresa ou indivíduo terceirizado, escolhido pelo Cliente e que + trabalha com o Cliente para seus serviços relacionados ao Odoo. O Cliente pode decidir a + qualquer momento trabalhar com um Parceiro Odoo diferente ou trabalhar diretamente com a + Odoo SA (sujeito a aviso prévio). + +Módulo Extra + Um Módulo Extra é um diretório de arquivos de código-fonte ou um conjunto de + customizações baseadas em Python, criadas em uma base de dados (por exemplo, com o Odoo + Studio), que adiciona recursos ou altera o comportamento padrão do Software. Pode ter sido + desenvolvido pelo Cliente, pela Odoo SA, por um Parceiro Odoo em nome do Cliente ou por + terceiros. + +Módulo Extra Coberto + Um Módulo Extra Coberto é um Módulo Extra pelo qual o Cliente escolhe pagar uma taxa de + manutenção para obter serviços de suporte, atualização e correção de bugs. + +Bug + É considerado Bug qualquer falha do Software ou de um Módulo Extra Coberto que resulte em + uma parada completa, rastreamento de erro ou violação de segurança e não seja causada + diretamente por uma instalação ou configuração defeituosa. A não conformidade com + especificações ou requisitos será considerada como Bug, a critério da Odoo SA (normalmente, + quando o Software não produz os resultados ou desempenho para o qual foi projetado ou + quando um recurso específico do país não atende mais aos requisitos legais de contabilidade). + +Versões Cobertas + A menos que seja especificado, os Serviços fornecidos sob este Contrato são aplicáveis apenas + às Versões Cobertas do Software, que incluem as 3 versões principais lançadas mais + recentemente. + +Plano de Assinatura + Um Plano de Assinatura define um conjunto de Aplicativos, recursos e soluções de + hospedagem cobertos por este Contrato e é definido por escrito na celebração deste Contrato. + +.. _enterprise_access_pt: + +3 Acesso ao Software +==================== + +O Cliente pode utilizar o Software hospedado na Cloud Platform, ou escolher a opção de +Hospedagem Própria. A Cloud Platform é hospedada e totalmente gerenciada pela Odoo SA e +acessada remotamente pelo Cliente. Com a opção de Hospedagem Própria, o Cliente hospeda +o Software em sistemas de computador de sua escolha, que não estão sob o controle da Odoo SA. + +Durante a vigência deste Contrato, a Odoo SA concede ao Cliente uma licença não exclusiva e +intransferível para usar (executar, modificar, executar após modificação) o software Odoo +Enterprise Edition, nos termos estabelecidos em :ref:`appendix_a_pt`. + +O Cliente concorda em tomar todas as medidas necessárias para garantir a execução inalterada +da parte do Software que verifica a validade de uso do Odoo Enterprise Edition e coleta +estatísticas para esse fim, incluindo, entre outros, a execução de uma instância, o número de +Usuários, os Aplicativos instalados e o número de linhas de código dos Módulos Extras Cobertos. + +A Odoo SA compromete-se a não divulgar figuras individuais ou nomeadas a terceiros sem o +consentimento do Cliente, e a tratar todos os dados recolhidos em conformidade com a sua +Política de Privacidade oficial, publicada em https://www.odoo.com/privacy. + +Após a expiração ou rescisão deste Contrato, esta licença é revogada imediatamente e o Cliente +concorda em parar de usar o software Odoo Enterprise Edition e a Cloud Platform. + +Se o Cliente violar os termos desta seção, o Cliente concorda em pagar à Odoo SA uma taxa +extra igual a 300% do preço de tabela aplicável ao número real de Usuários. + +.. _services_pt: + +4 Serviços +========== + +.. _bugfix_pt: + +4.1 Serviço de Correção de Bugs +------------------------------- + +Durante a vigência deste Contrato, a Odoo SA se compromete a realizar todos os esforços +razoáveis para corrigir qualquer Bug do Software e Módulos Extras Cobertos relatados pelo +Cliente por meio de um canal apropriado (normalmente, o formulário da Web ou os números +de telefone listados em http://www.odoo.com.help, ou, ao trabalhar com um parceiro Odoo, o canal +fornecido pelo parceiro) e começar a lidar com essas solicitações do Cliente em 2 dias úteis. + +Assim que o Bug for corrigido, uma solução apropriada será comunicada ao Cliente. Se o +Cliente estiver usando uma Versão Coberta, ele não será solicitado a atualizar para uma Versão +Coberta mais recente do Software como solução para um Bug. + +Quando um Bug é corrigido em qualquer Versão Coberta, a Odoo SA se compromete a corrigir +o Bug em todas as Versões Cobertas mais recentes do Software. + +Ambas as partes reconhecem que, conforme especificado na licença do Software e na seção +:ref:`liability_pt` deste Contrato, a Odoo SA não pode ser responsabilizada por Bugs +no Software ou nos Módulos Extras Cobertos. + +4.2 Serviço de Atualizações de Segurança +---------------------------------------- + +.. _secu_self_hosting_pt: + +Hospedagem Própria +~~~~~~~~~~~~~~~~~~ + +Durante a vigência deste Contrato, a Odoo SA se compromete a enviar um “Aviso de +Segurança” ao Cliente para qualquer Bug de segurança descoberto nas Versões Cobertas do +Software (isso exclui Módulos Extras), pelo menos 2 semanas antes de publicar o Comunicado +de Segurança, a menos que o Bug já tenha sido divulgado publicamente por terceiros. Os +Comunicados de Segurança incluem uma descrição completa do Bug, sua causa, seus possíveis +impactos nos sistemas do Cliente e a solução correspondente para cada Versão Coberta. + +O Cliente entende que o Bug e as informações do Comunicado de Segurança devem ser +tratados como Informações Confidenciais conforme descrito em +:ref:`confidentiality_pt` durante o período de embargo que precede a divulgação pública. + +.. _secu_cloud_platform_pt: + +Cloud Platform +~~~~~~~~~~~~~~ + +A Odoo SA se compromete a aplicar os reparos de segurança para qualquer Bug de segurança +descoberto em uma versão do Software hospedada na Cloud Platform, em todos os sistemas +sob seu controle, assim que o reparo estiver disponível, sem exigir nenhuma ação manual do Cliente. + + +.. _upgrade_pt: + +4.3 Serviços de Atualização +--------------------------- + +.. _upgrade_odoo_pt: + +Serviço de Atualização para o Software +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Durante a vigência deste Contrato, o Cliente pode enviar solicitações de atualização por meio +do canal apropriado (geralmente, o site do serviço de atualização da Odoo SA), a fim de +converter uma base de dados do Software de qualquer versão do Software para uma Versão +Coberta mais recente (a "Versão de Destino"). + +Para a Cloud Platform, as solicitações de atualização são enviadas diretamente do painel de +controle da Cloud Platform e não requerem nenhum upload de dados. Para Hospedagem +Própria, as solicitações de atualização devem incluir uma cópia da base de dados do Cliente e +os dados associados (normalmente obtidos no menu Backup do Software). + +Este serviço é fornecido por meio de uma plataforma automatizada para permitir que o Cliente +execute atualizações autônomas, uma vez que uma versão anterior da base de dados do +Cliente tenha sido atualizada com sucesso para uma Versão Coberta. + +O Serviço de Atualização é limitado à conversão técnica e adaptação da base de dados do +Cliente para torná-lo compatível com a Versão de Destino, a correção de qualquer Bug causado +diretamente pela operação de atualização e que não ocorre normalmente na Versão de +Destino, e a conversão do código-fonte e dados dos Módulos Extras Cobertos para a Versão de +Destino. + +É responsabilidade do Cliente verificar e validar a base de dados atualizada para detectar Bugs, +analisar o impacto de alterações e novos recursos implementados na Versão de Destino e +converter e adaptar para a Versão de Destino quaisquer extensões de terceiros do Software +que tenham sido instaladas na base de dados antes da atualização (por exemplo, Módulos +Extras não cobertos). O Cliente pode fazer várias solicitações de atualização para uma base de +dados, até que um resultado aceitável seja alcançado. + + +.. _cloud_hosting_pt: + +4.4 Serviços de Hospedagem na Nuvem +----------------------------------- + +Durante a vigência deste Contrato, quando o Cliente optar por usar a Cloud Platform, +a Odoo SA se compromete a fornecer pelo menos os seguintes serviços: + +- Opções de várias regiões de hospedagem (mínimo 3: Europa, América, Ásia/Pacífico) +- Hospedagem em data centers Tier III ou equivalente, com 99,9% de tempo de atividade da rede +- Criptografia SSL (HTTPS) de comunicação classe A +- Backups totalmente automatizados e verificados, replicados em várias regiões +- Plano de recuperação de desastres, testado regularmente + +Os detalhes dos Serviços de Hospedagem na Nuvem são descritos na página do Acordo de Nível +de Serviço (SLA) em https://www.odoo.com/cloud-sla. + + +.. _support_service_pt: + +4.5 Serviços de Suporte +----------------------- + +Escopo +~~~~~~ + +Durante a vigência deste Contrato, o Cliente pode abrir um número ilimitado de chamados +de suporte gratuitamente, exclusivamente para questões relacionadas a Bugs (consulte :ref:`bugfix_pt`) +ou orientação com relação ao uso dos recursos padrão do Software e Módulos Extras Cobertos. + +Outras solicitações de assistência, como questões relacionadas a desenvolvimento ou +customizações, podem ser cobertas por meio da compra de um contrato de serviço separado. +Caso não esteja claro se uma solicitação é coberta por este Contrato, a decisão fica a critério da +Odoo SA. + +Disponibilidade +~~~~~~~~~~~~~~~ + +Os chamados podem ser feitos por meio do formulário da web ou dos números de +telefone listados em https://www.odoo.com/help, ou, ao trabalhar com um +Parceiro Odoo, o canal fornecido pelo parceiro, sujeito ao horário de +funcionamento local. + + + +.. _maintenance_partner_pt: + +4.6 Trabalhando com um Parceiro Odoo +------------------------------------ + +Para correções de bugs, suporte e serviços de atualização, o cliente pode trabalhar com um +parceiro Odoo como principal ponto de contato ou trabalhar diretamente com a Odoo SA. + +Se o Cliente decidir trabalhar com um Parceiro Odoo, a Odoo SA subcontratará os serviços +relacionados com os Módulos Extras Cobertos ao Parceiro Odoo, que se torna o principal ponto +de contacto do Cliente. O Parceiro Odoo pode entrar em contato com a Odoo SA em nome do +Cliente para obter assistência de segundo nível com relação aos recursos padrão do Software. + +Se o Cliente decidir trabalhar diretamente com a Odoo SA, os serviços relacionados aos +Módulos Extras Cobertos serão fornecidos somente se o Cliente estiver hospedado na Odoo +Cloud Platform. + + +.. _charges_pt: + +5 Preços e Taxas +================ + +.. _charges_standard_pt: + +5.1 Preços Padrões +------------------ + +Os preços padrões para a assinatura do Odoo Enterprise e os Serviços são baseados no número +de Usuários e no Plano de Assinatura usado pelo Cliente e especificados por escrito na +celebração do Contrato. + +Se durante a Vigência, o Cliente tiver mais Usuários ou usar recursos que exijam outro Plano de +Assinatura do que o especificado no momento da celebração deste Contrato, o Cliente +concorda em pagar uma taxa extra equivalente ao preço de tabela aplicável (no momento do +desvio do número especificado de Usuários ou Plano de Assinatura) para os Usuários adicionais +ou o Plano de Assinatura necessário, pelo restante da Vigência. + +Além disso, os serviços dos Módulos Extras Cobertos são cobrados com base no número de +linhas de código nesses módulos. Quando o Cliente optar pela manutenção dos Módulos Extras +Cobertos, a cobrança será mensal por 100 linhas de código (arredondadas para a próxima +centena), conforme especificado por escrito na celebração do Contrato. As linhas de código +serão contabilizadas com o comando ``cloc`` do Software, e incluirão todas as linhas de texto no +código fonte desses módulos, independente da linguagem de programação (Python, Javascript, +XML etc.), excluindo linhas em branco, linhas de comentário e arquivos que não são carregados +durante a instalação ou execução do Software. + +Quando o Cliente solicitar uma atualização, para cada Módulo Extra Coberto que não tenha +sido coberto por uma taxa de manutenção nos últimos 12 meses, a Odoo SA poderá cobrar +uma taxa extra única para cada mês de cobertura faltante. + +.. _charges_renewal_pt: + +5.2 Custos de Renovação +----------------------- + +Após a renovação, conforme previsto na seção :ref:`term_pt`, se os preços aplicados +durante a Vigência anterior forem inferiores ao preço de tabela aplicável mais atual, tais preços +aumentarão em até 7%. + +.. _taxes_pt: + +5.3 Impostos +------------ + +Todas as taxas e preços não incluem quaisquer impostos, taxas ou encargos federais, +provinciais, estaduais, locais ou outros aplicáveis (coletivamente, “Impostos”). O Cliente é +responsável pelo pagamento de todos os Impostos associados às compras feitas pelo Cliente +nos termos deste Contrato, exceto quando a Odoo SA for legalmente obrigada a pagar ou +cobrar impostos pelos quais o Cliente é responsável. + +.. _conditions_pt: + +6 Condições dos Serviços +======================== + +6.1 Obrigações do Cliente +------------------------- + +O Cliente concorda em: + +- pagar à Odoo SA quaisquer valores aplicáveis pelos Serviços do presente Contrato, de acordo + com as condições de pagamento especificadas na assinatura deste contrato; +- notificar imediatamente a Odoo SA quando seu número real de Usuários exceder o número + especificado no ato da celebração do Contrato e, nesse caso, pagar a taxa adicional aplicável, + conforme descrito na seção :ref:`charges_standard_pt`; +- tomar todas as medidas necessárias para garantir a execução inalterada da parte do Software + que verifica a validade do uso do Odoo Enterprise Edition, conforme descrito + em :ref:`enterprise_access_pt`; +- nomear 1 pessoa de contato dedicada ao Cliente durante toda a vigência do Contrato; +- fornecer notificação por escrito à Odoo SA 30 dias antes de mudar seu ponto de contato principal + para trabalhar com outro Parceiro Odoo ou para trabalhar diretamente com a Odoo SA. + +Quando o Cliente opta por usar a Cloud Platform, o Cliente concorda ainda em: + +- tomar todas as medidas razoáveis para manter suas contas de usuário seguras, + inclusive escolhendo uma senha forte e não compartilhando com ninguém; +- fazer uso razoável dos Serviços de Hospedagem, renunciando quaisquer atividades ilegais ou + abusivas, e observar estritamente as regras descritas na Política de Uso Aceitável + publicada em https://www.odoo.com/acceptable-use. + +Quando o cliente escolhe a opção de Hospedagem Própria, o cliente concorda ainda em: + +- tomar todas as medidas razoáveis para proteger os arquivos e bases de dados do Cliente e + garantir que os dados do Cliente estejam seguros e protegidos, reconhecendo que a Odoo SA + não pode ser responsabilizada por qualquer perda de dados; +- conceder à Odoo SA o acesso necessário para verificar a validade do uso do Odoo Enterprise + Edition mediante solicitação (por exemplo, se a validação automática for considerada + inoperante para o Cliente). + +6.2 Sem Aliciamento ou Contratações +----------------------------------- + +Exceto quando a outra parte der seu consentimento por escrito, cada parte, suas afiliadas e +representantes concordam em não solicitar ou oferecer emprego a qualquer funcionário da +outra parte que esteja envolvido na execução ou uso dos Serviços sob este Contrato, durante a +vigência do Contrato e por um período de 12 meses a partir da data de rescisão ou vencimento +deste Contrato. Em caso de descumprimento das condições desta seção que leve à demissão +do referido funcionário para o efeito, a parte infratora obriga-se a pagar à outra parte um +montante de 30 000,00 euros (€) (trinta mil euros). + + +.. _publicity_pt: + +6.3 Publicidade +--------------- + +Exceto quando vetado através de notificação por escrito, cada parte concede à outra uma +licença mundial intransferível, não exclusiva e isenta de royalties para reproduzir e exibir o +nome, logotipos e marcas registradas da outra parte, exclusivamente para fins de referência à +outra parte como um cliente ou fornecedor, em sites, press releases e outros materiais de +marketing. + +.. _confidentiality_pt: + +6.4 Confidencialidade +--------------------- + +Definição de “Informações Confidenciais”: + Todas as informações divulgadas por uma parte (a “Parte Divulgadora”) à outra parte (a “Parte + Receptora”), oralmente ou por escrito, que seja designada como confidencial ou que + razoavelmente deva ser entendida como confidencial, dada a natureza do informações e as + circunstâncias da divulgação. Em particular, qualquer informação relacionada a negócios, + assuntos, produtos, desenvolvimentos, segredos comerciais, know-how, pessoal, clientes e + fornecedores de qualquer uma das partes deve ser considerada confidencial. + +Para todas as Informações Confidenciais recebidas durante a Vigência deste Contrato, a Parte +Receptora usará o mesmo grau de cuidado que usa para proteger a confidencialidade de suas +próprias Informações Confidenciais semelhantes, mas não menos do que o cuidado razoável. + +A Parte Receptora pode divulgar Informações Confidenciais da Parte Divulgadora na medida em +que for obrigada por lei a fazê-lo, desde que a Parte Receptora notifique a Parte Divulgadora +com antecedência sobre a divulgação obrigatória, na medida permitida por lei. + +.. _data_protection_pt: + +6.5 Proteção de Dados +--------------------- + +Definições + "Dados Pessoais", "Controlador", "Processamento" têm os mesmos significados que no + Regulamento (UE) 2016/679 e na Diretiva 2002/58/EC, e qualquer regulamento ou legislação + que os altere ou substitua (doravante referido como "Legislação de Proteção de Dados") + +Processamento de Dados Pessoais +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +As partes reconhecem que a base de dados do Cliente pode conter Dados Pessoais, dos quais o +Cliente é o Controlador. Estes dados serão processados pela Odoo SA quando o Cliente assim o +instruir, mediante a utilização de algum dos Serviços que necessitem de uma base de dados +(e.g. os Serviços de Hospedagem na Nuvem ou o Serviço de Atualização da Base de Dados), ou +se o Cliente transferir a sua base de dados ou parte da sua base de dados à Odoo SA por +qualquer motivo relacionado a este Contrato. + +Este processamento será realizado em conformidade com a Legislação de Proteção de Dados. +Em particular, a Odoo SA compromete-se a: + +- (a) apenas processar os Dados Pessoais quando e conforme instruído pelo Cliente, e com a + finalidade de executar um dos Serviços sob este Contrato, a menos que haja exigência por lei, + caso em que a Odoo SA notificará o Cliente com antecedência, a não ser que a lei a proíba; +- (b) garantir que todas as pessoas dentro da Odoo SA autorizadas a processar os Dados Pessoais + se comprometam com a confidencialidade; +- (c) implementar e manter medidas técnicas e organizacionais apropriadas para proteger os + Dados Pessoais contra processamento não autorizado ou ilegal e contra perda, destruição, + dano, roubo, alteração ou divulgação acidental; +- (d) encaminhar prontamente ao Cliente qualquer solicitação de Proteção de Dados que tenha + sido enviada à Odoo SA em relação à base de dados do Cliente; +- (e) notificar o Cliente imediatamente ao tomar conhecimento e confirmar qualquer processamento + acidental, não autorizado ou ilegal, divulgação ou acesso aos Dados Pessoais; +- (f) notificar o Cliente se as instruções de processamento infringirem a Legislação de + Proteção de Dados aplicável, na opinião da Odoo SA; +- (g) disponibilizar ao Cliente todas as informações necessárias para demonstrar conformidade + com a Legislação de Proteção de Dados, permitir e contribuir razoavelmente para auditorias, + incluindo inspeções, conduzidas ou ordenadas pelo Cliente; +- (h) excluir permanentemente todas as cópias da base de dados do Cliente em posse da Odoo + SA, ou devolver tais dados, à escolha do Cliente, após a rescisão deste Contrato, sujeito + aos atrasos especificados na `Política de Privacidade `_ + da Odoo SA; + +No que diz respeito às alíneas (d) a (f), o Cliente concorda em fornecer à Odoo SA informações +de contato precisas em todos os momentos, conforme necessário para notificar o responsável pela +Proteção de Dados do Cliente. + +Subprocessadores +~~~~~~~~~~~~~~~~ + +O Cliente reconhece e concorda que, para fornecer os Serviços, a Odoo SA pode usar +provedores de serviços terceirizados (Subprocessadores) para tratar Dados Pessoais. A Odoo SA +compromete-se a usar apenas Subprocessadores em conformidade com a Legislação de +Proteção de Dados. Esta utilização estará abrangida por um contrato entre a Odoo SA e o +Subprocessador que dá garantias nesse sentido. A Política de Privacidade da Odoo SA, +publicada em https://www.odoo.com/privacy, fornece informações atualizadas sobre os +nomes e propósitos dos Subprocessadores atualmente em uso pela Odoo SA para a execução +dos Serviços. + +.. _termination_pt: + +6.6 Cessão +---------- + +Caso qualquer uma das partes não cumpra qualquer uma de suas obrigações decorrentes deste +Contrato, e se tal violação não for sanada dentro de 30 dias corridos a partir da notificação por +escrito de tal violação, este Contrato poderá ser rescindido imediatamente pela parte não +infratora. + +Além disso, a Odoo SA pode rescindir o Contrato imediatamente caso o Cliente não pague as +taxas aplicáveis pelos Serviços dentro de 21 dias após a data de vencimento especificada na +fatura correspondente e após no mínimo 3 lembretes. + +Cláusulas Subsistentes: + As seções ":ref:`confidentiality_pt`", “:ref:`disclaimers_pt`", “:ref:`liability_pt`", + e “:ref:`general_provisions_pt`" subsistirão a qualquer rescisão ou expiração deste Contrato. + + +.. _warranties_disclaimers_pt: + +7 Garantias, Isenções de Responsabilidade, Limitação de Responsabilidade +======================================================================== + +.. _warranties_pt: + +7.1 Garantias +------------- + +A Odoo SA detém os direitos autorais ou equivalente [#cla_pt1]_ de 100% do código do Software e +confirma que todas as bibliotecas de software necessárias para usar o Software estão disponíveis +sob uma licença compatível com a licença do Software. + +Durante a vigência deste Contrato, a Odoo SA se compromete a realizar esforços +comercialmente razoáveis para executar os Serviços de acordo com os padrões de indústria +geralmente aceitos, desde que: + +- os sistemas computacionais do Cliente estejam em bom estado de funcionamento e, para o + caso de Hospedagem Própria, o Software esteja instalado num ambiente operacional adequado; +- o Cliente forneça informações adequadas de solução de problemas e, para o caso de + Hospedagem Própria, qualquer acesso que a Odoo SA possa precisar para identificar, + reproduzir e resolver problemas; +- todos os valores devidos à Odoo SA sejam pagos. + +O único e exclusivo recurso do Cliente e a única obrigação da Odoo SA por qualquer violação +desta garantia é que a Odoo SA retome a execução dos Serviços sem custo adicional. + +.. [#cla_pt1] As contribuições externas são cobertas por um `Contrato de Licença de Direitos + Autorais `_ + fornece uma licença permanente, gratuita e irrevogável de direitos autorais e patente para a Odoo SA. + + +.. _disclaimers_pt: + +7.2 Isenções de Responsabilidade +-------------------------------- + +Exceto conforme expressamente disposto neste documento, nenhuma das partes oferece +qualquer garantia de qualquer tipo, seja expressa, implícita, estatutária ou de outra maneira, e +cada parte se isenta especificamente de todas as garantias implícitas, incluindo qualquer +garantia implícita de comercialização, adequação a uma finalidade específica ou não violação, +na extensão máxima permitida pela lei aplicável. + +A Odoo SA não garante que o Software esteja em conformidade com qualquer lei ou +regulamentação local ou internacional. + +.. _liability_pt: + +7.3 Limitação de Responsabilidade +--------------------------------- + +Na extensão máxima permitida por lei, a responsabilidade agregada de cada parte juntamente +com suas afiliadas, decorrente ou relacionada a este Contrato, não excederá 50% do valor total +pago pelo Cliente sob este Contrato durante os 12 meses imediatamente anteriores à data do +evento que deu origem a tal ação judicial. Reivindicações múltiplas não devem ampliar esta +limitação. + +Em nenhum caso, qualquer uma das partes ou suas afiliadas serão responsáveis por quaisquer +danos indiretos, especiais, exemplares, incidentais ou consequentes de qualquer tipo, +incluindo, mas não limitado a, perda de receita, lucros, economias, perda de negócios ou +outras perdas financeiras, custos de paralisação ou atraso, dados perdidos ou corrompidos, +decorrentes ou relacionados a este Contrato, independentemente da forma de ação, seja por +contrato, ato ilícito ou não, mesmo que uma parte ou suas afiliadas tenham sido avisadas da +possibilidade de tais danos, ou se o reparo de uma parte ou de suas afiliadas falhar em seu +propósito essencial. + +.. _force_majeure_pt: + +7.4 Força Maior +--------------- + +Nenhuma das partes será responsável perante a outra parte pelo atraso em qualquer +cumprimento ou falha em cumprir qualquer ação sob este Contrato quando tal falha ou atraso +encontrar sua causa em um caso de *força maior*, como regulamentações governamentais, +incêndio, greve, guerra, inundação, acidente, epidemia, embargo, apropriação total ou parcial +de fábrica ou produto por qualquer governo ou autoridade pública, ou qualquer outra causa ou +causas, de natureza semelhante ou diferente, fora do controle razoável de tal parte, desde que +tal causa ou causas existam. + +.. _general_provisions_pt: + +8 Disposições Gerais +==================== + +.. _governing_law_pt: + +8.1 Jurisdição +-------------- + +Este Contrato e todas as ordens do Cliente estarão sujeitos à lei belga. Qualquer disputa +decorrente ou relacionada a este Contrato ou a qualquer ordem do Cliente estará sujeita à +jurisdição exclusiva do Tribunal Comercial de Nivelles. + +.. _severability_pt: + +8.2 Independência das Disposições Contratuais +--------------------------------------------- + +No caso de qualquer uma ou mais das disposições deste Contrato ou qualquer aplicação do +mesmo ser inválida, ilegal ou inexequível em qualquer aspecto, a validade, legalidade e +aplicabilidade das demais disposições deste Contrato e qualquer aplicação do mesmo não +serão de forma alguma afetadas ou prejudicadas. Ambas as partes se comprometem a +substituir qualquer disposição inválida, ilegal ou inexequível deste Contrato por uma disposição +válida com os mesmos efeitos e objetivos. + +.. _appendix_a_pt: + +9 Anexo A: Licença do Odoo Enterprise Edition +============================================= + +A versão Enterprise do Odoo tem a licença Odoo Enterprise Edition v1.0, que é +definida da seguinte forma: + +.. warning:: + Esta é uma tradução em português da "Licença Odoo Enterprise Edition v1.0". + A tradução é fornecida com o intuito de facilitar a sua compreensão, mas não tem valor legal. + A única referência oficial aos termos da "Licença Odoo Enterprise Edition" + é a :ref:`versão original em inglês ` + +.. raw:: html + + + +.. raw:: latex + + {\tt + + +Licença Odoo Enterprise Edition v1.0 + +Este software e arquivos associados (o "Software") só podem ser usados (executados, modificados, +executados após modificações) com uma Assinatura do Odoo Enterprise válida para o número correto +de usuários. + +Com um Acordo de Parceria válido com a Odoo S.A., as permissões acima também são concedidas, +desde que o uso seja limitado a um ambiente de testes ou desenvolvimento. + +Você pode desenvolver módulos Odoo com base no Software e distribuí-los sob a licença de sua +escolha, desde que seja compatível com os termos da Licença Odoo Enterprise Edition (por exemplo: +LGPL, MIT ou licenças proprietárias similares a esta). + +Você pode usar módulos Odoo publicados sob qualquer licença junto com o Software, desde que a +licença deles seja compatível com os termos da Licença Odoo Enterprise (incluindo, mas não se +limitando a, qualquer módulo publicado na Odoo Apps Store em odoo.com/apps). + +É proibido publicar, distribuir, sublicenciar ou vender cópias do Software ou cópias modificadas +do Software. + +O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todas +as cópias ou partes substanciais do Software. + +O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, +INCLUINDO, MAS NÃO SE LIMITANDO A, GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM PROPÓSITO +ESPECÍFICO E NÃO VIOLAÇÃO. EM NENHUMA CIRCUNSTÂNCIA, OS AUTORES OU TITULARES DE DIREITOS +AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER REIVINDICAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, +SEJA EM AÇÃO DE CONTRATO, DELITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM +O SOFTWARE OU O USO OU OUTRAS TRANSAÇÕES NO SOFTWARE. + +.. raw:: latex + + } + +.. raw:: html + + diff --git a/content/legal/terms/i18n/enterprise_tex_pt_BR.rst b/content/legal/terms/i18n/enterprise_tex_pt_BR.rst new file mode 100644 index 0000000000..75354a61fb --- /dev/null +++ b/content/legal/terms/i18n/enterprise_tex_pt_BR.rst @@ -0,0 +1,8 @@ +:nosearch: +:orphan: + +.. toctree:: + :maxdepth: 4 + :hidden: + + enterprise_pt_BR diff --git a/content/legal/terms/i18n/partnership_es.rst b/content/legal/terms/i18n/partnership_es.rst index a21f989338..fd0b6bc5e9 100644 --- a/content/legal/terms/i18n/partnership_es.rst +++ b/content/legal/terms/i18n/partnership_es.rst @@ -24,8 +24,9 @@ Odoo Partnership Agreement (ES) .. v8a: minor clarifications and simplifications .. v... !missing updates! .. v10: 2023-01-09 - change Odoo SH commission rate to 50% +.. v11: 2023-05-19 - updated partnership requirements, some clarifications -.. note:: Versión 8a - 2019-08-09 +.. note:: Versión 11 - 2023-05-19 | ENTRE: | Odoo S.A., una empresa que tiene su sede social en Chaussée de Namur, 40, 1367 Grand-Rosière, @@ -39,7 +40,7 @@ ODOO y EL COLABORADOR se denominan individualmente “Parte” y conjuntamente 1 Objeto ======== -El presente contrato tiene por objeto regular las condiciones bajo las cuales ODOO presta servicios +El presente Contrato tiene por objeto regular las condiciones bajo las cuales ODOO presta servicios a EL COLABORADOR, acceso al software Odoo Enterprise Edition, y bajo las cuales EL COLABORADOR cumple con las obligaciones establecidas a continuación. @@ -71,6 +72,9 @@ Contrato. Además, ODOO otorga a EL COLABORADOR acceso gratuito a la plataforma ODOO.SH con fines de prueba y desarrollo. +EL COLABORADOR no tiene permitido bloquear, restringir o limitar de ninguna manera el acceso y uso +de la Licencia Odoo Enterprise Edition por parte del cliente, sin consulta previa y autorización +por escrito de ODOO. .. _restrictions_es: @@ -101,29 +105,33 @@ sin visibilidad como socio oficial hasta que obtengan la experiencia requerida; "Official Partners" es para empresas que desean la visibilidad como Ready, Silver y Gold, según su experiencia con Odoo. -El nivel de colaboración otorgado a EL COLABORADOR depende de los ingresos anuales de -Odoo Enterprise generados para ODOO (en términos de Usuarios de Odoo Enterprise vendidos). -Las renovaciones de los contratos existentes no cuentan para el número de Usuarios vendidos, -pero EL COLABORADOR sigue recibiendo una comisión por estos -contratos, tal como se indica en la sección :ref:`benefits_es`.. +El nivel de colaboración otorgado a EL COLABORADOR depende de los *nuevos usuarios netos de +Odoo Enterprise vendidos* en los últimos 12 meses, el número de recursos certificados y la Tasa +de Retención de clientes. Los *nuevos usuarios netos de Odoo Enterprise vendidos* incluyen nuevos +clientes, ventas adicionales a clientes existentes, reducciones en ventas a clientes existentes y +la pérdida de clientes. +Las renovaciones de contratos existentes no se cuentan como parte del número de usuarios vendidos, +pero EL COLABORADOR aún recibe una comisión por estos contratos según se establece en la sección +:ref:`benefits_es`. La tabla siguiente resume los requisitos para cada nivel de colaboración. +La *Tasa de Retención* de clientes se calcula dividiendo el número total de clientes de Odoo Enterprise +adquiridos por EL COLABORADOR en los últimos 3 años que están actualmente activos, entre el +número total de clientes de Odoo Enterprise adquiridos por EL COLABORADOR en los últimos 3 años. + +--------------------------------------------------+------------------+--------------------+--------------------+--------------------+ | | Learning Partner | Official: Ready | Official: Silver | Official: Gold | +==================================================+==================+====================+====================+====================+ -| Usuarios de Odoo Enterprise anuales vendidos | 0 | 10 | 50 | 150 | +| Nuevos Usuarios netos de Odoo Enterprise | 0 | 10 | 50 | 300 | +| vendidos anualmente | | | | | +--------------------------------------------------+------------------+--------------------+--------------------+--------------------+ -| Número de empleados certificados en al menos uno | 0 | 1 | 2 | 3 | +| Número de empleados certificados en al menos uno | 0 | 1 | 3 | 6 | | de las 3 últimas versiones de Odoo | | | | | +--------------------------------------------------+------------------+--------------------+--------------------+--------------------+ -| Tasa de retención mínima | n/a | n/a | 70% | 80% | +| Tasa de Retención mínima | n/a | n/a | 70% | 80% | +--------------------------------------------------+------------------+--------------------+--------------------+--------------------+ -La Tasa de Retención se define como la relación entre el número de contratos de Odoo Enterprise que -están actualmente activos y la cantidad de contratos de Odoo Enterprise que han estado activos en -algún momento en los últimos 12 meses. - Las certificaciones son personales, por lo que cuando un miembro certificado del personal deja la empresa, EL COLABORADOR debe notificarlo a ODOO para que actualice la cantidad de recursos certificados activos para el contrato de colaboración. @@ -190,7 +198,8 @@ En la tabla siguiente se describen los detalles de las ventajas para cada nivel | y promoción de ODOO | | | | | +---------------------------------------+------------------+--------------------+--------------------+--------------------+ -.. [#s1] hasta un máximo de 150€ (o 180 $) de comisión mensual por suscripción +.. [#s1] hasta un máximo de 150€ (o $180) de comisión mensual por suscripción, o 1440€ + (o $1728) de comisión anual por suscripción. 4.3 Reconocimiento de socios ---------------------------- @@ -234,6 +243,12 @@ enviada por ODOO. La tarifa se especificará por escrito al momento de la firma EL COLABORADOR reconoce que la tarifa de colaboración mencionadas anteriormente no son reembolsables. +Todos los honorarios y cargos son exclusivos de todos los impuestos, tarifas o cargos gubernamentales, +federales, provinciales, estatales, locales u otros aplicables (en conjunto, "Impuestos"). +EL COLABORADOR es responsable de pagar todos los Impuestos asociados a las compras realizadas por +EL COLABORADOR bajo este Contrato, excepto cuando ODOO esté legalmente obligado a pagar o recaudar +Impuestos de los cuales EL COLABORADOR es responsable. + 6 Resolución ============ En el caso de que cualquiera de las Partes no cumpla con cualquiera de sus obligaciones que se @@ -259,17 +274,18 @@ En el momento de la resolución de este contrato, EL COLABORADOR: =================================== Ambas Partes están vinculadas por una obligación de medios aquí descrita. -En la medida máxima permitida por la ley, la responsabilidad de ODOO por cualquier reclamo, +En la medida máxima permitida por la ley, la responsabilidad de cada Parte por cualquier reclamo, pérdida, daño o gasto derivado de cualquier manera o bajo cualquier circunstancia del presente contrato se limitará a los daños directos demostrados, pero en ningún caso excederá por todos los eventos o series de eventos relacionados que ocasionen daños la cantidad total de las tarifas pagadas por EL COLABORADOR en el transcurso de los seis (6) meses inmediatamente anteriores a la fecha del evento que dio lugar a dicha reclamación. -En ningún caso ODOO será responsable de ningún daño indirecto o consecuente, incluyendo, -entre otros, reclamaciones de clientes o terceros, pérdidas de ingresos, ganancias, ahorros, -pérdidas de negocios y otras pérdidas financieras, costos de paralización y retraso, datos perdidos -o dañados derivados o relacionados con el cumplimiento de sus obligaciones en virtud de este contrato. +En ningún caso cada Parte será responsable de ningún daño indirecto o consecuente, incluyendo, +entre otros, pero no limitándose a, reclamaciones de clientes o terceros, pérdidas de ingresos, +ganancias, ahorros, pérdidas de negocios y otras pérdidas financieras, costos de paralización y +retraso, datos perdidos o dañados derivados o relacionados con el cumplimiento de sus obligaciones +en virtud de este Contrato. EL COLABORADOR reconoce que no tiene ninguna expectativa y que no ha recibido garantías de recuperar ninguna inversión realizada en la ejecución de este contrato y el programa de socios de Odoo o de diff --git a/content/legal/terms/i18n/partnership_fr.rst b/content/legal/terms/i18n/partnership_fr.rst index 1e4f2608aa..82a25ccf78 100644 --- a/content/legal/terms/i18n/partnership_fr.rst +++ b/content/legal/terms/i18n/partnership_fr.rst @@ -20,8 +20,9 @@ Odoo Partnership Agreement (FR) .. v9a: minor clarification to allow OE commission even without maintenance .. v9b: 2021-01-12 - update requirements for Partnership levels .. v10: 2023-01-09 - change Odoo SH commission rate to 50% +.. v11: 2023-05-19 - updated partnership requirements, some clarifications -.. note:: Version 10 - 2023-01-09 +.. note:: Version 11 - 2023-05-19 | ENTRE: | Odoo S.A., une entreprise dont le siège social se situe Chaussée de Namur, 40, @@ -84,6 +85,10 @@ Nonobstant ce qui précède, le PARTENAIRE s’engage à préserver totalement l d’Odoo Enterprise Edition requis pour vérifier la validité de l’utilisation d’Odoo Enterprise Edition et recueillir les données statistiques nécessaires à cette fin. +Le PARTENAIRE n'est pas autorisé à bloquer, restreindre ou limiter d'aucune manière l'accès et +l'usage de la licence Odoo Enterprise Edition pour les clients, sauf en cas de consultation préalable +et accord écrit d'ODOO. + 4 Services du partenariat ========================= @@ -95,30 +100,34 @@ mise en oeuvre d'Odoo, mais sans la visibilité d'un partenaire officiel, en att l'expérience requise; tandis qu' "Official Partners" est prévu pour les sociétés qui veulent la visibilité en tant que partenaire Ready, Silver ou Gold, suivant leur niveau d'expérience. -Le niveau de partenariat accordé au PARTENAIRE dépend des nouvelles recettes annuelles Odoo Enterprise -générées par le PARTENAIRE pour ODOO (en terme du nombre de nouveaux utilisateur Odoo Enterprise vendus), -du nombre de ressources internes certifiées, et du taux de rétention de clients. -Les renouvellements de contrats existants -n’entrent pas en ligne de compte pour le nombre de nouveaux utilisateurs vendus, mais le PARTENAIRE -reçoit tout de même une commission sur ces contrats, comme indiqué dans la section :ref:`benefits_fr`. +Le niveau de partenariat accordé au PARTENAIRE dépend du *nombre net de nouveaux utilisateurs Odoo Enterprise +vendus* au cours des 12 derniers mois, du nombre de ressources internes certifiées, et du Taux de Rétention +de clients. Le *nombre net de nouveaux utilisateurs Odoo Enterprise vendus* comprend les nouveaux clients, +les ventes supplémentaires aux clients existants, les ventes réduites aux clients existants ainsi que +la perte de clients. + +Les renouvellements des contrats existants ne sont pas pris en compte dans le nombre d'utilisateurs +vendus, mais le PARTENAIRE reçoit toujours une commission sur ces contrats, comme indiqué à la section +:ref:`benefits_fr`. Le tableau ci-dessous résume les exigences pour chaque niveau de partenariat. +Le *Taux de Rétention* de clients est calculé en divisant le nombre total de clients Odoo Enterprise +acquis par le PARTENAIRE au cours des 3 dernières années et actuellement actifs par le nombre total +de clients Odoo Enterprise acquis par le PARTENAIRE au cours des 3 dernières années. + +----------------------------------------------+------------------+--------------------+--------------------+--------------------+ | | Learning Partner | Official: Ready | Official: Silver | Official: Gold | +==============================================+==================+====================+====================+====================+ -| Nouveaux utilisateurs Odoo Enterprise vendus | 0 | 10 | 75 | 200 | +| Nouveaux utilisateurs net Odoo Enterprise | 0 | 10 | 75 | 300 | +| vendus annuellement | | | | | +----------------------------------------------+------------------+--------------------+--------------------+--------------------+ -| Nombre d'employés certifiés sur au moins une | 0 | 1 | 2 | 3 | +| Nombre d'employés certifiés sur au moins une | 0 | 1 | 3 | 6 | | des 3 dernières version d'Odoo | | | | | +----------------------------------------------+------------------+--------------------+--------------------+--------------------+ | Taux de Rétention minimum | n/a | n/a | 70% | 80% | +----------------------------------------------+------------------+--------------------+--------------------+--------------------+ -Le Taux de Rétention est défini comme le rapport entre le nombre de contrats Odoo Enterprise qui sont -toujours en cours, et le nombre de contrats Odoo Enterprise qui ont été actifs à un moment au cours -des 12 derniers mois. - Les certifications sont personnelles, donc lorsqu’un membre du personnel quitte ou rejoint l’entreprise, le PARTENAIRE doit en informer ODOO. @@ -186,8 +195,8 @@ Les avantages de chaque niveau de partenariat sont détaillés dans le tableau c | promotion | | | | | +---------------------------------------+------------------+--------------------+--------------------+--------------------+ -.. [#s1f] jusqu'à un maximum de 150€ (ou 180$) de commission mensuelle par contrat Odoo.SH. - +.. [#s1f] jusqu'à un maximum de 150€ (ou $180) de commission mensuelle par contrat Odoo.SH, ou 1440€ + (ou $1728) de commission annuelle par contrat Odoo.SH. 4.3 Reconnaissance du partenaire -------------------------------- @@ -250,6 +259,11 @@ Contrat. Le PARTENAIRE accepte que les frais de partenariat susmentionnés ne soient pas remboursables. +Tous les frais et tarifs sont indiqués hors taxes, frais et charges fédérales, provinciales, locales +ou autres taxes gouvernementales applicables (collectivement, les "Taxes"). Le PARTENAIRE est +responsable du paiement de toutes les Taxes liées aux achats effectués par le PARTENAIRE en vertu +de ce Contrat, sauf lorsque ODOO est légalement tenu de payer ou de percevoir les Taxes dont +le PARTENAIRE est responsable. 6 Résiliation ============= @@ -276,14 +290,14 @@ Maintien des dispositions: ============================== Les deux Parties sont liées par l’obligation de moyens ci-après. -Dans les limites autorisées par la loi, la responsabilité d’ODOO pour quelque réclamation, perte, +Dans les limites autorisées par la loi, la responsabilité de chaque Partie pour quelque réclamation, perte, dommage ou dépense que ce soit découlant de n’importe quelle cause et survenant de quelque manière que ce soit dans le cadre de ce Contrat sera limitée aux dommages directs prouvés, mais ne dépassera en aucun cas, pour tous les événements ou séries d’événements connexes entraînant des dommages, le montant total des frais payés par le PARTENAIRE au cours de six (6) mois précédant immédiatement la date de l’événement donnant naissance à une telle plainte. -En aucun cas, ODOO ne sera responsable pour tout dommage indirect ou consécutif, y compris, mais +En aucun cas chaque Partie ne sera responsable pour tout dommage indirect ou consécutif, y compris, mais sans s’y restreindre, aux plaintes, pertes de revenu, de recettes, d’économies, d’entreprise ou autre perte financière, coûts d’arrêt ou de retard, pertes de données ou données corrompues de tiers ou de clients résultant de ou en lien avec l’exécution de ses obligations dans le cadre diff --git a/content/legal/terms/i18n/terms_of_sale_fr.rst b/content/legal/terms/i18n/terms_of_sale_fr.rst index fe30333a13..b6499f407e 100644 --- a/content/legal/terms/i18n/terms_of_sale_fr.rst +++ b/content/legal/terms/i18n/terms_of_sale_fr.rst @@ -6,7 +6,8 @@ Conditions Générales de Vente .. only:: html - `Download PDF `_ + `Download PDF `_ + .. note:: Dernière modification: 20 octobre 2021. Ces conditions régissent la vente de produits et services entre diff --git a/content/legal/terms/partnership.rst b/content/legal/terms/partnership.rst index edb98c957b..fb0eeb5a50 100644 --- a/content/legal/terms/partnership.rst +++ b/content/legal/terms/partnership.rst @@ -16,8 +16,9 @@ Odoo Partnership Agreement .. v9a: minor clarification to allow OE commission even without maintenance .. v9b: 2021-01-12 - update requirements for Partnership levels .. v10: 2023-01-09 - change Odoo SH commission rate to 50% +.. v11: 2023-05-19 - updated partnership requirements, some clarifications -.. note:: Version 10 - 2023-01-09 +.. note:: Version 11 - 2023-05-19 | BETWEEN: | Odoo S.A., having its registered office at Chaussée de Namur, 40, 1367 Grand-Rosière, @@ -79,6 +80,9 @@ Notwithstanding the above, PARTNER commits to wholly preserve the integrity of t Odoo Enterprise Edition code that is required to verify the validity of usage of Odoo Enterprise Edition and to collect statistics that are needed for that purpose. +PARTNER is not allowed to block, restrict or limit in any way the customer's access and use of +the Odoo Enterprise Edition License, without prior consultation and written authorisation from ODOO. + 4 Partnership Services ====================== @@ -91,29 +95,30 @@ without visibility as an official partner until they get the required experience “Official Partners” is for companies who want the visibility as Ready, Silver, and Gold, according to their experience with Odoo. -Partnership level granted to PARTNER depends on the annual new Odoo Enterprise revenue generated -for ODOO (in terms of Odoo Enterprise Users sold), the number of certified resources and the customer -Retention Rate. +Partnership level granted to PARTNER depends on the *net new Odoo Enterprise users sold* in +the last 12 months, the number of certified resources and the customer +Retention Rate. The *net new Odoo Enterprise users sold* includes new customers, upsells on existing +customer, downsells on existing customers, and customer churn. Renewals of existing contracts do not count towards the number of Users Sold, but PARTNER still gets a commission on these contracts as stated in section :ref:`benefits`. The table below summarizes the requirements that have to be met for each partnership level. +The customer *Retention Rate* is calculated by dividing the total number of Odoo Enterprise customers +acquired by PARTNER in the last 3 years that are currently active by the total number of Odoo Enterprise +customers acquired by PARTNER in the last 3 years. + +--------------------------------------------+------------------+--------------------+--------------------+--------------------+ | | Learning Partner | Official: Ready | Official: Silver | Official: Gold | +============================================+==================+====================+====================+====================+ -| Annual New Odoo Enterprise Users Sold | 0 | 10 | 75 | 200 | +| Annual Net New Odoo Enterprise Users Sold | 0 | 10 | 75 | 300 | +--------------------------------------------+------------------+--------------------+--------------------+--------------------+ -| Number of Certified Employees on at least | 0 | 1 | 2 | 3 | +| Number of Certified Employees on at least | 0 | 1 | 3 | 6 | | one of the 3 last Odoo versions | | | | | +--------------------------------------------+------------------+--------------------+--------------------+--------------------+ | Minimum Retention Rate | n/a | n/a | 70% | 80% | +--------------------------------------------+------------------+--------------------+--------------------+--------------------+ -The Retention Rate is defined as the ratio between the number of Odoo Enterprise contracts that -are currently active, and the number of Odoo Enterprise contracts that have been active at some point -in the last 12 months - Certifications are personal, so when a certified staff member leaves or joins the company, PARTNER must notify ODOO. @@ -181,7 +186,8 @@ The details of the benefits for each level of the partnership are described in t | Promotion | | | | | +---------------------------------------+------------------+--------------------+--------------------+--------------------+ -.. [#s1] up to a maximum of 150€ (or 180$) of monthly commission per subscription +.. [#s1] up to a maximum of 150€ (or $180) of monthly commission per subscription, or 1440€ + (or $1728) of yearly commission per subscription 4.3 Partner Recognition @@ -240,6 +246,11 @@ agreement. PARTNER acknowledges that the above-mentioned Partnership fee is not refundable. +All fees and charges are exclusive of all applicable federal, provincial, state, local or other +governmental taxes, fees or charges (collectively, “Taxes”). PARTNER is responsible for paying +all Taxes associated with purchases made by PARTNER under this Agreement, except when ODOO is +legally obliged to pay or collect Taxes for which PARTNER is responsible. + 6 Termination ============= @@ -265,13 +276,13 @@ On expiry or termination of this Agreement, PARTNER: =========================== Both Parties are bound by a best endeavours obligation hereunder. -To the maximum extent permitted by law, ODOO’s liability for any and all claims, losses, damages or +To the maximum extent permitted by law, the liability of each Party for any and all claims, losses, damages or expenses from any cause whatsoever and howsoever arising under this Agreement will be limited to the direct damages proved, but will in no event exceed for all damage-causing event or series of connected events causing damages the total amount for the fees paid by PARTNER in the course of the six (6) months immediately preceding the date of the event giving rise to such claim. -In no event will ODOO be liable for any indirect or consequential damages, including but not limited +In no event will each Party be liable for any indirect or consequential damages, including but not limited third parties or customer claims, loss of revenue, profits, savings, loss of business or other financial loss, costs of standstill or delay, lost or corrupted data arising out of or in connection with the performance of its obligations under this Agreement. @@ -302,7 +313,7 @@ Non-compliance with the provisions of this section shall be a cause for terminat 8.1 Publicity ------------- -PARTNER grants ODOO the nonexclusive right to use PARTNER's name or trademarks in press releases, +PARTNER grants ODOO the non-exclusive right to use PARTNER's name or trademarks in press releases, advertisements or other public announcements. In particular, PARTNER accepts to be mentioned in the official list of Odoo Partners on odoo.com, diff --git a/content/legal/terms/terms_of_sale.rst b/content/legal/terms/terms_of_sale.rst index 7370ca7538..80598f6b94 100644 --- a/content/legal/terms/terms_of_sale.rst +++ b/content/legal/terms/terms_of_sale.rst @@ -6,7 +6,7 @@ General Terms of Sale .. only:: html - `Download PDF <../../terms_of_sale.pdf>`_ + `Download PDF `_ .. note:: Last revision: October 20, 2021. diff --git a/extensions/odoo_theme/static/js/switchers.js b/extensions/odoo_theme/static/js/switchers.js index 7334cb844c..f540f10192 100644 --- a/extensions/odoo_theme/static/js/switchers.js +++ b/extensions/odoo_theme/static/js/switchers.js @@ -19,7 +19,7 @@ if (!targetUrl.startsWith('/')) { // Don't test for valid URLs if in localhost. event.preventDefault(); const fallbackUrls = await _generateFallbackUrls(targetUrl); - const fallbackUrl = await _getFirstValidUrl(fallbackUrls); + const fallbackUrl = await _getFirstValidUrl(fallbackUrls) ?? targetUrl; window.location.href = fallbackUrl; } } diff --git a/extensions/odoo_theme/static/js/utils.js b/extensions/odoo_theme/static/js/utils.js index d27facd558..1b367c3797 100644 --- a/extensions/odoo_theme/static/js/utils.js +++ b/extensions/odoo_theme/static/js/utils.js @@ -134,7 +134,7 @@ const _generateFallbackUrls = async (targetUrl) => { const [urlBase, version, language, originalPathParts] = _deconstructUrl(targetUrlObject); // Generate the fallback URLs. - const fallbackUrls = []; + const fallbackUrls = [targetUrl]; // Start with the original URL in case we rebuild it wrong. for (let i = originalPathParts.length; i >= 0; i--) { const fallbackPathParts = originalPathParts.slice(0, i); @@ -168,7 +168,7 @@ const _generateFallbackUrls = async (targetUrl) => { }; /** - * Iterate over the provided URLs and return the first one that points to a valid resource. + * Iterate over the provided URLs and return the first one that points to a valid resource, if any. * * Since URLs don't have a protocol and cannot be fetched when the documentation is built locally * without the `ROOT` and `IS_REMOTE_BUILD` Make arguments, the URLs that don't have the protocol @@ -183,5 +183,5 @@ const _getFirstValidUrl = async (urls) => { } } } - return urls[0]; // No valid URL found, return the first one. + return null; // No valid URL found. }; diff --git a/locale/sources/administration.pot b/locale/sources/administration.pot index 5e8a2f8d86..85406974c4 100644 --- a/locale/sources/administration.pot +++ b/locale/sources/administration.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo saas-16.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-13 08:42+0000\n" +"POT-Creation-Date: 2023-07-27 15:04+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -192,7 +192,7 @@ msgstr "" #: ../../content/administration/install/deploy.rst:58 #: ../../content/administration/install/deploy.rst:153 #: ../../content/administration/install/deploy.rst:276 -msgid "in ``/etc/odoo.conf`` set:" +msgid "in :ref:`the configuration file ` set:" msgstr "" #: ../../content/administration/install/deploy.rst:53 @@ -204,7 +204,7 @@ msgid "Setting a proper :option:`--db-filter ` is an impor msgstr "" #: ../../content/administration/install/deploy.rst:76 -#: ../../content/administration/install/install.rst:427 +#: ../../content/administration/install/install.rst:420 msgid "PostgreSQL" msgstr "" @@ -409,7 +409,7 @@ msgid "RAM = 9 * ((0.8*150) + (0.2*1024)) ~= 3Go RAM for Odoo" msgstr "" #: ../../content/administration/install/deploy.rst:241 -msgid "in ``/etc/odoo.conf``:" +msgid "in :ref:`the configuration file `:" msgstr "" #: ../../content/administration/install/deploy.rst:257 @@ -913,7 +913,7 @@ msgstr "" #: ../../content/administration/install/install.rst:59 #: ../../content/administration/maintain/domain_names.rst:166 #: ../../content/administration/maintain/domain_names.rst:236 -#: ../../content/administration/maintain/supported_versions.rst:27 +#: ../../content/administration/maintain/supported_versions.rst:31 #: ../../content/administration/upgrade/odoo_online.rst:3 msgid "Odoo Online" msgstr "" @@ -947,11 +947,11 @@ msgid "Official Community packages with all relevant dependency requirements are msgstr "" #: ../../content/administration/install/install.rst:90 -#: ../../content/administration/install/install.rst:295 -#: ../../content/administration/install/install.rst:366 -#: ../../content/administration/install/install.rst:431 -#: ../../content/administration/install/install.rst:504 -#: ../../content/administration/install/install.rst:671 +#: ../../content/administration/install/install.rst:287 +#: ../../content/administration/install/install.rst:359 +#: ../../content/administration/install/install.rst:424 +#: ../../content/administration/install/install.rst:497 +#: ../../content/administration/install/install.rst:666 msgid "Windows" msgstr "" @@ -984,23 +984,23 @@ msgid "Odoo will automatically be started at the end of the installation." msgstr "" #: ../../content/administration/install/install.rst:106 -#: ../../content/administration/install/install.rst:313 -#: ../../content/administration/install/install.rst:388 -#: ../../content/administration/install/install.rst:451 -#: ../../content/administration/install/install.rst:539 -#: ../../content/administration/install/install.rst:682 +#: ../../content/administration/install/install.rst:305 +#: ../../content/administration/install/install.rst:381 +#: ../../content/administration/install/install.rst:444 +#: ../../content/administration/install/install.rst:532 +#: ../../content/administration/install/install.rst:677 msgid "Linux" msgstr "" #: ../../content/administration/install/install.rst:109 -#: ../../content/administration/install/install.rst:359 +#: ../../content/administration/install/install.rst:352 msgid "Prepare" msgstr "" #: ../../content/administration/install/install.rst:113 #: ../../content/administration/install/install.rst:146 #: ../../content/administration/install/install.rst:179 -#: ../../content/administration/install/install.rst:546 +#: ../../content/administration/install/install.rst:539 msgid "Debian/Ubuntu" msgstr "" @@ -1019,7 +1019,7 @@ msgid "Odoo needs a `PostgreSQL`_ server to run properly. Make sure that the `su msgstr "" #: ../../content/administration/install/install.rst:137 -#: ../../content/administration/install/install.rst:644 +#: ../../content/administration/install/install.rst:637 msgid "`wkhtmltopdf` is not installed through **pip** and must be installed manually in version `0.12.5 `_ for it to support headers and footers. See our `wiki `_ for more details on the various versions." msgstr "" @@ -1156,197 +1156,193 @@ msgstr "" msgid "The following requires `Git `_ to be installed on your machine and that you have basic knowledge of Git commands. To clone a Git repository, you must choose between cloning with HTTPS or SSH. If you do not know the difference between the two, the best option is most likely HTTPS. If you are following the :doc:`Getting started ` developer tutorial, or plan on contributing to Odoo source code, choose SSH." msgstr "" -#: ../../content/administration/install/install.rst:286 -msgid "**The Enterprise Git repository does not contain the full Odoo source code**. It is only a collection of extra add-ons. The main server code is in the Community version. Running the Enterprise version actually means running the server from the Community version with the addons-path option set to the folder with the Enterprise version. You need to clone both the Community and Enterprise repository to have a working Odoo Enterprise installation. See :ref:`setup/install/editions` to get access to the Enterprise repository." -msgstr "" - -#: ../../content/administration/install/install.rst:299 -#: ../../content/administration/install/install.rst:317 -#: ../../content/administration/install/install.rst:335 +#: ../../content/administration/install/install.rst:291 +#: ../../content/administration/install/install.rst:309 +#: ../../content/administration/install/install.rst:327 msgid "Clone with HTTPS" msgstr "" -#: ../../content/administration/install/install.rst:306 -#: ../../content/administration/install/install.rst:324 -#: ../../content/administration/install/install.rst:342 +#: ../../content/administration/install/install.rst:298 +#: ../../content/administration/install/install.rst:316 +#: ../../content/administration/install/install.rst:334 msgid "Clone with SSH" msgstr "" -#: ../../content/administration/install/install.rst:331 -#: ../../content/administration/install/install.rst:407 -#: ../../content/administration/install/install.rst:474 -#: ../../content/administration/install/install.rst:603 -#: ../../content/administration/install/install.rst:692 +#: ../../content/administration/install/install.rst:323 +#: ../../content/administration/install/install.rst:400 +#: ../../content/administration/install/install.rst:467 +#: ../../content/administration/install/install.rst:596 +#: ../../content/administration/install/install.rst:687 msgid "Mac OS" msgstr "" -#: ../../content/administration/install/install.rst:350 -msgid "**The Enterprise git repository does not contain the full Odoo source code**. It is only a collection of extra add-ons. The main server code is in the Community version. Running the Enterprise version actually means running the server from the Community version with the addons-path option set to the folder with the Enterprise version. You need to clone both the Community and Enterprise repository to have a working Odoo Enterprise installation." +#: ../../content/administration/install/install.rst:342 +msgid "**The Enterprise git repository does not contain the full Odoo source code**. It is only a collection of extra add-ons. The main server code is in the Community version. Running the Enterprise version actually means running the server from the Community version with the addons-path option set to the folder with the Enterprise version. You need to clone both the Community and Enterprise repository to have a working Odoo Enterprise installation. See :ref:`setup/install/editions` to get access to the Enterprise repository." msgstr "" -#: ../../content/administration/install/install.rst:362 +#: ../../content/administration/install/install.rst:355 msgid "Python" msgstr "" -#: ../../content/administration/install/install.rst:368 +#: ../../content/administration/install/install.rst:361 msgid "Odoo requires Python 3.7 or later to run. Visit `Python's download page `_ to download and install the latest version of Python 3 on your machine." msgstr "" -#: ../../content/administration/install/install.rst:371 +#: ../../content/administration/install/install.rst:364 msgid "During installation, check **Add Python 3 to PATH**, then click **Customize Installation** and make sure that **pip** is checked." msgstr "" -#: ../../content/administration/install/install.rst:375 -#: ../../content/administration/install/install.rst:394 -#: ../../content/administration/install/install.rst:413 +#: ../../content/administration/install/install.rst:368 +#: ../../content/administration/install/install.rst:387 +#: ../../content/administration/install/install.rst:406 msgid "If Python 3 is already installed, make sure that the version is 3.7 or above, as previous versions are not compatible with Odoo." msgstr "" -#: ../../content/administration/install/install.rst:382 -#: ../../content/administration/install/install.rst:401 -#: ../../content/administration/install/install.rst:420 +#: ../../content/administration/install/install.rst:375 +#: ../../content/administration/install/install.rst:394 +#: ../../content/administration/install/install.rst:413 msgid "Verify also that pip_ is installed for this version." msgstr "" -#: ../../content/administration/install/install.rst:390 +#: ../../content/administration/install/install.rst:383 msgid "Odoo requires Python 3.7 or later to run. Use your package manager to download and install Python 3 on your machine if it is not already done." msgstr "" -#: ../../content/administration/install/install.rst:409 +#: ../../content/administration/install/install.rst:402 msgid "Odoo requires Python 3.7 or later to run. Use your preferred package manager (homebrew_, macports_) to download and install Python 3 on your machine if it is not already done." msgstr "" -#: ../../content/administration/install/install.rst:433 +#: ../../content/administration/install/install.rst:426 msgid "Odoo uses PostgreSQL as database management system. `Download and install PostgreSQL `_ (supported version: 12.0 and later)." msgstr "" -#: ../../content/administration/install/install.rst:436 -#: ../../content/administration/install/install.rst:462 -#: ../../content/administration/install/install.rst:485 +#: ../../content/administration/install/install.rst:429 +#: ../../content/administration/install/install.rst:455 +#: ../../content/administration/install/install.rst:478 msgid "By default, the only user is `postgres` but Odoo forbids connecting as `postgres`, so you need to create a new PostgreSQL user:" msgstr "" -#: ../../content/administration/install/install.rst:439 +#: ../../content/administration/install/install.rst:432 msgid "Add PostgreSQL's `bin` directory (by default: :file:`C:\\\\Program Files\\\\PostgreSQL\\\\\\\\bin`) to your `PATH`." msgstr "" -#: ../../content/administration/install/install.rst:441 +#: ../../content/administration/install/install.rst:434 msgid "Create a postgres user with a password using the pg admin gui:" msgstr "" -#: ../../content/administration/install/install.rst:443 +#: ../../content/administration/install/install.rst:436 msgid "Open **pgAdmin**." msgstr "" -#: ../../content/administration/install/install.rst:444 +#: ../../content/administration/install/install.rst:437 msgid "Double-click the server to create a connection." msgstr "" -#: ../../content/administration/install/install.rst:445 +#: ../../content/administration/install/install.rst:438 msgid "Select :menuselection:`Object --> Create --> Login/Group Role`." msgstr "" -#: ../../content/administration/install/install.rst:446 +#: ../../content/administration/install/install.rst:439 msgid "Enter the username in the **Role Name** field (e.g. `odoo`)." msgstr "" -#: ../../content/administration/install/install.rst:447 +#: ../../content/administration/install/install.rst:440 msgid "Open the **Definition** tab and enter the password (e.g. `odoo`), then click **Save**." msgstr "" -#: ../../content/administration/install/install.rst:448 +#: ../../content/administration/install/install.rst:441 msgid "Open the **Privileges** tab and switch **Can login?** to `Yes` and **Create database?** to `Yes`." msgstr "" -#: ../../content/administration/install/install.rst:453 +#: ../../content/administration/install/install.rst:446 msgid "Odoo uses PostgreSQL as database management system. Use your package manager to download and install PostgreSQL (supported version: 12.0 and later)." msgstr "" -#: ../../content/administration/install/install.rst:456 +#: ../../content/administration/install/install.rst:449 msgid "It can be achieved by executing the following:" msgstr "" -#: ../../content/administration/install/install.rst:471 -#: ../../content/administration/install/install.rst:494 +#: ../../content/administration/install/install.rst:464 +#: ../../content/administration/install/install.rst:487 msgid "Because your PostgreSQL user has the same name as your Unix login, you will be able to connect to the database without password." msgstr "" -#: ../../content/administration/install/install.rst:476 +#: ../../content/administration/install/install.rst:469 msgid "Odoo uses PostgreSQL as database management system. Use `postgres.app `_ to download and install PostgreSQL (supported version: 12.0 and later)." msgstr "" -#: ../../content/administration/install/install.rst:481 +#: ../../content/administration/install/install.rst:474 msgid "To make the command line tools bundled with `postgres.app` available, make sure to setup your `$PATH` variable by following the `Postgres.app CLI Tools Instructions `_." msgstr "" -#: ../../content/administration/install/install.rst:500 +#: ../../content/administration/install/install.rst:493 msgid "Dependencies" msgstr "" -#: ../../content/administration/install/install.rst:506 +#: ../../content/administration/install/install.rst:499 msgid "Before installing the dependencies, you must download and install the `Build Tools for Visual Studio `_. When prompted, select **C++ build tools** in the **Workloads** tab and install them." msgstr "" -#: ../../content/administration/install/install.rst:510 -#: ../../content/administration/install/install.rst:605 +#: ../../content/administration/install/install.rst:503 +#: ../../content/administration/install/install.rst:598 msgid "Odoo dependencies are listed in the `requirements.txt` file located at the root of the Odoo community directory." msgstr "" -#: ../../content/administration/install/install.rst:514 -#: ../../content/administration/install/install.rst:581 -#: ../../content/administration/install/install.rst:609 +#: ../../content/administration/install/install.rst:507 +#: ../../content/administration/install/install.rst:574 +#: ../../content/administration/install/install.rst:602 msgid "It can be preferable to not mix python modules packages between different instances of Odoo or with your system. You can use virtualenv_ to create isolated Python environments." msgstr "" -#: ../../content/administration/install/install.rst:517 +#: ../../content/administration/install/install.rst:510 msgid "Navigate to the path of your Odoo Community installation (`CommunityPath`) and run **pip** on the requirements file in a terminal **with Administrator privileges**:" msgstr "" -#: ../../content/administration/install/install.rst:526 -#: ../../content/administration/install/install.rst:593 -#: ../../content/administration/install/install.rst:633 +#: ../../content/administration/install/install.rst:519 +#: ../../content/administration/install/install.rst:586 +#: ../../content/administration/install/install.rst:626 msgid "For languages with right-to-left interface (such as Arabic or Hebrew), the package `rtlcss` is needed:" msgstr "" -#: ../../content/administration/install/install.rst:529 +#: ../../content/administration/install/install.rst:522 msgid "Download and install `nodejs `_." msgstr "" -#: ../../content/administration/install/install.rst:530 -#: ../../content/administration/install/install.rst:597 -#: ../../content/administration/install/install.rst:637 +#: ../../content/administration/install/install.rst:523 +#: ../../content/administration/install/install.rst:590 +#: ../../content/administration/install/install.rst:630 msgid "Install `rtlcss`:" msgstr "" -#: ../../content/administration/install/install.rst:536 +#: ../../content/administration/install/install.rst:529 msgid "Edit the System Environment's variable `PATH` to add the folder where `rtlcss.cmd` is located (typically: :file:`C:\\\\Users\\\\\\\\AppData\\\\Roaming\\\\npm\\\\`)." msgstr "" -#: ../../content/administration/install/install.rst:541 +#: ../../content/administration/install/install.rst:534 msgid "Using your **distribution packages** is the preferred way of installing dependencies. Alternatively, you can install the python dependencies with **pip**." msgstr "" -#: ../../content/administration/install/install.rst:548 +#: ../../content/administration/install/install.rst:541 msgid "For Debian-based systems, the packages are listed in the `debian/control `_ file of the Odoo sources." msgstr "" -#: ../../content/administration/install/install.rst:551 +#: ../../content/administration/install/install.rst:544 msgid "On Debian/Ubuntu, the following commands should install the required packages:" msgstr "" -#: ../../content/administration/install/install.rst:558 +#: ../../content/administration/install/install.rst:551 msgid "Install with pip" msgstr "" -#: ../../content/administration/install/install.rst:560 +#: ../../content/administration/install/install.rst:553 msgid "As some of the python packages need a compilation step, they require system libraries to be installed." msgstr "" -#: ../../content/administration/install/install.rst:563 +#: ../../content/administration/install/install.rst:556 msgid "On Debian/Ubuntu-based systems, the following command should install these required libraries:" msgstr "" -#: ../../content/administration/install/install.rst:570 +#: ../../content/administration/install/install.rst:563 msgid "Odoo dependencies are listed in the :file:`requirements.txt` file located at the root of the Odoo community directory." msgstr "" @@ -1358,101 +1354,101 @@ msgstr "" msgid "E.g., for Odoo 15.0, the `python3-babel` package version is 2.8.0 in Debian Bullseye and 2.6.0 in Ubuntu Focal. The lowest version is then chosen in the :file:`requirements.txt`." msgstr "" -#: ../../content/administration/install/install.rst:585 +#: ../../content/administration/install/install.rst:578 msgid "Navigate to the path of your Odoo Community installation (:file:`CommunityPath`) and run **pip** on the requirements file to install the requirements for the current user." msgstr "" -#: ../../content/administration/install/install.rst:596 +#: ../../content/administration/install/install.rst:589 msgid "Download and install **nodejs** and **npm** with your package manager." msgstr "" -#: ../../content/administration/install/install.rst:612 +#: ../../content/administration/install/install.rst:605 msgid "Navigate to the path of your Odoo Community installation (`CommunityPath`) and run **pip** on the requirements file:" msgstr "" -#: ../../content/administration/install/install.rst:622 +#: ../../content/administration/install/install.rst:615 msgid "Non-Python dependencies need to be installed with a package manager:" msgstr "" -#: ../../content/administration/install/install.rst:624 +#: ../../content/administration/install/install.rst:617 msgid "Download and install the **Command Line Tools**:" msgstr "" -#: ../../content/administration/install/install.rst:630 +#: ../../content/administration/install/install.rst:623 msgid "Download and install the package manager of your choice (homebrew_, macports_)." msgstr "" -#: ../../content/administration/install/install.rst:631 +#: ../../content/administration/install/install.rst:624 msgid "Install non-python dependencies." msgstr "" -#: ../../content/administration/install/install.rst:636 +#: ../../content/administration/install/install.rst:629 msgid "Download and install **nodejs** with your preferred package manager (homebrew_, macports_)." msgstr "" -#: ../../content/administration/install/install.rst:649 +#: ../../content/administration/install/install.rst:644 msgid "Running Odoo" msgstr "" -#: ../../content/administration/install/install.rst:651 +#: ../../content/administration/install/install.rst:646 msgid "Once all dependencies are set up, Odoo can be launched by running `odoo-bin`, the command-line interface of the server. It is located at the root of the Odoo Community directory." msgstr "" -#: ../../content/administration/install/install.rst:654 +#: ../../content/administration/install/install.rst:649 msgid "To configure the server, you can either specify :ref:`command-line arguments ` or a :ref:`configuration file `." msgstr "" -#: ../../content/administration/install/install.rst:658 +#: ../../content/administration/install/install.rst:653 msgid "For the Enterprise edition, you must add the path to the `enterprise` addons to the `addons-path` argument. Note that it must come before the other paths in `addons-path` for addons to be loaded correctly." msgstr "" -#: ../../content/administration/install/install.rst:662 +#: ../../content/administration/install/install.rst:657 msgid "Common necessary configurations are:" msgstr "" -#: ../../content/administration/install/install.rst:664 +#: ../../content/administration/install/install.rst:659 msgid "PostgreSQL user and password." msgstr "" -#: ../../content/administration/install/install.rst:665 +#: ../../content/administration/install/install.rst:660 msgid "Custom addon paths beyond the defaults, to load your own modules." msgstr "" -#: ../../content/administration/install/install.rst:667 +#: ../../content/administration/install/install.rst:662 msgid "A typical way to run the server would be:" msgstr "" -#: ../../content/administration/install/install.rst:678 +#: ../../content/administration/install/install.rst:673 msgid "Where `CommunityPath` is the path of the Odoo Community installation, `dbuser` is the PostgreSQL login, `dbpassword` is the PostgreSQL password, and `mydb` is the name of the PostgreSQL database." msgstr "" -#: ../../content/administration/install/install.rst:689 -#: ../../content/administration/install/install.rst:699 +#: ../../content/administration/install/install.rst:684 +#: ../../content/administration/install/install.rst:694 msgid "Where `CommunityPath` is the path of the Odoo Community installation, and `mydb` is the name of the PostgreSQL database." msgstr "" -#: ../../content/administration/install/install.rst:702 +#: ../../content/administration/install/install.rst:697 msgid "After the server has started (the INFO log `odoo.modules.loading: Modules loaded.` is printed), open http://localhost:8069 in your web browser and log in with the base administrator account: Use `admin` for the :guilabel:`Email` and, again, `admin` for the :guilabel:`Password`. That's it, you just logged into your own Odoo database!" msgstr "" -#: ../../content/administration/install/install.rst:708 +#: ../../content/administration/install/install.rst:703 msgid "From there, you can create and manage new :doc:`users `." msgstr "" -#: ../../content/administration/install/install.rst:710 +#: ../../content/administration/install/install.rst:705 msgid "The user account you use to log into Odoo's web interface differs from the :option:`--db_user ` CLI argument." msgstr "" -#: ../../content/administration/install/install.rst:714 +#: ../../content/administration/install/install.rst:709 msgid ":doc:`The exhaustive list of CLI arguments for odoo-bin `." msgstr "" -#: ../../content/administration/install/install.rst:719 +#: ../../content/administration/install/install.rst:714 #: ../../content/administration/maintain/update.rst:149 msgid "Docker" msgstr "" -#: ../../content/administration/install/install.rst:721 +#: ../../content/administration/install/install.rst:716 msgid "The full documentation on how to use Odoo with Docker can be found on the official Odoo `docker image `_ page." msgstr "" @@ -1513,7 +1509,7 @@ msgid "API permissions" msgstr "" #: ../../content/administration/maintain/azure_oauth.rst:49 -msgid "The :guilabel:`API permissions` should be set next. Odoo will need specific API permissions to be able to read (IMAP) and send (IMAP) emails in the Microsoft 365 setup. First, click the :guilabel:`API permissions` link, located in the left menu bar. Next, click on the :guilabel:`(+) Add a Permission` button and select :guilabel:`Microsoft Graph` under :guilabel:`Commonly Used Microsoft APIs`. After, select the :guilabel:`Delegated Permissions` option." +msgid "The :guilabel:`API permissions` should be set next. Odoo will need specific API permissions to be able to read (IMAP) and send (SMTP) emails in the Microsoft 365 setup. First, click the :guilabel:`API permissions` link, located in the left menu bar. Next, click on the :guilabel:`(+) Add a Permission` button and select :guilabel:`Microsoft Graph` under :guilabel:`Commonly Used Microsoft APIs`. After, select the :guilabel:`Delegated Permissions` option." msgstr "" #: ../../content/administration/maintain/azure_oauth.rst:55 @@ -1610,7 +1606,7 @@ msgid "This completes the setup on the :guilabel:`Microsoft Azure Portal` side." msgstr "" #: ../../content/administration/maintain/azure_oauth.rst:136 -#: ../../content/administration/maintain/google_oauth.rst:88 +#: ../../content/administration/maintain/google_oauth.rst:111 msgid "Setup in Odoo" msgstr "" @@ -1639,7 +1635,7 @@ msgid "Outlook Credentials in Odoo General Settings." msgstr "" #: ../../content/administration/maintain/azure_oauth.rst:159 -#: ../../content/administration/maintain/google_oauth.rst:102 +#: ../../content/administration/maintain/google_oauth.rst:127 msgid "Configure outgoing email server" msgstr "" @@ -1709,6 +1705,7 @@ msgid ":doc:`../../applications/general/email_communication/email_servers`" msgstr "" #: ../../content/administration/maintain/domain_names.rst:3 +#: ../../content/administration/maintain/odoo_online.rst:70 msgid "Domain names" msgstr "" @@ -1910,7 +1907,7 @@ msgstr "" #: ../../content/administration/maintain/domain_names.rst:171 #: ../../content/administration/maintain/domain_names.rst:250 -#: ../../content/administration/maintain/supported_versions.rst:27 +#: ../../content/administration/maintain/supported_versions.rst:32 #: ../../content/administration/odoo_sh.rst:5 #: ../../content/administration/upgrade/odoo_sh.rst:3 msgid "Odoo.sh" @@ -2158,7 +2155,7 @@ msgid ":doc:`/applications/general/email_communication/email_servers`" msgstr "" #: ../../content/administration/maintain/enterprise.rst:6 -msgid "Upgrade Community to Enterprise" +msgid "Switch from Community to Enterprise" msgstr "" #: ../../content/administration/maintain/enterprise.rst:8 @@ -2282,82 +2279,102 @@ msgid "Create a new project" msgstr "" #: ../../content/administration/maintain/google_oauth.rst:24 -msgid "To get started, go to the `Google API Platform `_. Log in with your *Google Workspace* account if you have one, otherwise log in with your personal Gmail account (this should match the email address you want to configure in Odoo)." +msgid "To get started, go to the `Google API Console `_. Log in with your *Google Workspace* account if you have one, otherwise log in with your personal Gmail account (this should match the email address you want to configure in Odoo)." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:29 -msgid "After that, click on :guilabel:`Create Project`, located on the far right of the OAuth consent screen. If a project has already been created in this account, then the :guilabel:`New Project` option will be located on the top left under the :guilabel:`Select a project` drop-down menu." +#: ../../content/administration/maintain/google_oauth.rst:28 +msgid "After that, click on :guilabel:`Create Project`, located on the far right of the :guilabel:`OAuth consent screen`. If a project has already been created in this account, then the :guilabel:`New Project` option will be located on the top right under the :guilabel:`Select a project` drop-down menu." msgstr "" #: ../../content/administration/maintain/google_oauth.rst:33 -msgid "On the :guilabel:`New Project` screen, rename the :guilabel:`Project name` to `Odoo` and browse for the :guilabel:`Location`. Set the :guilabel:`Location` as the `Google Workspace` organization. If you are using a personal Gmail account, then leave the :guilabel:`Location` as `No Organization`." +msgid "On the :menuselection:`New Project` screen, rename the :guilabel:`Project name` to `Odoo` and browse for the :guilabel:`Location`. Set the :guilabel:`Location` as the *Google Workspace organization*. If you are using a personal Gmail account, then leave the :guilabel:`Location` as :guilabel:`No Organization`." msgstr "" #: ../../content/administration/maintain/google_oauth.rst:-1 -msgid "Project Name and Location for Google Oauth." +msgid "Project Name and Location for Google OAuth." +msgstr "" + +#: ../../content/administration/maintain/google_oauth.rst:42 +msgid "Click on :guilabel:`Create` to finish this step." +msgstr "" + +#: ../../content/administration/maintain/google_oauth.rst:45 +msgid "OAuth consent screen" +msgstr "" + +#: ../../content/administration/maintain/google_oauth.rst:47 +msgid "If the page doesn't redirect to the :menuselection:`User Type` options, click on :guilabel:`OAuth consent screen` in the left menu." +msgstr "" + +#: ../../content/administration/maintain/google_oauth.rst:50 +msgid "Under :guilabel:`User Type` options, select the appropriate :guilabel:`User Type`, and then click on :guilabel:`Create` again, which will finally navigate to the :menuselection:`Edit app registration` page." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:41 -msgid "Click on :guilabel:`Create` to finish this step. On the next screen, :guilabel:`User Type` options, select the :guilabel:`External` option, and then click on :guilabel:`Create` again, which will finally navigate to the :guilabel:`Edit app registration` page." +#: ../../content/administration/maintain/google_oauth.rst:55 +msgid "*Personal* Gmail Accounts are only allowed to be **External** User Type, which means Google may require an approval, or for *Scopes* to be added on. However, using a *Google WorkSpace* account allows for **Internal** User Type to be used." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:46 +#: ../../content/administration/maintain/google_oauth.rst:59 +msgid "Note, as well, that while the API connection is in the *External* testing mode, then no approval is necessary from Google. User limits in this testing mode is set to 100 users." +msgstr "" + +#: ../../content/administration/maintain/google_oauth.rst:63 msgid "Edit app registration" msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:48 -msgid "On the :guilabel:`Oauth consent screen` step, under the :guilabel:`App information` section, enter `Odoo` in the :guilabel:`App name` field. Select the organization's email address under the :guilabel:`User support` email field." +#: ../../content/administration/maintain/google_oauth.rst:65 +msgid "Next we will configure the app registration of the project." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:51 -msgid "Next, under :menuselection:`App Domain --> Authorized domains`, click on :guilabel:`Add Domain` and enter `odoo.com`." +#: ../../content/administration/maintain/google_oauth.rst:67 +msgid "On the :guilabel:`OAuth consent screen` step, under the :guilabel:`App information` section, enter `Odoo` in the :guilabel:`App name` field. Select the organization's email address under the :guilabel:`User support` email field." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:53 -msgid "After that, under the :guilabel:`Developer contact information` section, enter the organization's email address. Google uses this email address to notify the organization about any changes to your project." +#: ../../content/administration/maintain/google_oauth.rst:71 +msgid "Next, under :menuselection:`App Domain --> Authorized domains`, click on :guilabel:`Add Domain` and enter `odoo.com`." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:56 -msgid "Next, click on the :guilabel:`Save and Continue` button." +#: ../../content/administration/maintain/google_oauth.rst:74 +msgid "After that, under the :guilabel:`Developer contact information` section, enter the organization's email address. Google uses this email address to notify the organization about any changes to your project." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:57 -msgid "Then, skip the :guilabel:`Scopes` page by scrolling to the bottom and clicking on :guilabel:`Save and Continue`." +#: ../../content/administration/maintain/google_oauth.rst:78 +msgid "Next, click on the :guilabel:`Save and Continue` button. Then, skip the :menuselection:`Scopes` page by scrolling to the bottom and clicking on :guilabel:`Save and Continue`." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:59 -msgid "Next, add the email being configured under the :guilabel:`Test users` step by clicking on :guilabel:`Add Users` and then the :guilabel:`Save and Continue` button. A summary of the :guilabel:`App registration` appears." +#: ../../content/administration/maintain/google_oauth.rst:81 +msgid "If continuing in testing mode (External), add the email addresses being configured under the :guilabel:`Test users` step, by clicking on :guilabel:`Add Users`, and then the :guilabel:`Save and Continue` button. A summary of the app registration appears." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:62 -msgid "Finally, scroll to the bottom and click on :guilabel:`Back to Dashboard`." +#: ../../content/administration/maintain/google_oauth.rst:85 +msgid "Finally, scroll to the bottom and click on :guilabel:`Back to Dashboard` to finish setting up the project." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:65 +#: ../../content/administration/maintain/google_oauth.rst:89 msgid "Create Credentials" msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:67 -msgid "Now that you have set up the project, you need to create credentials, which includes the :guilabel:`Client ID` and :guilabel:`Client Secret`. First, click on :guilabel:`Credentials` in the left sidebar menu." +#: ../../content/administration/maintain/google_oauth.rst:91 +msgid "Now that the project is set up, credentials should be created, which includes the *Client ID* and *Client Secret*. First, click on :guilabel:`Credentials` in the left sidebar menu." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:71 +#: ../../content/administration/maintain/google_oauth.rst:94 msgid "Then, click on :guilabel:`Create Credentials` in the top menu and select :guilabel:`OAuth client ID` from the dropdown menu." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:74 +#: ../../content/administration/maintain/google_oauth.rst:97 msgid "Under :guilabel:`Application Type`, select :guilabel:`Web Application` from the dropdown menu." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:75 -msgid "In the :guilabel:`Client ID` field, enter `Odoo`." +#: ../../content/administration/maintain/google_oauth.rst:98 +msgid "In the :guilabel:`Name` field, enter `Odoo`." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:76 -msgid "Under the :guilabel:`Authorized redirect URIs` label, click the button :guilabel:`ADD URI`, and then input `https://yourdbname.odoo.com/google_gmail/confirm` in the :guilabel:`URIs 1` field. Be sure to replace the *yourdbname* part of the URL with your actual Odoo database name." +#: ../../content/administration/maintain/google_oauth.rst:99 +msgid "Under the :guilabel:`Authorized redirect URIs` label, click the button :guilabel:`ADD URI`, and then input `https://yourdbname.odoo.com/google_gmail/confirm` in the :guilabel:`URIs 1` field. Be sure to replace the *yourdbname* part of the URL with the actual Odoo database name." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:79 +#: ../../content/administration/maintain/google_oauth.rst:102 msgid "Next, click on :guilabel:`Create` to generate an OAuth :guilabel:`Client ID` and :guilabel:`Client Secret`. Finally, copy each generated value for later use when configuring in Odoo, and then navigate to the Odoo database." msgstr "" @@ -2365,71 +2382,75 @@ msgstr "" msgid "Client ID and Client Secret for Google OAuth." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:91 +#: ../../content/administration/maintain/google_oauth.rst:114 msgid "Enter Google Credentials" msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:93 +#: ../../content/administration/maintain/google_oauth.rst:116 msgid "First, open Odoo and navigate to the :guilabel:`Apps` module. Then, remove the :guilabel:`Apps` filter from the search bar and type in `Google`. Install the module called :guilabel:`Google Gmail`." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:96 -msgid "Next, navigate to :menuselection:`Settings --> General Settings`, and under the :guilabel:`Discuss` section, ensure that the checkbox for :guilabel:`Custom Email Servers` is checked. This populates a new option for :guilabel:`Gmail Credentials`. Then, copy and paste the :guilabel:`Client ID` and :guilabel:`Client Secret` into the respective fields and :guilabel:`Save` the settings." +#: ../../content/administration/maintain/google_oauth.rst:120 +msgid "Next, navigate to :menuselection:`Settings --> General Settings`, and under the :guilabel:`Discuss` section, ensure that the checkbox for :guilabel:`Custom Email Servers` or :guilabel:`External Email Servers` is checked. This populates a new option for :guilabel:`Gmail Credentials` or :guilabel:`Use a Gmail Sever`. Then, copy and paste the respective values into the :guilabel:`Client ID` and :guilabel:`Client Secret` fields and :guilabel:`Save` the settings." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:104 -msgid "After that, on the :guilabel:`General Settings` page, under :guilabel:`Custom Email Servers`, click :guilabel:`Outgoing Email Servers` to configure the external Gmail account." +#: ../../content/administration/maintain/google_oauth.rst:129 +msgid "To configure the external Gmail account, return to the top of the :guilabel:`Custom Email Servers` setting and then click the :guilabel:`Outgoing Email Servers` link." msgstr "" #: ../../content/administration/maintain/google_oauth.rst:-1 msgid "Configure Outgoing Email Servers in Odoo." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:111 -msgid "Then, :guilabel:`Create` a new email server and select the option for :guilabel:`Gmail`. Next, fill in the :guilabel:`Description` (can be anything) and the email :guilabel:`Username` and click on :guilabel:`Connect your Gmail account`." +#: ../../content/administration/maintain/google_oauth.rst:136 +msgid "Then, click on :guilabel:`New` or :guilabel:`Create` to create a new email server, and fill in the :guilabel:`Name`, :guilabel:`Description`, and the email :guilabel:`Username` (if required)." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:115 -msgid "A new window from :guilabel:`Google` opens to complete the authorization process. Select the appropriate email address that is being configured in Odoo." +#: ../../content/administration/maintain/google_oauth.rst:139 +msgid "Next, click on :guilabel:`Gmail OAuth Authentication` or :guilabel:`Gmail` (under the :guilabel:`Authenticate with` or :guilabel:`Connection` section). Finally, click on :guilabel:`Connect your Gmail Account`." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:118 -msgid "If the email address is a personal account, an extra step pops up, click :guilabel:`Continue` to allow the verification and connect the Gmail account to Odoo." +#: ../../content/administration/maintain/google_oauth.rst:143 +msgid "A new window labeled :guilabel:`Google` opens to complete the authorization process. Select the appropriate email address that is being configured in Odoo." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:121 +#: ../../content/administration/maintain/google_oauth.rst:146 +msgid "If the email address is a personal account, then an extra step pops up, so click :guilabel:`Continue` to allow the verification and connect the Gmail account to Odoo." +msgstr "" + +#: ../../content/administration/maintain/google_oauth.rst:149 msgid "Then, allow Odoo to access the Google account by clicking on :guilabel:`Continue` or :guilabel:`Allow`. After that, the page navigates back to the newly configured outgoing email server in Odoo. The configuration automatically loads the token in Odoo, and a tag stating :guilabel:`Gmail Token Valid` appears in green." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:130 -msgid "Finally, save the settings and :guilabel:`Test the Connection`. A confirmation message should appear. The Odoo database can now send safe, secure emails through Google using OAuth authentication." +#: ../../content/administration/maintain/google_oauth.rst:158 +msgid "Finally, :guilabel:`Test the Connection`. A confirmation message should appear. The Odoo database can now send safe, secure emails through Google using OAuth authentication." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:135 +#: ../../content/administration/maintain/google_oauth.rst:162 msgid "Google OAuth FAQ" msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:138 +#: ../../content/administration/maintain/google_oauth.rst:165 msgid "Production VS Testing Publishing Status" msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:140 -msgid "Choosing :guilabel:`Production` as the :guilabel:`Publishing Status` (instead of Testing) will display the following warning message:" +#: ../../content/administration/maintain/google_oauth.rst:167 +msgid "Choosing :guilabel:`Production` as the :guilabel:`Publishing Status` (instead of :guilabel:`Testing`) will display the following warning message:" msgstr "" #: ../../content/administration/maintain/google_oauth.rst:-1 msgid "OAuth is Limited to 100 Sensitive Scope Logins." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:147 +#: ../../content/administration/maintain/google_oauth.rst:174 msgid "To correct this warning, navigate to the `Google API Platform `_. If the :guilabel:`Publishing status` is :guilabel:`In Production`, click :guilabel:`Back to Testing` to correct the issue." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:152 +#: ../../content/administration/maintain/google_oauth.rst:179 msgid "No Test Users Added" msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:154 +#: ../../content/administration/maintain/google_oauth.rst:181 msgid "If no test users are added to the OAuth consent screen, then a 403 access denied error will populate." msgstr "" @@ -2437,44 +2458,40 @@ msgstr "" msgid "403 Access Denied Error." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:161 +#: ../../content/administration/maintain/google_oauth.rst:188 msgid "To correct this error, return to the :guilabel:`OAuth consent screen` under :guilabel:`APIs & Services` and add test user(s) to the app. Add the email that you are configuring in Odoo." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:166 +#: ../../content/administration/maintain/google_oauth.rst:192 msgid "Gmail Module not updated" msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:168 -msgid "If the :guilabel:`Gmail Module` in Odoo has not been updated to the latest version, then a :guilabel:`Forbidden` error message populates." +#: ../../content/administration/maintain/google_oauth.rst:194 +msgid "If the *Google Gmail* module in Odoo has not been updated to the latest version, then a :guilabel:`Forbidden` error message populates." msgstr "" #: ../../content/administration/maintain/google_oauth.rst:-1 msgid "Forbidden you don't have the permission to access the requested resource." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:175 -msgid "To correct this error, go to the :guilabel:`Apps` module and clear out the search terms. Then, search for `Gmail` or `Google` and upgrade the :guilabel:`Google Gmail` module. Finally, click on the three dots on the upper right of the module and select :guilabel:`Upgrade`." +#: ../../content/administration/maintain/google_oauth.rst:201 +msgid "To correct this error, go to the :menuselection:`Apps` module and clear out the search terms. Then, search for `Gmail` or `Google` and upgrade the :guilabel:`Google Gmail` module. Finally, click on the three dots on the upper right of the module and select :guilabel:`Upgrade`." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:180 +#: ../../content/administration/maintain/google_oauth.rst:206 msgid "Application Type" msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:182 -msgid "When creating the :guilabel:`Credentials` (OAuth Client ID and Client Secret), if :guilabel:`Desktop App` is selected for the :guilabel:`Application Type`, an :guilabel:`Authorization Error` appears." +#: ../../content/administration/maintain/google_oauth.rst:208 +msgid "When creating the credentials (OAuth *Client ID* and *Client Secret*), if :guilabel:`Desktop App` is selected for the :guilabel:`Application Type`, an :guilabel:`Authorization Error` appears." msgstr "" #: ../../content/administration/maintain/google_oauth.rst:-1 msgid "Error 400 Redirect URI Mismatch." msgstr "" -#: ../../content/administration/maintain/google_oauth.rst:190 -msgid "To correct this error, delete the credentials already created and create new credentials, selecting :guilabel:`Web Application` for the :guilabel:`Application Type`. Then, under :guilabel:`Authorized redirect URIs`, click :guilabel:`ADD URI` and type: `https://yourdbname.odoo.com/google_gmail/confirm` in the field." -msgstr "" - -#: ../../content/administration/maintain/google_oauth.rst:196 -msgid "Replace *yourdbname* in the URL with the Odoo database name." +#: ../../content/administration/maintain/google_oauth.rst:215 +msgid "To correct this error, delete the credentials already created and create new credentials, selecting :guilabel:`Web Application` for the :guilabel:`Application Type`. Then, under :guilabel:`Authorized redirect URIs`, click :guilabel:`ADD URI` and type: `https://yourdbname.odoo.com/google_gmail/confirm` in the field, being sure to replace *yourdbname* in the URL with the Odoo database name." msgstr "" #: ../../content/administration/maintain/hosting_changes.rst:6 @@ -2873,222 +2890,188 @@ msgid "Odoo Online database management" msgstr "" #: ../../content/administration/maintain/odoo_online.rst:5 -msgid "To manage a database, sign in to https://www.odoo.com and access the `database management page `_ by clicking on the user icon, then on :guilabel:`My Databases`." -msgstr "" - -#: ../../content/administration/maintain/odoo_online.rst:-1 -msgid "Clicking on the user icon opens a drop-down menu. \"My databases\" button is highlighted." +msgid "To manage a database, go to the `database manager `_ and sign in as the database administrator." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:14 -msgid "Make sure to connect as the administrator of the database that changes will be made on." +#: ../../content/administration/maintain/odoo_online.rst:8 +msgid "All the main database management options are available by clicking the database name, except the upgrade option, which can be accessed by clicking the **arrow in a circle** icon next to the database name. It is only displayed if an upgrade is available." msgstr "" #: ../../content/administration/maintain/odoo_online.rst:-1 -msgid "Clicking on the gear icon opens the drop-down menu." -msgstr "" - -#: ../../content/administration/maintain/odoo_online.rst:20 -msgid "Open the drop-down menu next to the database that changes will be made on by clicking on the gear icon." -msgstr "" - -#: ../../content/administration/maintain/odoo_online.rst:23 -msgid "Several actions are available:" +msgid "Accessing the database management options" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:25 +#: ../../content/administration/maintain/odoo_online.rst:15 msgid ":ref:`odoo_online/upgrade`" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:26 +#: ../../content/administration/maintain/odoo_online.rst:16 msgid ":ref:`odoo_online/duplicate`" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:27 +#: ../../content/administration/maintain/odoo_online.rst:17 msgid ":ref:`odoo_online/rename`" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:28 +#: ../../content/administration/maintain/odoo_online.rst:18 msgid ":ref:`odoo_online/download`" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:29 +#: ../../content/administration/maintain/odoo_online.rst:19 msgid ":ref:`odoo_online/domains`" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:30 +#: ../../content/administration/maintain/odoo_online.rst:20 msgid ":ref:`odoo_online/tags`" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:31 +#: ../../content/administration/maintain/odoo_online.rst:21 msgid ":ref:`odoo_online/delete`" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:32 +#: ../../content/administration/maintain/odoo_online.rst:22 msgid ":ref:`odoo_online/contact-support`" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:33 +#: ../../content/administration/maintain/odoo_online.rst:23 msgid ":ref:`odoo_online/users`" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:38 +#: ../../content/administration/maintain/odoo_online.rst:28 #: ../../content/administration/odoo_sh/getting_started/branches.rst:293 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:77 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:113 #: ../../content/administration/upgrade.rst:10 msgid "Upgrade" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:40 -msgid "If the database is *not* on the latest **Online version**, the administrator should receive an invitation to :doc:`upgrade <../upgrade>` the database. A :guilabel:`Rolling Release`` button on the database's main screen proposes an upgrade to the latest version (e.g., 14.0 to 16.1)." -msgstr "" - -#: ../../content/administration/maintain/odoo_online.rst:0 -msgid "**If the Odoo database's version is lower than the latest major release:**" -msgstr "" - -#: ../../content/administration/maintain/odoo_online.rst:0 -msgid "The database must be upgraded within two months. After these two months, an automatic upgrade is initiated." -msgstr "" - -#: ../../content/administration/maintain/odoo_online.rst:0 -msgid "**If the Odoo database's version is equal to or higher than the latest major release:**" -msgstr "" - -#: ../../content/administration/maintain/odoo_online.rst:0 -msgid "Disregard the invitation to upgrade as the database probably wouldn't benefit from new features every two months." -msgstr "" - -#: ../../content/administration/maintain/odoo_online.rst:53 -msgid "Versions that are not supported anymore become deprecated and need to be updated to avoid security issues. Odoo recommends that the company initiate the upgrade, as this method allows for the company to request a test upgrade of the database to check for any discrepancies." -msgstr "" - -#: ../../content/administration/maintain/odoo_online.rst:58 -msgid ":doc:`../upgrade`" +#: ../../content/administration/maintain/odoo_online.rst:30 +msgid "Trigger a database upgrade." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:59 -msgid ":doc:`supported_versions`" +#: ../../content/administration/maintain/odoo_online.rst:33 +msgid "For more information about the upgrade process, check out the :doc:`Odoo Online upgrade documentation <../upgrade/odoo_online>`." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:64 +#: ../../content/administration/maintain/odoo_online.rst:39 msgid "Duplicate" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:66 -msgid "This allows to make an exact copy of the database to be able to perform testing without compromising the daily operations." +#: ../../content/administration/maintain/odoo_online.rst:41 +msgid "Create an exact copy of the database, which can be used to perform testing without compromising daily operations." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:70 -msgid "By checking :guilabel:`For testing purposes`, all external communication (emails, payments, delivery orders, etc.) are disabled by default on the duplicated database." +#: ../../content/administration/maintain/odoo_online.rst:45 +msgid "By checking :guilabel:`For testing purposes`, all external actions (emails, payments, delivery orders, etc.) are disabled by default on the duplicated database." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:72 -msgid "Duplicate databases expire automatically after 15 days." +#: ../../content/administration/maintain/odoo_online.rst:47 +msgid "Duplicated databases expire automatically after 15 days." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:77 +#: ../../content/administration/maintain/odoo_online.rst:52 msgid "Rename" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:79 +#: ../../content/administration/maintain/odoo_online.rst:54 msgid "Rename the database and its URL." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:84 +#: ../../content/administration/maintain/odoo_online.rst:59 msgid "Download" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:86 -msgid "Instantly download a ZIP file with a backup of the database." +#: ../../content/administration/maintain/odoo_online.rst:61 +msgid "Download a ZIP file containing a backup of the database." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:89 -msgid "Databases are backed up daily according to the `Odoo Cloud SLA `_." +#: ../../content/administration/maintain/odoo_online.rst:64 +msgid "Databases are backed up daily as per the `Odoo Cloud Hosting SLA `_." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:95 -msgid "Domains" +#: ../../content/administration/maintain/odoo_online.rst:72 +msgid "Use a custom :doc:`domain name ` to access the database via another URL." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:97 -msgid "Configure custom domains to access the database via another URL." +#: ../../content/administration/maintain/odoo_online.rst:75 +msgid "You can :ref:`register a domain name for free `." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:100 -msgid ":doc:`domain_names`" +#: ../../content/administration/maintain/odoo_online.rst:80 +msgid "Tags" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:105 -msgid "Tags" +#: ../../content/administration/maintain/odoo_online.rst:82 +msgid "Add tags to easily identify and sort your databases." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:107 -msgid "Add tags to sort your databases out. You can search the tags in the search bar." +#: ../../content/administration/maintain/odoo_online.rst:85 +msgid "You can search for tags in the search bar." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:112 +#: ../../content/administration/maintain/odoo_online.rst:90 #: ../../content/administration/odoo_sh/getting_started/branches.rst:550 msgid "Delete" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:114 +#: ../../content/administration/maintain/odoo_online.rst:92 msgid "Delete a database instantly." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:117 -msgid "Deleting a database means that all data is permanently lost. The deletion is instant and for all users. It is recommended to create a backup of the database before deleting it." +#: ../../content/administration/maintain/odoo_online.rst:95 +msgid "Deleting a database means that all data is permanently lost. The deletion is instant and applies to all users. It is recommended to create a backup of the database before deleting it." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:120 -msgid "Carefully read the warning message that pops up and proceed only if the implications of deleting a database are fully understood:" +#: ../../content/administration/maintain/odoo_online.rst:98 +msgid "Carefully read the warning message and only proceed if the implications of deleting a database are fully understood." msgstr "" #: ../../content/administration/maintain/odoo_online.rst:-1 -msgid "A warning message is prompted before deleting a database." +msgid "The warning message displayed before deleting a database" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:128 +#: ../../content/administration/maintain/odoo_online.rst:105 msgid "Only an administrator can delete a database." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:129 -msgid "The database name is immediately available for a new database." +#: ../../content/administration/maintain/odoo_online.rst:106 +msgid "The database name is immediately made available to anyone." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:130 -msgid "It is not possible to delete a database if it is expired or linked to a subscription. If needed, please get in touch with `Odoo Support `_." +#: ../../content/administration/maintain/odoo_online.rst:107 +msgid "Deleting a database if it has expired or is linked to a subscription is impossible. In that case, contact `Odoo Support `_." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:136 -msgid "Contact Support" +#: ../../content/administration/maintain/odoo_online.rst:113 +msgid "Contact us" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:138 -msgid "Access the Odoo `support page `_ with your database's details already pre-filled." +#: ../../content/administration/maintain/odoo_online.rst:115 +msgid "Access the `Odoo.com support page `_ with the database's details already pre-filled." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:144 -msgid "Invite / Remove Users" +#: ../../content/administration/maintain/odoo_online.rst:121 +msgid "Invite / remove users" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:146 -msgid "To invite users, fill out the email address of the new user and click on :guilabel:`Invite`. To add multiple users, click on :guilabel:`Add more users`." +#: ../../content/administration/maintain/odoo_online.rst:123 +msgid "To invite users, fill out the new user's email address and click :guilabel:`Invite`. To add multiple users, click :guilabel:`Add more users`." msgstr "" #: ../../content/administration/maintain/odoo_online.rst:-1 -msgid "Clicking on \"Add more users\" adds additional email fields." +msgid "Inviting a user on a database" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:153 -msgid "To remove users, select the users to remove and click on :guilabel:`Remove`." +#: ../../content/administration/maintain/odoo_online.rst:129 +msgid "To remove users, select them and click :guilabel:`Remove`." msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:156 -msgid ":doc:`/applications/general/users/manage_users`" +#: ../../content/administration/maintain/odoo_online.rst:132 +msgid ":doc:`../../applications/general/users/manage_users`" msgstr "" -#: ../../content/administration/maintain/odoo_online.rst:157 -msgid ":doc:`/applications/general/users/delete_account`" +#: ../../content/administration/maintain/odoo_online.rst:133 +msgid ":doc:`../../applications/general/users/delete_account`" msgstr "" #: ../../content/administration/maintain/on_premise.rst:3 @@ -3300,274 +3283,342 @@ msgstr "" msgid "**Major releases are in bold type.**" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:27 +#: ../../content/administration/maintain/supported_versions.rst:33 #: ../../content/administration/upgrade/on_premise.rst:3 msgid "On-Premise" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:27 +#: ../../content/administration/maintain/supported_versions.rst:34 msgid "Release date" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:27 +#: ../../content/administration/maintain/supported_versions.rst:35 msgid "End of support" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:29 -msgid "Odoo saas~16.2" +#: ../../content/administration/maintain/supported_versions.rst:36 +msgid "Odoo saas~16.3" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:29 -#: ../../content/administration/maintain/supported_versions.rst:31 -#: ../../content/administration/maintain/supported_versions.rst:33 -#: ../../content/administration/maintain/supported_versions.rst:39 -#: ../../content/administration/maintain/supported_versions.rst:41 +#: ../../content/administration/maintain/supported_versions.rst:37 +#: ../../content/administration/maintain/supported_versions.rst:43 +#: ../../content/administration/maintain/supported_versions.rst:55 +#: ../../content/administration/maintain/supported_versions.rst:56 +#: ../../content/administration/maintain/supported_versions.rst:57 +#: ../../content/administration/maintain/supported_versions.rst:73 +#: ../../content/administration/maintain/supported_versions.rst:74 +#: ../../content/administration/maintain/supported_versions.rst:75 +#: ../../content/administration/maintain/supported_versions.rst:79 +#: ../../content/administration/maintain/supported_versions.rst:80 +#: ../../content/administration/maintain/supported_versions.rst:81 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:58 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:59 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:62 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:63 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:66 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:67 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:70 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:71 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:74 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:75 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:78 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:79 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:82 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:83 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:86 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:87 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:91 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:95 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:99 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:103 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:107 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:111 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:115 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:119 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:122 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:123 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:127 msgid "|green|" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:29 -#: ../../content/administration/maintain/supported_versions.rst:31 -#: ../../content/administration/maintain/supported_versions.rst:35 -#: ../../content/administration/maintain/supported_versions.rst:37 +#: ../../content/administration/maintain/supported_versions.rst:38 +#: ../../content/administration/maintain/supported_versions.rst:39 +#: ../../content/administration/maintain/supported_versions.rst:44 #: ../../content/administration/maintain/supported_versions.rst:45 -#: ../../content/administration/maintain/supported_versions.rst:49 -#: ../../content/administration/maintain/supported_versions.rst:53 -#: ../../content/administration/maintain/supported_versions.rst:55 -#: ../../content/administration/maintain/supported_versions.rst:59 -#: ../../content/administration/maintain/supported_versions.rst:61 +#: ../../content/administration/maintain/supported_versions.rst:50 +#: ../../content/administration/maintain/supported_versions.rst:51 +#: ../../content/administration/maintain/supported_versions.rst:62 #: ../../content/administration/maintain/supported_versions.rst:63 -#: ../../content/administration/maintain/supported_versions.rst:65 +#: ../../content/administration/maintain/supported_versions.rst:68 +#: ../../content/administration/maintain/supported_versions.rst:69 +#: ../../content/administration/maintain/supported_versions.rst:92 +#: ../../content/administration/maintain/supported_versions.rst:93 +#: ../../content/administration/maintain/supported_versions.rst:104 +#: ../../content/administration/maintain/supported_versions.rst:105 +#: ../../content/administration/maintain/supported_versions.rst:116 +#: ../../content/administration/maintain/supported_versions.rst:117 +#: ../../content/administration/maintain/supported_versions.rst:122 +#: ../../content/administration/maintain/supported_versions.rst:123 +#: ../../content/administration/maintain/supported_versions.rst:134 +#: ../../content/administration/maintain/supported_versions.rst:135 +#: ../../content/administration/maintain/supported_versions.rst:140 +#: ../../content/administration/maintain/supported_versions.rst:146 +#: ../../content/administration/maintain/supported_versions.rst:147 +#: ../../content/administration/maintain/supported_versions.rst:152 msgid "N/A" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:29 +#: ../../content/administration/maintain/supported_versions.rst:40 +msgid "June 2023" +msgstr "" + +#: ../../content/administration/maintain/supported_versions.rst:41 +msgid "September 2023 (planned)" +msgstr "" + +#: ../../content/administration/maintain/supported_versions.rst:42 +msgid "Odoo saas~16.2" +msgstr "" + +#: ../../content/administration/maintain/supported_versions.rst:46 msgid "March 2023" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:29 -msgid "June 2023 (planned)" +#: ../../content/administration/maintain/supported_versions.rst:47 +msgid "July 2023 (planned)" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:31 +#: ../../content/administration/maintain/supported_versions.rst:48 msgid "Odoo saas~16.1" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:31 +#: ../../content/administration/maintain/supported_versions.rst:49 +#: ../../content/administration/maintain/supported_versions.rst:61 +#: ../../content/administration/maintain/supported_versions.rst:67 +#: ../../content/administration/maintain/supported_versions.rst:85 +#: ../../content/administration/maintain/supported_versions.rst:86 +#: ../../content/administration/maintain/supported_versions.rst:87 +#: ../../content/administration/maintain/supported_versions.rst:91 +#: ../../content/administration/maintain/supported_versions.rst:97 +#: ../../content/administration/maintain/supported_versions.rst:98 +#: ../../content/administration/maintain/supported_versions.rst:99 +#: ../../content/administration/maintain/supported_versions.rst:103 +#: ../../content/administration/maintain/supported_versions.rst:109 +#: ../../content/administration/maintain/supported_versions.rst:110 +#: ../../content/administration/maintain/supported_versions.rst:111 +#: ../../content/administration/maintain/supported_versions.rst:115 +#: ../../content/administration/maintain/supported_versions.rst:121 +#: ../../content/administration/maintain/supported_versions.rst:127 +#: ../../content/administration/maintain/supported_versions.rst:128 +#: ../../content/administration/maintain/supported_versions.rst:129 +#: ../../content/administration/maintain/supported_versions.rst:133 +#: ../../content/administration/maintain/supported_versions.rst:139 +#: ../../content/administration/maintain/supported_versions.rst:141 +#: ../../content/administration/maintain/supported_versions.rst:145 +#: ../../content/administration/maintain/supported_versions.rst:151 +#: ../../content/administration/maintain/supported_versions.rst:153 +msgid "|red|" +msgstr "" + +#: ../../content/administration/maintain/supported_versions.rst:52 msgid "February 2023" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:31 +#: ../../content/administration/maintain/supported_versions.rst:53 msgid "April 2023" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:33 +#: ../../content/administration/maintain/supported_versions.rst:54 msgid "**Odoo 16.0**" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:33 -#: ../../content/administration/maintain/supported_versions.rst:43 +#: ../../content/administration/maintain/supported_versions.rst:58 +#: ../../content/administration/maintain/supported_versions.rst:89 msgid "October 2022" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:33 +#: ../../content/administration/maintain/supported_versions.rst:59 msgid "October 2025 (planned)" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:35 +#: ../../content/administration/maintain/supported_versions.rst:60 msgid "Odoo saas~15.2" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:35 -#: ../../content/administration/maintain/supported_versions.rst:37 -#: ../../content/administration/maintain/supported_versions.rst:43 -#: ../../content/administration/maintain/supported_versions.rst:45 -#: ../../content/administration/maintain/supported_versions.rst:47 -#: ../../content/administration/maintain/supported_versions.rst:49 -#: ../../content/administration/maintain/supported_versions.rst:51 -#: ../../content/administration/maintain/supported_versions.rst:53 -#: ../../content/administration/maintain/supported_versions.rst:55 -#: ../../content/administration/maintain/supported_versions.rst:57 -#: ../../content/administration/maintain/supported_versions.rst:59 -#: ../../content/administration/maintain/supported_versions.rst:61 -#: ../../content/administration/maintain/supported_versions.rst:63 -#: ../../content/administration/maintain/supported_versions.rst:65 -msgid "|red|" -msgstr "" - -#: ../../content/administration/maintain/supported_versions.rst:35 +#: ../../content/administration/maintain/supported_versions.rst:64 msgid "March 2022" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:35 +#: ../../content/administration/maintain/supported_versions.rst:65 msgid "January 2023" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:37 +#: ../../content/administration/maintain/supported_versions.rst:66 msgid "Odoo saas~15.1" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:37 +#: ../../content/administration/maintain/supported_versions.rst:70 msgid "February 2022" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:37 +#: ../../content/administration/maintain/supported_versions.rst:71 msgid "July 2022" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:39 +#: ../../content/administration/maintain/supported_versions.rst:72 msgid "**Odoo 15.0**" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:39 -#: ../../content/administration/maintain/supported_versions.rst:47 +#: ../../content/administration/maintain/supported_versions.rst:76 +#: ../../content/administration/maintain/supported_versions.rst:101 msgid "October 2021" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:39 +#: ../../content/administration/maintain/supported_versions.rst:77 msgid "October 2024 (planned)" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:41 +#: ../../content/administration/maintain/supported_versions.rst:78 msgid "**Odoo 14.0**" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:41 -#: ../../content/administration/maintain/supported_versions.rst:51 +#: ../../content/administration/maintain/supported_versions.rst:82 +#: ../../content/administration/maintain/supported_versions.rst:113 msgid "October 2020" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:41 +#: ../../content/administration/maintain/supported_versions.rst:83 msgid "October 2023 (planned)" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:43 +#: ../../content/administration/maintain/supported_versions.rst:84 msgid "**Odoo 13.0**" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:43 -#: ../../content/administration/maintain/supported_versions.rst:57 +#: ../../content/administration/maintain/supported_versions.rst:88 +#: ../../content/administration/maintain/supported_versions.rst:131 msgid "October 2019" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:45 +#: ../../content/administration/maintain/supported_versions.rst:90 msgid "Odoo saas~12.3" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:45 +#: ../../content/administration/maintain/supported_versions.rst:94 msgid "August 2019" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:47 +#: ../../content/administration/maintain/supported_versions.rst:96 msgid "**Odoo 12.0**" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:47 -#: ../../content/administration/maintain/supported_versions.rst:61 +#: ../../content/administration/maintain/supported_versions.rst:100 +#: ../../content/administration/maintain/supported_versions.rst:143 msgid "October 2018" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:49 +#: ../../content/administration/maintain/supported_versions.rst:102 msgid "Odoo saas~11.3" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:49 +#: ../../content/administration/maintain/supported_versions.rst:106 msgid "April 2018" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:51 +#: ../../content/administration/maintain/supported_versions.rst:108 msgid "**Odoo 11.0**" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:51 -#: ../../content/administration/maintain/supported_versions.rst:65 +#: ../../content/administration/maintain/supported_versions.rst:112 +#: ../../content/administration/maintain/supported_versions.rst:155 msgid "October 2017" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:53 +#: ../../content/administration/maintain/supported_versions.rst:114 msgid "Odoo 10.saas~15" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:53 +#: ../../content/administration/maintain/supported_versions.rst:118 msgid "March 2017" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:55 +#: ../../content/administration/maintain/supported_versions.rst:120 msgid "Odoo 10.saas~14" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:55 +#: ../../content/administration/maintain/supported_versions.rst:124 msgid "January 2017" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:57 +#: ../../content/administration/maintain/supported_versions.rst:126 msgid "**Odoo 10.0**" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:57 +#: ../../content/administration/maintain/supported_versions.rst:130 msgid "October 2016" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:59 +#: ../../content/administration/maintain/supported_versions.rst:132 msgid "Odoo 9.saas~11" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:59 +#: ../../content/administration/maintain/supported_versions.rst:136 msgid "May 2016" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:61 +#: ../../content/administration/maintain/supported_versions.rst:138 msgid "**Odoo 9.0**" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:61 +#: ../../content/administration/maintain/supported_versions.rst:142 msgid "October 2015" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:63 +#: ../../content/administration/maintain/supported_versions.rst:144 msgid "Odoo 8.saas~6" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:63 +#: ../../content/administration/maintain/supported_versions.rst:148 msgid "February 2015" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:65 +#: ../../content/administration/maintain/supported_versions.rst:150 msgid "**Odoo 8.0**" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:65 +#: ../../content/administration/maintain/supported_versions.rst:154 msgid "September 2014" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:70 +#: ../../content/administration/maintain/supported_versions.rst:159 msgid "|green| Supported version" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:72 +#: ../../content/administration/maintain/supported_versions.rst:161 msgid "|red| End-of-support" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:74 +#: ../../content/administration/maintain/supported_versions.rst:163 msgid "N/A Never released for this platform" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:76 +#: ../../content/administration/maintain/supported_versions.rst:165 msgid "🏁 Future version, not released yet" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:87 +#: ../../content/administration/maintain/supported_versions.rst:176 msgid "I run an older version of Odoo/OpenERP/TinyERP" msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:89 +#: ../../content/administration/maintain/supported_versions.rst:178 msgid "OpenERP 7.0, 6.1, 6.0 and 5.0 is not supported anymore, on any platform." msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:91 +#: ../../content/administration/maintain/supported_versions.rst:180 msgid "TinyERP 4.0, 3.0, 2.0 and 1.0 is not supported anymore, on any platform." msgstr "" -#: ../../content/administration/maintain/supported_versions.rst:93 +#: ../../content/administration/maintain/supported_versions.rst:182 msgid "Even though we don't support older versions, you can always `upgrade from any version `_." msgstr "" @@ -3961,7 +4012,7 @@ msgid "Your scheduled actions should be `idempotent `." msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:112 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:172 msgid "Configure the deploy keys for the private repositories you use as submodules in your branches to allow Odoo.sh to download them." msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:116 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:176 msgid "These settings are required for **private repositories** only. If you are looking on how to set up your submodules, instructions are available in the chapter :ref:`Submodules ` of this documentation." msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:123 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:183 msgid "When a repository is private, it is not possible to publicly download its branches and revisions. For that reason, you need to configure a deploy key for Odoo.sh, so the remote Git server allows our platform to download the revisions of this private repository." msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:128 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:188 msgid "To configure the deploy key for a private repository, proceed as follows:" msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:130 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:190 msgid "in the input, paste the SSH URL of your private sub-repository and click on *Add*," msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:132 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:192 msgid "e.g. *git@github.com:USERNAME/REPOSITORY.git*" msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:133 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:193 msgid "it can be another Git server than Github, such as Bitbucket, Gitlab or even your own self-hosted server" msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:136 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:196 msgid "copy the public key," msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:138 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:198 msgid "it should look like *ssh-rsa some...random...characters...here...==*" msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:140 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:200 msgid "in the settings of the private sub-repository, add the public key amongst the deploy keys." msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:142 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:202 msgid "Github.com: :menuselection:`Settings --> Deploy keys --> Add deploy key`" msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:143 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:203 msgid "Bitbucket.com: :menuselection:`Settings --> Access keys --> Add key`" msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:144 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:204 msgid "Gitlab.com: :menuselection:`Settings --> Repository --> Deploy Keys`" msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:145 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:205 msgid "Self-hosted: append the key to the git user’s authorized_keys file in its .ssh directory" msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:148 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:208 msgid "Storage Size" msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:150 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:210 msgid "This section shows the storage size used by your project." msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:155 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:215 msgid "Storage size is computed as follows:" msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:157 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:217 msgid "the size of the PostgreSQL database" msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:159 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:219 msgid "the size of the disk files available in your container: database filestore, sessions storage directory..." msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:162 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:222 msgid "In case you want to analyze disk usage, you can run the tool `ncdu `_ in your Web Shell." msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:165 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:225 msgid "Should your production database size grow to exceed what's provisioned in your subscription, it will automatically be synchronized with it." msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:169 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:229 msgid "Database Workers" msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:171 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:231 msgid "Additional database workers can be configured here. More workers help increase the load your production database is able to handle. If you add more, it will automatically be synchronized with your subscription." msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:179 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:239 msgid "Adding more workers will not magically solve all performance issues. It only allows the server to handle more connections at the same time. If some operations are unusually slow, it's most likely a problem with the code, if it's not due to your own customizations you can open a ticket `here `_." msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:185 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:245 msgid "Staging Branches" msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:187 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:247 msgid "Additional staging branches allow you to develop and test more features at the same time. If you add more, it will automatically be synchronized with your subscription." msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:194 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:254 msgid "Activation" msgstr "" -#: ../../content/administration/odoo_sh/getting_started/settings.rst:196 +#: ../../content/administration/odoo_sh/getting_started/settings.rst:256 msgid "Shows the status of the project's activation. You can change the project's activation code if needed." msgstr "" @@ -6002,7 +6042,7 @@ msgstr "" #: ../../content/administration/upgrade.rst:29 #: ../../content/administration/upgrade.rst:148 -#: ../../content/administration/upgrade.rst:252 +#: ../../content/administration/upgrade.rst:259 #: ../../content/administration/upgrade/faq.rst:81 #: ../../content/administration/upgrade/faq.rst:92 #: ../../content/administration/upgrade/faq.rst:119 @@ -6232,7 +6272,7 @@ msgid "Help" msgstr "" #: ../../content/administration/upgrade.rst:200 -msgid "Contact our Upgrade service support" +msgid "Contact our upgrade service support" msgstr "" #: ../../content/administration/upgrade.rst:202 @@ -6248,72 +6288,79 @@ msgid "This is a factor to take into consideration before upgrading. If you are msgstr "" #: ../../content/administration/upgrade.rst:218 -#: ../../content/administration/upgrade.rst:257 msgid ":doc:`maintain/supported_versions`" msgstr "" #: ../../content/administration/upgrade.rst:223 -msgid "Service Level Agreement" +msgid "Service-level agreement (SLA)" msgstr "" -#: ../../content/administration/upgrade.rst:226 -msgid "What is covered by the Enterprise Licence?" +#: ../../content/administration/upgrade.rst:225 +msgid "With Odoo Enterprise, upgrading a database to the most recent version of Odoo is **free**, including any support required to rectify potential discrepancies in the upgraded database." msgstr "" #: ../../content/administration/upgrade.rst:228 -msgid "Databases hosted on Odoo's Cloud platforms (Odoo Online and Odoo.sh) or On-Premise (Self-Hosting) enjoy the following services at all times." -msgstr "" - -#: ../../content/administration/upgrade.rst:231 -msgid "The upgrade of:" +msgid "Information about the upgrade services included in the Enterprise Licence is available in the :ref:`Odoo Enterprise Subscription Agreement `. However, this section clarifies what upgrade services you can expect." msgstr "" #: ../../content/administration/upgrade.rst:233 -msgid "standard applications" +msgid "Upgrade services covered by the SLA" msgstr "" -#: ../../content/administration/upgrade.rst:234 -msgid "Studio customization (as long as the :guilabel:`Studio` app is still active)" +#: ../../content/administration/upgrade.rst:235 +msgid "Databases hosted on Odoo's cloud platforms (Odoo Online and Odoo.sh) or self-hosted (On-Premise) can benefit from upgrade services at all times for:" msgstr "" -#: ../../content/administration/upgrade.rst:235 -msgid "customizations *if* they are covered by a \"Maintenance of Customizations\" subscription" +#: ../../content/administration/upgrade.rst:238 +msgid "the upgrade of all **standard applications**;" msgstr "" -#: ../../content/administration/upgrade.rst:237 -msgid "The Upgrade Service is limited to your database's technical conversion and adaptation (standard modules and data) to make it compatible with the targeted version." +#: ../../content/administration/upgrade.rst:239 +msgid "the upgrade of all **customizations created with the Studio app**, as long as Studio is still installed and the respective subscription is still active; and" msgstr "" #: ../../content/administration/upgrade.rst:241 -msgid "What upgrading does NOT cover" +msgid "the upgrade of all **developments and customizations covered by a maintenance of customizations subscription**." msgstr "" -#: ../../content/administration/upgrade.rst:243 -msgid "The cleaning of pre-existing data & configuration while upgrading" +#: ../../content/administration/upgrade.rst:244 +msgid "Upgrade services are limited to the technical conversion and adaptation of a database (standard modules and data) to make it compatible with the version targeted by the upgrade." msgstr "" -#: ../../content/administration/upgrade.rst:244 -msgid "Any new developments and/or upgrades of your own :ref:`custom modules `" +#: ../../content/administration/upgrade.rst:248 +msgid "Upgrade services not covered by the SLA" +msgstr "" + +#: ../../content/administration/upgrade.rst:250 +msgid "The following upgrade-related services are **not** included:" msgstr "" -#: ../../content/administration/upgrade.rst:246 -msgid "Lines of code added to standard modules that are not created with Odoo Studio." +#: ../../content/administration/upgrade.rst:252 +msgid "the **cleaning** of pre-existing data and configurations while upgrading;" msgstr "" -#: ../../content/administration/upgrade.rst:247 -msgid "`Training `_ on the latest version" +#: ../../content/administration/upgrade.rst:253 +msgid "the upgrade of **custom modules created in-house or by third parties**, including Odoo partners;" msgstr "" -#: ../../content/administration/upgrade.rst:249 -msgid "You can get more information about your Enterprise Licence on our :ref:`Odoo Enterprise Subscription Agreement ` page." +#: ../../content/administration/upgrade.rst:254 +msgid "lines of **code added to standard modules**, i.e., customizations created outside the Studio app, code entered manually, and :ref:`automated actions using Python code `; and" msgstr "" -#: ../../content/administration/upgrade.rst:255 -msgid ":doc:`upgrade/faq`" +#: ../../content/administration/upgrade.rst:257 +msgid "**training** on using the upgraded version's features and workflows." msgstr "" -#: ../../content/administration/upgrade.rst:256 -msgid ":doc:`odoo_sh`" +#: ../../content/administration/upgrade.rst:262 +msgid ":doc:`Upgrade FAQ `" +msgstr "" + +#: ../../content/administration/upgrade.rst:263 +msgid ":doc:`Odoo.sh documentation `" +msgstr "" + +#: ../../content/administration/upgrade.rst:264 +msgid ":doc:`Supported Odoo versions `" msgstr "" #: ../../content/administration/upgrade/faq.rst:8 @@ -6584,44 +6631,92 @@ msgstr "" msgid "If you are using the Website or Studio app, we recommend you always do a test upgrade before upgrading your production instance." msgstr "" -#: ../../content/administration/upgrade/odoo_online.rst:6 -msgid "Requesting a test upgrade" +#: ../../content/administration/upgrade/odoo_online.rst:5 +msgid "Odoo databases can be manually upgraded directly from the main Odoo website. To upgrade an Odoo database, navigate to the `database manager `_ page and sign in." msgstr "" #: ../../content/administration/upgrade/odoo_online.rst:8 -msgid "Go to your `database manager `_" +msgid "The database manager page displays all of the Odoo databases associated with the user's account. Any databases that are not already on the most recent version of Odoo display an **arrow in a circle** icon next to the database name, indicating that the database can be upgraded." msgstr "" -#: ../../content/administration/upgrade/odoo_online.rst:9 -msgid "Click on your profile icon and select *My Databases*." +#: ../../content/administration/upgrade/odoo_online.rst:-1 +msgid "The database manager page with an upgrade button next to the name of a database." msgstr "" -#: ../../content/administration/upgrade/odoo_online.rst:0 -msgid "Selecting My Databases under my profile" +#: ../../content/administration/upgrade/odoo_online.rst:17 +msgid "If the database's version is **lower** than the latest major release: the database must be upgraded within two months. After these two months, an automatic upgrade is initiated." msgstr "" -#: ../../content/administration/upgrade/odoo_online.rst:14 -msgid "Click on the up arrow button next to your main database name to proceed to the test upgrade." +#: ../../content/administration/upgrade/odoo_online.rst:19 +msgid "If the database's version is **equal** to or **higher** than the latest major release: you can disregard the invitation to upgrade, as the database probably would not benefit from new features every two months." msgstr "" -#: ../../content/administration/upgrade/odoo_online.rst:0 -msgid "Selecting the action settings icon" +#: ../../content/administration/upgrade/odoo_online.rst:23 +msgid "If a database is *not* on the latest online version, its administrator should receive an invitation to upgrade on the database's dashboard, displayed as an **arrow in a circle**." msgstr "" -#: ../../content/administration/upgrade/odoo_online.rst:19 -msgid "In the pop-up message that appears, select the target version and then :guilabel:`Test` as purpose." +#: ../../content/administration/upgrade/odoo_online.rst:-1 +msgid "Invitation to upgrade on the database dashboard." msgstr "" -#: ../../content/administration/upgrade/odoo_online.rst:23 -msgid "The :guilabel:`Production` purpose doesn't appear if you didn't test your upgraded database at least once." +#: ../../content/administration/upgrade/odoo_online.rst:30 +msgid "Versions that are not supported anymore become deprecated and must be updated to avoid security issues. It is recommended to initiate the upgrade yourself and not wait for the automatic upgrade, as the former method allows you to request a test upgrade of the database to check for any discrepancies." msgstr "" -#: ../../content/administration/upgrade/odoo_online.rst:26 -msgid "This triggers the automated upgrade process. A confirmation email is then sent to you with the the link to the upgraded database or to provide information if the upgrade failed." +#: ../../content/administration/upgrade/odoo_online.rst:36 +msgid "Test database" msgstr "" -#: ../../content/administration/upgrade/odoo_online.rst:30 -msgid "You can also see and access your test database from your *My Databases* page." +#: ../../content/administration/upgrade/odoo_online.rst:38 +msgid "Click on the **arrow in a circle** icon to start the upgrade process. On the :guilabel:`Upgrade your database` pop-up, select the version of Odoo that the platform will be upgraded to. In the :guilabel:`Email to notify` field, enter an email address that will receive email notifications about the database upgrade." +msgstr "" + +#: ../../content/administration/upgrade/odoo_online.rst:43 +msgid "There is also a :guilabel:`Purpose` section on the pop-up that is used to specify the reason for the upgrade. However, at this stage of the process, the only selectable option is :guilabel:`Test`, as Odoo requires users to create a test copy of the upgraded database before converting the actual database." +msgstr "" + +#: ../../content/administration/upgrade/odoo_online.rst:-1 +msgid "The \"Upgrade your database\" pop-up." +msgstr "" + +#: ../../content/administration/upgrade/odoo_online.rst:52 +msgid "After filling out the form, click the :guilabel:`Upgrade` button. The pop-up disappears and the database being upgraded shows a red :guilabel:`Upgrade in progress` tag next to its name. An email confirming that the upgrade is in progress is also sent to the email address specified on the pop-up." +msgstr "" + +#: ../../content/administration/upgrade/odoo_online.rst:-1 +msgid "The \"Upgrade in progress\" tag next to the database name." +msgstr "" + +#: ../../content/administration/upgrade/odoo_online.rst:61 +msgid "Once the upgrade is complete, a new test database appears on the `database manager `_ page. To access the test database, click the drop-down arrow (:guilabel:`⯆`) to the left of the main database's name. Doing so makes the test version appear below it. Finally, click the green :guilabel:`Connect` button on the right side of the test version's row to go to the database." +msgstr "" + +#: ../../content/administration/upgrade/odoo_online.rst:-1 +msgid "A test database on the database manager page." +msgstr "" + +#: ../../content/administration/upgrade/odoo_online.rst:71 +msgid "Except for being on the newer version of Odoo, the test database is an exact copy of the one being upgraded. It is important to do extensive testing in this database to ensure that the upgrade has not altered or corrupted any data, and that all workflows still proceed as expected." +msgstr "" + +#: ../../content/administration/upgrade/odoo_online.rst:76 +msgid "Production database" +msgstr "" + +#: ../../content/administration/upgrade/odoo_online.rst:78 +msgid "After confirming the integrity of the new version, return to the `database manager `_ page. Once again, click on the **arrow in a circle** icon next to the database being upgraded. The :guilabel:`Upgrade your database` pop-up appears as before, except that there is now a :guilabel:`Production` option under the :guilabel:`Purpose` section." +msgstr "" + +#: ../../content/administration/upgrade/odoo_online.rst:83 +msgid "Select the :guilabel:`Production` option and then click :guilabel:`Upgrade` to begin the upgrade process. As before, a notification email is sent to the email address provided and a red :guilabel:`Upgrade in progress` tag appears next to the name of the database." +msgstr "" + +#: ../../content/administration/upgrade/odoo_online.rst:87 +msgid "The production database is then taken offline and will be upgraded automatically. The time it takes to upgrade the production database should be similar to the time that was necessary to upgrade the test database. Make sure to inform database users of the scheduled downtime." +msgstr "" + +#: ../../content/administration/upgrade/odoo_online.rst:91 +msgid "After the upgrade is finished, the :guilabel:`Upgrade in progress` tag disappears and the database is upgraded to the version specified." msgstr "" #: ../../content/administration/upgrade/odoo_sh.rst:10 diff --git a/locale/sources/contributing.pot b/locale/sources/contributing.pot index dc5081355d..1cc657c9e1 100644 --- a/locale/sources/contributing.pot +++ b/locale/sources/contributing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo saas-16.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-13 08:42+0000\n" +"POT-Creation-Date: 2023-07-10 08:34+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -255,115 +255,115 @@ msgstr "" msgid "In the command below, replace `` with the name of the GitHub account on which you created the fork(s)." msgstr "" -#: ../../content/contributing/development.rst:56 +#: ../../content/contributing/development.rst:57 msgid "If you have access to `odoo/enterprise`, configure the related remote too." msgstr "" -#: ../../content/contributing/development.rst:62 +#: ../../content/contributing/development.rst:64 msgid "Link Git with odoo-dev" msgstr "" -#: ../../content/contributing/development.rst:72 +#: ../../content/contributing/development.rst:76 msgid "That's it! You are ready to :ref:`make your first contribution `." msgstr "" -#: ../../content/contributing/development.rst:79 +#: ../../content/contributing/development.rst:82 #: ../../content/contributing/documentation.rst:158 msgid "Make your first contribution" msgstr "" -#: ../../content/contributing/development.rst:82 +#: ../../content/contributing/development.rst:85 msgid "Odoo development can be challenging for beginners. We recommend you to be knowledgeable enough to code a small module before contributing. If that is not the case, take some time to go through the :doc:`developer tutorials ` to fill in the gaps." msgstr "" -#: ../../content/contributing/development.rst:85 +#: ../../content/contributing/development.rst:88 #: ../../content/contributing/documentation.rst:204 msgid "Some steps of this guide require to be comfortable with Git. Here are some `tutorials `_ and an `interactive training `_ if you are stuck at some point." msgstr "" -#: ../../content/contributing/development.rst:89 +#: ../../content/contributing/development.rst:92 msgid "Now that your environment is set up, you can start contributing to the codebase. In a terminal, navigate to the directory where you installed Odoo from sources and follow the guide below." msgstr "" -#: ../../content/contributing/development.rst:92 +#: ../../content/contributing/development.rst:95 msgid "Choose the version of Odoo to which you want to make changes. Keep in mind that contributions targeting an :doc:`unsupported version of Odoo ` are not accepted. This guide assumes that the changes target Odoo 16.1, which corresponds to branch `saas-16.1`." msgstr "" -#: ../../content/contributing/development.rst:96 +#: ../../content/contributing/development.rst:99 #: ../../content/contributing/documentation.rst:216 msgid "Create a new branch starting from branch saas-16.1. Prefix the branch name with the base branch: `saas-16.1-...`. If you work at Odoo, suffix the branch name with your Odoo handle: `saas-16.1-...-xyz`." msgstr "" -#: ../../content/contributing/development.rst:110 +#: ../../content/contributing/development.rst:113 msgid "`Sign the Odoo CLA `_ if not already done. Skip this step if you work at Odoo." msgstr "" -#: ../../content/contributing/development.rst:112 +#: ../../content/contributing/development.rst:115 msgid "Make the desired changes to the codebase. When working on the codebase, follow these rules:" msgstr "" -#: ../../content/contributing/development.rst:114 +#: ../../content/contributing/development.rst:117 msgid "Keep your changes focused and specific. It is best to work on one particular feature or bug fix at a time rather than tackle multiple unrelated changes simultaneously." msgstr "" -#: ../../content/contributing/development.rst:116 +#: ../../content/contributing/development.rst:119 msgid "Respect the `stable policy `_ when working in another branch than `master`." msgstr "" -#: ../../content/contributing/development.rst:119 +#: ../../content/contributing/development.rst:122 msgid "Follow the :doc:`coding guidelines `." msgstr "" -#: ../../content/contributing/development.rst:120 +#: ../../content/contributing/development.rst:123 msgid "Test your changes thoroughly and :doc:`write tests ` to ensure that everything is working as expected and that there are no regressions or unintended consequences." msgstr "" -#: ../../content/contributing/development.rst:124 +#: ../../content/contributing/development.rst:127 #: ../../content/contributing/documentation.rst:249 msgid "Commit your changes. Write a clear commit message as instructed in the :doc:`Git guidelines `." msgstr "" -#: ../../content/contributing/development.rst:132 +#: ../../content/contributing/development.rst:135 #: ../../content/contributing/documentation.rst:257 msgid "Push your change to your fork, for which we added the remote alias `dev`." msgstr "" -#: ../../content/contributing/development.rst:140 +#: ../../content/contributing/development.rst:143 #: ../../content/contributing/documentation.rst:274 msgid "Open a :abbr:`PR (Pull Request)` on GitHub to submit your changes for review." msgstr "" -#: ../../content/contributing/development.rst:142 +#: ../../content/contributing/development.rst:145 msgid "Go to the `compare page of the odoo/odoo codebase `_, or the `compare page of the odoo/enterprise codebase `_, depending on which codebase your changes target." msgstr "" -#: ../../content/contributing/development.rst:146 +#: ../../content/contributing/development.rst:149 #: ../../content/contributing/documentation.rst:278 msgid "Select **saas-16.1** for the base." msgstr "" -#: ../../content/contributing/development.rst:147 +#: ../../content/contributing/development.rst:150 #: ../../content/contributing/documentation.rst:279 msgid "Click on :guilabel:`compare across forks`." msgstr "" -#: ../../content/contributing/development.rst:148 +#: ../../content/contributing/development.rst:151 msgid "Select **/odoo** or **/enterprise** for the head repository. Replace `` with the name of the GitHub account on which you created the fork or by **odoo-dev** if you work at Odoo." msgstr "" -#: ../../content/contributing/development.rst:151 +#: ../../content/contributing/development.rst:154 #: ../../content/contributing/documentation.rst:192 #: ../../content/contributing/documentation.rst:283 msgid "Review your changes and click on the :guilabel:`Create pull request` button." msgstr "" -#: ../../content/contributing/development.rst:152 +#: ../../content/contributing/development.rst:155 #: ../../content/contributing/documentation.rst:193 #: ../../content/contributing/documentation.rst:284 msgid "Tick the :guilabel:`Allow edits from maintainer` checkbox. Skip this step if you work at Odoo." msgstr "" -#: ../../content/contributing/development.rst:153 +#: ../../content/contributing/development.rst:156 #: ../../content/contributing/documentation.rst:286 msgid "Complete the description and click on the :guilabel:`Create pull request` button again." msgstr "" @@ -373,7 +373,7 @@ msgstr "" msgid "As soon as your :abbr:`PR (Pull Request)` is ready for merging, a member of the Odoo team will be automatically assigned for review. If the reviewer has questions or remarks, they will post them as comments and you will be notified by email. Those comments must be resolved for the contribution to go forward." msgstr "" -#: ../../content/contributing/development.rst:157 +#: ../../content/contributing/development.rst:160 msgid "Once your changes are approved, the review merges them and they become available for all Odoo users after the next code update!" msgstr "" @@ -2136,7 +2136,7 @@ msgid "Odoo uses :abbr:`OCR (optical character recognition)` and artificial inte msgstr "" #: ../../content/contributing/documentation/rst_cheat_sheet.rst:149 -msgid ":abbr:`GUI (Graphical User Interface)` element" +msgid ":abbr:`GUI (graphical user interface)` element" msgstr "" #: ../../content/contributing/documentation/rst_cheat_sheet.rst:151 @@ -2778,7 +2778,7 @@ msgid "Show a dynamic side column that can be used to display interactive tutori msgstr "" #: ../../content/contributing/documentation/rst_cheat_sheet.rst:0 -msgid "For example, see :doc:`/applications/finance/accounting/getting_started/cheat_sheet`." +msgid "For example, see :doc:`/applications/finance/accounting/get_started/cheat_sheet`." msgstr "" #: ../../content/contributing/documentation/rst_cheat_sheet.rst:1075 diff --git a/locale/sources/developer.pot b/locale/sources/developer.pot new file mode 100644 index 0000000000..bd9fd03ac7 --- /dev/null +++ b/locale/sources/developer.pot @@ -0,0 +1,34078 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) Odoo S.A. +# This file is distributed under the same license as the Odoo package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Odoo saas-16.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-07-27 15:04+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../../content/developer.rst:9 +msgid "Developer" +msgstr "" + +#: ../../content/developer.rst:11 +msgid "Learn through tutorials and get help using reference guides." +msgstr "" + +#: ../../content/developer/glossary.rst:5 +msgid "Glossary" +msgstr "" + +#: ../../content/developer/glossary.rst:8 +msgid "external id" +msgstr "" + +#: ../../content/developer/glossary.rst:9 +msgid "external identifier" +msgstr "" + +#: ../../content/developer/glossary.rst:10 +msgid "external identifiers" +msgstr "" + +#: ../../content/developer/glossary.rst:12 +msgid "string identifier stored in ``ir.model.data``, can be used to refer to a record regardless of its database identifier during data imports or export/import roundtrips." +msgstr "" + +#: ../../content/developer/glossary.rst:16 +msgid "External identifiers are in the form :samp:`{module}.{id}` (e.g. ``account.invoice_graph``). From within a module, the :samp:`{module}.` prefix can be left out." +msgstr "" + +#: ../../content/developer/glossary.rst:20 +msgid "Sometimes referred to as \"xml id\" or ``xml_id`` as XML-based :ref:`reference/data` make extensive use of them." +msgstr "" + +#: ../../content/developer/glossary.rst:22 +msgid "format string" +msgstr "" + +#: ../../content/developer/glossary.rst:24 +msgid "inspired by `jinja variables`_, format strings allow more easily mixing literal content and computed content (expressions): content between ``{{`` and ``}}`` is interpreted as an expression and evaluated, other content is interpreted as literal strings and displayed as-is" +msgstr "" + +#: ../../content/developer/glossary.rst:29 +msgid "GIS" +msgstr "" + +#: ../../content/developer/glossary.rst:30 +msgid "Geographic Information System" +msgstr "" + +#: ../../content/developer/glossary.rst:32 +msgid "any computer system or subsystem to capture, store, manipulate, analyze, manage or present spatial and geographical data." +msgstr "" + +#: ../../content/developer/glossary.rst:34 +msgid "minified" +msgstr "" + +#: ../../content/developer/glossary.rst:35 +msgid "minification" +msgstr "" + +#: ../../content/developer/glossary.rst:37 +msgid "process of removing extraneous/non-necessary sections of files (comments, whitespace) and possibly recompiling them using equivalent but shorter structures (`ternary operator`_ instead of ``if/else``) in order to reduce network traffic" +msgstr "" + +#: ../../content/developer/howtos.rst:6 +msgid "How-to guides" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:4 +msgid "Accounting localization" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:8 +msgid "This tutorial requires knowledge about how to build a module in Odoo (see :doc:`../tutorials/getting_started`)." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:13 +msgid "Installation procedure" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:15 +msgid "On installing the `account `_ module, the localization module corresponding to the country code of the company is installed automatically. In case of no country code set or no localization module found, the `l10n_generic_coa `_ (US) localization module is installed by default. Check `post init hook `_ for details." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:19 +msgid "For example, `l10n_ch `_ will be installed if the company has ``Switzerland`` as country." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:22 +msgid "Building a localization module" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:24 +msgid "The structure of a basic ``l10n_XX`` module may be described with the following :file:`__manifest__.py` file:" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:63 +msgid "In the first file :file:`data/account_chart_template_data.xml`, we set the name for the chart of accounts along with some basic fields." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:66 +msgid ":ref:`Chart Template References `" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:69 +msgid "`addons/l10n_ch/data/l10n_ch_chart_data.xml `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:80 +msgid "Recommended **xmlid** for the record is `chart_template`. If you need many chart of accounts, you can add some suffixes, i.e. `chart_template_XXX`." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:85 +msgid "Chart of Accounts" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:88 +msgid "Account tags" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:91 +msgid ":ref:`Account Tag References `" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:93 +msgid "Tags are a way to sort accounts. For example, imagine you want to create a financial report having multiple lines but you have no way to find a rule to dispatch the accounts according to their ``code``. The solution is the usage of tags, one for each report line, to filter accounts like you want." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:97 +msgid "Put the tags in the :file:`data/account_account_tag_data.xml` file." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:100 +msgid "`addons/l10n_lt/data/account.account.template.csv `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:108 +#: ../../content/developer/howtos/accounting_localization.rst:138 +msgid "`addons/l10n_at/data/account_account_template.xml `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:119 +msgid "Accounts" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:122 +msgid ":ref:`Account References `" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:123 +msgid ":doc:`/applications/finance/accounting/get_started/chart_of_accounts`" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:125 +msgid "Obviously, :guilabel:`Chart of Accounts` cannot exist without :guilabel:`Accounts`. You need to specify them in :file:`data/account.account.template.csv`." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:128 +msgid "`addons/l10n_ch/data/account.account.template.csv `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:135 +msgid "CSV is prefered but you may use XML format instead." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:148 +msgid "Avoid the usage of liquidity ``account.account.type``! Indeed, the bank & cash accounts are created directly at the installation of the localization module and then, are linked to an ``account.journal``." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:150 +msgid "Only one account of type payable/receivable is enough for the generic case. We need to define a PoS receivable account as well however. (linked in the CoA)" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:151 +msgid "Don't create too many accounts: 200-300 is enough. But mostly, we try to find a good balance where the CoA needs minimal adapting for most companies afterwards." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:153 +msgid "Next settings for the chart of accounts are set in a separate file, because we need to provide a :ref:`list of accounts ` first. In :file:`data/account_chart_post_data.xml`, we set some default accounts:" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:158 +msgid "`addons/l10n_ch/data/l10n_ch_chart_post_data.xml `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:168 +msgid "Account groups" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:171 +msgid ":ref:`Account Group References `" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:173 +msgid "Account groups allow describing the hierarchical structure of the chart of accounts. The filter needs to be activated in the report and then when you decollapse into journal entries it will show the parents of the account." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:175 +msgid "It works with the prefix *start*/*end*, so every account where the code starts with something between *start* and *end* will have this account.group as the parent group. Furthermore, the account groups can have a parent account group as well to form the hierarchy." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:179 +msgid "`addons/l10n_il/data/account.group.template.csv `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:188 +#: ../../content/developer/reference/standard_modules/account/account_tax.rst:5 +msgid "Taxes" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:191 +msgid ":ref:`Tax References `" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:192 +msgid ":doc:`/applications/finance/accounting/taxes/`" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:194 +msgid "To add taxes you first need to specify tax groups. You normally need just one tax group for every tax rate, except for the 0% as you need to often distinguish between exempt, 0%, not subject, ... taxes. This model only has two required fields: *name* and *country*. Create the file :file:`data/account_tax_group_data.xml` and list the groups:" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:211 +msgid "`addons/l10n_ch/data/account_tax_group_data.xml `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:220 +msgid "`addons/l10n_uk/data/account.tax.group.csv `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:227 +msgid "Now you can add the taxes via :file:`data/account_tax_template_data.xml` file. The first tax you define that is purchase/sale also becomes the default purchase/sale tax for your products." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:231 +msgid "`addons/l10n_ae/data/account_tax_template_data.xml `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:239 +msgid "If some accounts should use default taxes, you can set them up in :file:`data/account_account_template_post_data.xml`" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:242 +msgid "Tax Report" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:248 +msgid "The tax report is declared in the :guilabel:`Invoicing` (`account`) app, but the report is only accessible when :guilabel:`Accounting` (`account_accountant`) is installed." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:251 +#: ../../content/developer/howtos/accounting_localization.rst:376 +msgid ":doc:`/developer/reference/standard_modules/account/account_report_line`" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:252 +msgid ":doc:`/applications/finance/accounting/reporting/tax_returns`" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:254 +msgid "In the previous section, you noticed the fields `invoice_repartition_line_ids` or `refund_repartition_line_ids` and probably understood nothing about them. Good news: you are not alone on this incomprehension. Bad news: you have to figure it out a bit. The topic is complicated. Indeed:" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:259 +msgid "The simple version is that, in the tax template, you indicate in the invoice/refund repartition lines whether the base or a percentage of the tax needs to be reported in which report line (through the *minus/plus_report_line_ids* fields). It becomes clear also when you check the tax configuration in the Odoo interface (or check the docs :ref:`Tax References `, :ref:`Tax Repartition References `)." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:262 +msgid "So, once you have properly configured taxes, you just need to add the :file:`data/account_tax_report_data.xml` file with a record for your `account.report`. For it to be considered as a tax report, you need to provide it with the right `root_report_id`." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:276 +msgid "... followed by the declaration of its lines, as `account.report.line` records." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:279 +msgid "`addons/l10n_au/data/account_tax_report_data.xml `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:290 +msgid "Fiscal positions" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:293 +msgid ":ref:`Fiscal Position References `" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:294 +msgid ":doc:`/applications/finance/accounting/taxes/fiscal_positions`" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:296 +msgid "Specify fiscal positions in the :file:`data/account_fiscal_position_template_data.xml` file." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:299 +msgid "`addons/l10n_es/data/account_fiscal_position_template_data.xml `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:308 +msgid "Final steps" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:310 +msgid "The last step when installing a localization module is to try to apply its chart of accounts to the current company (if it does not already have one). The file :file:`data/account_chart_template_try_loading.xml` is responsible for that." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:314 +msgid "`addons/l10n_ch/data/account_chart_template_data.xml `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:322 +msgid "Finally, you may add a demo company, so the localization can easily be tested in demo mode." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:325 +msgid "`addons/l10n_ch/demo/demo_company.xml `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:334 +msgid "Accounting reports" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:341 +msgid ":doc:`/applications/finance/accounting/reporting`" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:343 +msgid "Accounting reports should be added via a separate module `l10n_XX_reports` that should go to the `enterprise repository `_." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:345 +msgid "Basic :file:`__manifest__.py` file for such a module looks as following:" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:366 +msgid "Functional overview of financial reports is here: :doc:`/applications/finance/accounting/reporting`." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:368 +msgid "Some good examples:" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:370 +msgid "`l10n_ch_reports/data/account_financial_html_report_data.xml `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:371 +msgid "`l10n_be_reports/data/account_financial_html_report_data.xml `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:373 +msgid "You can check the meaning of the fields here:" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:375 +msgid ":doc:`/developer/reference/standard_modules/account/account_report`" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:378 +msgid "If you gave a `root_report_id` to your report, it is now available in its variant selector. If not, you still need to add a menu item for it. A default menu item can be created from the form view of the report by clicking on :menuselection:`Actions --> Create Menu Item`. You will then need to refresh the page to see it. Alternatively, to create a dedicated section for a totally new report in the :guilabel:`Reporting` menu, you need to create a new `ir.ui.menu` record (usually in the main `l10n_XX` module) and a new `ir.actions.client` (usually in the new report XML file) that calls the `account.report` with the new **report id**. Then, set the new menu as `parent_id` field in the action model." +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:388 +msgid "`ir.ui.menu creation `_" +msgstr "" + +#: ../../content/developer/howtos/accounting_localization.rst:389 +msgid "`ir.actions.client and menu item creation `_" +msgstr "" + +#: ../../content/developer/howtos/company.rst:6 +msgid "Multi-company Guidelines" +msgstr "" + +#: ../../content/developer/howtos/company.rst:10 +msgid "This tutorial requires good knowledge of Odoo. Please refer to the :doc:`../tutorials/getting_started` tutorial first if needed." +msgstr "" + +#: ../../content/developer/howtos/company.rst:13 +msgid "As of version 13.0, a user can be logged in to multiple companies at once. This allows the user to access information from multiple companies, but also to create/edit records in a multi-company environment." +msgstr "" + +#: ../../content/developer/howtos/company.rst:17 +msgid "If not managed correctly, it may be the source of a lot of inconsistent multi-company behaviors. For instance, a user logged in to both companies A and B could create a sales order in company A and add products belonging to company B to it. It is only when the user logs out from company B that access errors will occur for the sales order." +msgstr "" + +#: ../../content/developer/howtos/company.rst:22 +msgid "To correctly manage multi-company behaviors, Odoo's ORM provides multiple features:" +msgstr "" + +#: ../../content/developer/howtos/company.rst:24 +msgid ":ref:`Company-dependent fields `" +msgstr "" + +#: ../../content/developer/howtos/company.rst:25 +msgid ":ref:`Multi-company consistency `" +msgstr "" + +#: ../../content/developer/howtos/company.rst:26 +msgid ":ref:`Default company `" +msgstr "" + +#: ../../content/developer/howtos/company.rst:27 +msgid ":ref:`Views `" +msgstr "" + +#: ../../content/developer/howtos/company.rst:28 +msgid ":ref:`Security rules `" +msgstr "" + +#: ../../content/developer/howtos/company.rst:33 +msgid "Company-dependent fields" +msgstr "" + +#: ../../content/developer/howtos/company.rst:35 +msgid "When a record is available from multiple companies, we must expect that different values will be assigned to a given field depending on the company from which the value is set." +msgstr "" + +#: ../../content/developer/howtos/company.rst:38 +msgid "For the field of the same record to support several values, it must be defined with the attribute `company_dependent` set to `True`." +msgstr "" + +#: ../../content/developer/howtos/company.rst:57 +msgid "The `_compute_display_info` method is decorated with `depends_context('company')` (see :attr:`~odoo.api.depends_context`) to ensure that the computed field is recomputed depending on the current company (`self.env.company`)." +msgstr "" + +#: ../../content/developer/howtos/company.rst:61 +msgid "When a company-dependent field is read, the current company is used to retrieve its value. In other words, if a user is logged in to companies A and B with A as the main company and creates a record for company B, the value of company-dependent fields will be that of company A." +msgstr "" + +#: ../../content/developer/howtos/company.rst:65 +msgid "To read the values of company-dependent fields set by another company than the current one, we need to ensure the company we are using is the correct one. This can be done with :meth:`~odoo.models.Model.with_company`, which updates the current company." +msgstr "" + +#: ../../content/developer/howtos/company.rst:80 +msgid "Whenever you are computing/creating/... things that may behave differently in different companies, you should make sure whatever you are doing is done in the right company. It doesn't cost much to always use `with_company` to avoid problems later." +msgstr "" + +#: ../../content/developer/howtos/company.rst:101 +msgid "Multi-company consistency" +msgstr "" + +#: ../../content/developer/howtos/company.rst:103 +msgid "When a record is made shareable between several companies by the means of a `company_id` field, we must take care that it cannot be linked to the record of another company through a relational field. For instance, we do not want to have a sales order and its invoice belonging to different companies." +msgstr "" + +#: ../../content/developer/howtos/company.rst:107 +msgid "To ensure this multi-company consistency, you must:" +msgstr "" + +#: ../../content/developer/howtos/company.rst:109 +msgid "Set the class attribute `_check_company_auto` to `True`." +msgstr "" + +#: ../../content/developer/howtos/company.rst:110 +msgid "Define relational fields with the attribute `check_company` set to `True` if their model has a `company_id` field." +msgstr "" + +#: ../../content/developer/howtos/company.rst:113 +msgid "On each :meth:`~odoo.models.Model.create` and :meth:`~odoo.models.Model.write`, automatic checks will be triggered to ensure the multi-company consistency of the record." +msgstr "" + +#: ../../content/developer/howtos/company.rst:127 +msgid "The field `company_id` must not be defined with `check_company=True`." +msgstr "" + +#: ../../content/developer/howtos/company.rst:132 +msgid "The `check_company` feature performs a strict check! It means that if a record has no `company_id` (i.e., the field is not required), it cannot be linked to a record whose `company_id` is set." +msgstr "" + +#: ../../content/developer/howtos/company.rst:138 +msgid "When no domain is defined on the field and `check_company` is set to `True`, a default domain is added: `['|', '('company_id', '=', False), ('company_id', '=', company_id)]`" +msgstr "" + +#: ../../content/developer/howtos/company.rst:144 +msgid "Default company" +msgstr "" + +#: ../../content/developer/howtos/company.rst:146 +msgid "When the field `company_id` is made required on a model, a good practice is to set a default company. It eases the setup flow for the user or even guarantees its validity when the company is hidden from view. Indeed, the company is usually hidden if the user does not have access to multiple companies (i.e., when the user does not have the group `base.group_multi_company`)." +msgstr "" + +#: ../../content/developer/howtos/company.rst:168 +#: ../../content/developer/howtos/website_themes/setup.rst:74 +#: ../../content/developer/howtos/website_themes/theming.rst:496 +#: ../../content/developer/reference/backend/views.rst:6 +#: ../../content/developer/reference/frontend/javascript_reference.rst:1196 +msgid "Views" +msgstr "" + +#: ../../content/developer/howtos/company.rst:170 +msgid "As stated in :ref:`above `, the company is usually hidden from view if the user does not have access to multiple companies. This is assessed with the group `base.group_multi_company`." +msgstr "" + +#: ../../content/developer/howtos/company.rst:197 +msgid "Security rules" +msgstr "" + +#: ../../content/developer/howtos/company.rst:199 +msgid "When working with records shared across companies or restricted to a single company, we must take care that a user does not have access to records belonging to other companies." +msgstr "" + +#: ../../content/developer/howtos/company.rst:202 +msgid "This is achieved with security rules based on `company_ids`, which contain the current companies of the user (the companies the user checked in the multi-company widget)." +msgstr "" + +#: ../../content/developer/howtos/company.rst:229 +#: ../../content/developer/howtos/provide_iap_services.rst:118 +#: ../../content/developer/howtos/provide_iap_services.rst:222 +#: ../../content/developer/howtos/provide_iap_services.rst:406 +#: ../../content/developer/howtos/provide_iap_services.rst:408 +#: ../../content/developer/howtos/provide_iap_services.rst:511 +#: ../../content/developer/howtos/translations.rst:19 +#: ../../content/developer/howtos/website_themes/building_blocks.rst:77 +#: ../../content/developer/howtos/website_themes/building_blocks.rst:332 +#: ../../content/developer/howtos/website_themes/layout.rst:547 +#: ../../content/developer/howtos/website_themes/pages.rst:130 +#: ../../content/developer/howtos/website_themes/pages.rst:194 +#: ../../content/developer/howtos/website_themes/shapes.rst:125 +#: ../../content/developer/reference/backend/actions.rst:176 +#: ../../content/developer/reference/backend/orm.rst:636 +#: ../../content/developer/reference/backend/orm.rst:638 +#: ../../content/developer/reference/backend/orm.rst:827 +#: ../../content/developer/reference/backend/orm.rst:980 +#: ../../content/developer/reference/backend/security.rst:28 +#: ../../content/developer/reference/backend/security.rst:186 +#: ../../content/developer/reference/backend/views.rst:13 +#: ../../content/developer/reference/backend/views.rst:70 +#: ../../content/developer/reference/backend/views.rst:81 +#: ../../content/developer/reference/backend/views.rst:179 +#: ../../content/developer/reference/backend/views.rst:241 +#: ../../content/developer/reference/backend/views.rst:683 +#: ../../content/developer/reference/backend/views.rst:807 +#: ../../content/developer/reference/backend/views.rst:809 +#: ../../content/developer/reference/backend/views.rst:1500 +#: ../../content/developer/reference/backend/views.rst:1600 +#: ../../content/developer/reference/backend/views.rst:1618 +#: ../../content/developer/reference/backend/views.rst:1756 +#: ../../content/developer/reference/frontend/qweb.rst:412 +#: ../../content/developer/reference/frontend/qweb.rst:413 +#: ../../content/developer/reference/frontend/qweb.rst:475 +#: ../../content/developer/reference/frontend/qweb.rst:792 +#: ../../content/developer/tutorials/master_odoo_web_framework/03_custom_kanban_view.rst:5 +#: ../../content/developer/tutorials/web.rst:134 +#: ../../content/developer/tutorials/web.rst:1872 +#: ../../content/developer/tutorials/website.rst:495 +msgid "Todo" +msgstr "" + +#: ../../content/developer/howtos/company.rst:229 +msgid "check_company on company_dependent fields." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:3 +msgid "Connect with a device" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:5 +msgid "IoT Drivers allow any Odoo module to communicate in real-time with any device connected to the IoT Box. Communication with the IoT Box goes both ways, so the Odoo client can send commands to and receive information from any of the supported devices." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:10 +msgid "To add support for a device, all we need is:" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:12 +msgid "an `Interface`, to detect connected devices of a specific type" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:13 +msgid "a `Driver`, to communicate with an individual device" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:15 +msgid "At each boot, the IoT Box will load all of the Interfaces and Drivers that can be located on the connected Odoo instance. Each module can contain an `iot_handlers` directory that will be copied to the IoT Box. The structure of this directory is the following" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:34 +msgid "Detect Devices" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:36 +msgid "Devices connected to the IoT Box are detected through `Interfaces`. There is an Interface for each supported connection type (USB, Bluetooth, Video, Printers, Serial, etc.). The interface maintains a list of detected devices and associates them with the right Driver." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:41 +msgid "Supported devices will appear both on the IoT Box Homepage that you can access through its IP address and in the IoT module of the connected Odoo instance." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:45 +msgid "Interface" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:47 +msgid "The role of the Interface is to maintain a list of devices connected through a determined connection type. Creating a new interface requires" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:50 +msgid "Extending the `Interface` class" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:51 +msgid "Setting the `connection_type` class attribute" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:52 +msgid "Implementing the `get_devices` method, that should return a dictionary containing data about each detected device. This data will be given as argument to the constructors and `supported` method of the Drivers." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:57 +msgid "Setting the `_loop_delay` attribute will modify the interval between calls to `get_devices`. By default, this interval is set to 3 seconds." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:74 +msgid "Driver" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:76 +msgid "Once the interface has retrieved the list of detected devices, it will loop through all of the Drivers that have the same `connection_type` attribute and test their respective `supported` method on all detected devices. If the supported method of a Driver returns `True`, an instance of this Driver will be created for the corresponding device." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:83 +msgid "`supported` methods of drivers are given a priority order. The `supported` method of a child class will always be tested before the one of its parent. This priority can be adjusted by modifying the `priority` attribute of the Driver." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:88 +msgid "Creating a new Driver requires:" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:90 +msgid "Extending `Driver`" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:91 +msgid "Setting the `connection_type` class attribute." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:92 +msgid "Setting the `device_type`, `device_connection` and `device_name` attributes." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:93 +msgid "Defining the `supported` method" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:113 +msgid "Communicate With Devices" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:115 +msgid "Once your new device is detected and appears in the IoT module, the next step is to communicate with it. Since the box only has a local IP address, it can only be reached from the same local network. Communication, therefore, needs to happen on the browser-side, in JavaScript." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:120 +msgid "The process depends on the direction of the communication: - From the browser to the box, through `Actions`_ - From the box to the browser, through `Longpolling`_" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:124 +msgid "Both channels are accessed from the same JS object, the `DeviceProxy`, which is instantiated using the IP of the IoT Box and the device identifier." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:137 +#: ../../content/developer/howtos/website_themes/forms.rst:33 +#: ../../content/developer/reference/backend/actions.rst:6 +#: ../../content/developer/tutorials/getting_started/06_firstui.rst:47 +msgid "Actions" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:139 +msgid "Actions are used to tell a selected device to execute a specific action, such as taking a picture, printing a receipt, etc." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:143 +msgid "It must be noted that no “answer” will be sent by the box on this route, only the request status. The answer to the action, if any, has to be retrieved via the longpolling." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:147 +msgid "An action can be performed on the DeviceProxy Object." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:153 +msgid "In your driver, define an `action` method that will be executed when called from an Odoo module. It takes the data given during the call as argument." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:162 +msgid "Longpolling" +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:164 +msgid "When any module in Odoo wants to read data from a specific device, it creates a listener identified by the IP/domain of the box and the device identifier and passes it a callback function to be called every time the device status changes. The callback is called with the new data as argument." +msgstr "" + +#: ../../content/developer/howtos/connect_device.rst:177 +msgid "In the Driver, an event is released by calling the `device_changed` function from the `event_manager`. All callbacks set on the listener will then be called with `self.data` as argument." +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:3 +msgid "Create customized reports" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:5 +msgid "SQL views are a technique for creating customized reports to show data that cannot be shown with existing models' fields and views. In other words, this technique helps avoid unnecessary creation and calculation of additional fields solely for data analysis purposes." +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:11 +msgid "Create a model" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:13 +msgid "A SQL view is created in a similar manner as a standard model:" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:26 +msgid "Where the attributes:" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:28 +msgid "`_auto = False` indicates that we do not want to store the model in the database" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:29 +msgid "`_rec_name` indicates which of the model's fields represents a record's name (i.e. the name that will be used in the navigation breadcrumb when opening a record's form view)" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:32 +msgid "and its fields are defined in the same way as a standard model, except every field is marked as `readonly=True`." +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:36 +msgid "Don't forget to add your new model to your security file." +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:39 +msgid "Populate the model" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:41 +msgid "There are 2 ways to populate a SQL view's table:" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:43 +msgid "override the `BaseModel.init()` method," +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:44 +msgid "set the `_table_query` property." +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:46 +msgid "Regardless of which way is used, a SQL query will be executed to populate the model. Therefore, any SQL commands can be used to collect and/or calculate the data needed and you are expected to keep in mind that you are bypassing the ORM (i.e. it is a good idea to read through :ref:`reference/security` if you haven't already). The columns returned from the `SELECT` will populate the model's fields, so ensure that your column names match your field names, or use alias names that match." +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:55 +msgid "Overriding `BaseModel.init()`" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:57 +msgid "In most cases, overriding the `BaseModel.init()` method is the standard and better option to use. It requires the import of `tools` and is typically written as follows:" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:71 +msgid "`tools.drop_view_if_exists` ensures that a conflicting view is not created when the SQL query is executed. It is standard to separate the different parts of the query to allow for easier model extension. Exactly how the query is split up across methods is not standardized, but at minimum, the `_select` and `_from` methods are common, and of course, all these methods will return strings." +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:78 +msgid "`Example: a SQL view using an override of BaseModel.init() `_" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:81 +msgid "Using `_table_query`" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:83 +msgid "The ``_table_query`` property is used when the view depends on the context. It is typically written as follows:" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:92 +msgid "and follows the same `_select` and `_from` methods standards as `BaseModel.init()`." +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:94 +msgid "An example of when the property should be used instead of overriding `BaseModel.init()` is in a multi-company and multi-currency environment where currency related amounts need to be converted using currency exchange rates when the user switches between companies." +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:99 +msgid "`Example: a SQL view using _table_query `_" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:103 +msgid "Use the model" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:105 +msgid "Views and menu items for your SQL views are created and used in the same way as any other Odoo model. You are all set to start using your SQL view. Have fun!" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:109 +msgid "Extra tips" +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:112 +msgid "A common mistake in SQL views is not considering the duplication of certain data due to table JOINs. This can lead to miscounting when using a field's `group_operator` and/or the pivot view. It is best to test your SQL view with sufficient data to ensure the resulting field values are as you expect." +msgstr "" + +#: ../../content/developer/howtos/create_reports.rst:118 +msgid "If you have a field that you do not want as a measure (i.e., in your pivot or graph views), add `store=False` to it, and it will not show." +msgstr "" + +#: ../../content/developer/howtos/javascript_client_action.rst:4 +msgid "Create a client action" +msgstr "" + +#: ../../content/developer/howtos/javascript_client_action.rst:6 +msgid "A client action triggers an action that is entirely implemented in the client side. One of the benefits of using a client action is the ability to create highly customized interfaces with ease. A client action is typically defined by an OWL component; we can also use the web framework and use services, core components, hooks,..." +msgstr "" + +#: ../../content/developer/howtos/javascript_client_action.rst:11 +msgid "Create the :ref:`client action `, don't forget to make it accessible." +msgstr "" + +#: ../../content/developer/howtos/javascript_client_action.rst:21 +msgid "Create a component that represents the client action." +msgstr "" + +#: ../../content/developer/howtos/javascript_client_action.rst:23 +msgid ":file:`my_client_action.js`" +msgstr "" + +#: ../../content/developer/howtos/javascript_client_action.rst:38 +msgid ":file:`my_client_action.xml`" +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:4 +msgid "Customize a field" +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:7 +msgid "Subclass an existing field component" +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:9 +msgid "Let's take an example where we want to extends the `BooleanField` to create a boolean field displaying \"Late!\" in red whenever the checkbox is checked." +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:12 +msgid "Create a new widget component extending the desired field component." +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:14 +#: ../../content/developer/howtos/javascript_field.rst:45 +msgid ":file:`late_order_boolean_field.js`" +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:26 +msgid "Create the field template." +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:28 +msgid "The component uses a new template with the name `my_module.LateOrderBooleanField`. Create it by inheriting the current template of the `BooleanField`." +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:31 +msgid ":file:`late_order_boolean_field.xml`" +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:43 +msgid "Register the component to the fields registry." +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:50 +#: ../../content/developer/howtos/javascript_field.rst:103 +msgid "Add the widget in the view arch as an attribute of the field." +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:57 +msgid "Create a new field component" +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:59 +msgid "Assume that we want to create a field that displays a simple text in red." +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:61 +msgid "Create a new Owl component representing our new field" +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:63 +#: ../../content/developer/howtos/javascript_field.rst:96 +msgid ":file:`my_text_field.js`" +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:90 +msgid "The imported `standardFieldProps` contains the standard props passed by the `View` such as the `update` function to update the value, the `type` of the field in the model, the `readonly` boolean, and others." +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:94 +msgid "In the same file, register the component to the fields registry." +msgstr "" + +#: ../../content/developer/howtos/javascript_field.rst:101 +msgid "This maps the widget name in the arch to its actual component." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:3 +msgid "Customize a view type" +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:6 +msgid "Subclass an existing view" +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:8 +msgid "Assume we need to create a custom version of a generic view. For example, a kanban view with some extra ribbon-like widget on top (to display some specific custom information). In that case, this can be done in a few steps:" +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:12 +msgid "Extend the kanban controller/renderer/model and register it in the view registry." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:14 +msgid ":file:`custom_kanban_controller.js`" +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:39 +msgid "In our custom kanban, we defined a new template. We can either inherit the kanban controller template and add our template pieces or we can define a completely new template." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:42 +msgid ":file:`custom_kanban_controller.xml`" +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:56 +msgid "Use the view with the `js_class` attribute in arch." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:68 +msgid "The possibilities for extending views are endless. While we have only extended the controller here, you can also extend the renderer to add new buttons, modify how records are presented, or customize the dropdown, as well as extend other components such as the model and `buttonTemplate`." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:73 +msgid "Create a new view from scratch" +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:75 +msgid "Creating a new view is an advanced topic. This guide highlight only the essential steps." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:77 +msgid "Create the controller." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:79 +msgid "The primary role of a controller is to facilitate the coordination between various components of a view, such as the Renderer, Model, and Layout." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:82 +msgid ":file:`beautiful_controller.js`" +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:116 +msgid "The template of the Controller displays the control panel with Layout and also the renderer." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:119 +msgid ":file:`beautiful_controller.xml`" +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:131 +msgid "Create the renderer." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:133 +msgid "The primary function of a renderer is to generate a visual representation of data by rendering the view that includes records." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:136 +msgid ":file:`beautiful_renderer.js`" +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:144 +msgid ":file:`beautiful_renderer.xml`" +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:157 +msgid "Create the model." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:159 +msgid "The role of the model is to retrieve and manage all the necessary data in the view." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:161 +msgid ":file:`beautiful_model.js`" +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:192 +msgid "For advanced cases, instead of creating a model from scratch, it is also possible to use `RelationalModel`, which is used by other views." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:195 +msgid "Create the arch parser." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:197 +msgid "The role of the arch parser is to parse the arch view so the view has access to the information." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:199 +msgid ":file:`beautiful_arch_parser.js`" +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:216 +msgid "Create the view and combine all the pieces together, then register the view in the views registry." +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:219 +msgid ":file:`beautiful_view.js`" +msgstr "" + +#: ../../content/developer/howtos/javascript_view.rst:256 +msgid "Use the view in an arch." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:3 +msgid "Provide IAP services" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:5 +msgid "In-App Purchase (IAP) allows providers of ongoing services through Odoo apps to be compensated for ongoing service use rather than — and possibly instead of — a sole initial purchase." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:9 +msgid "In that context, Odoo acts mostly as a *broker* between a client and an Odoo App Developer:" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:12 +msgid "Users purchase service tokens from Odoo." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:13 +msgid "Service providers draw tokens from the user's Odoo account when service is requested." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:18 +msgid "This document is intended for *service providers* and presents the latter, which can be done either via direct JSON-RPC2_ or if you are using Odoo using the convenience helpers it provides." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:23 +#: ../../content/developer/reference/extract_api.rst:22 +#: ../../content/developer/reference/frontend/javascript_reference.rst:17 +#: ../../content/developer/reference/frontend/services.rst:144 +#: ../../content/developer/reference/frontend/services.rst:182 +#: ../../content/developer/reference/frontend/services.rst:362 +#: ../../content/developer/reference/frontend/services.rst:408 +#: ../../content/developer/reference/frontend/services.rst:522 +#: ../../content/developer/reference/frontend/services.rst:612 +#: ../../content/developer/reference/frontend/services.rst:708 +#: ../../content/developer/reference/frontend/services.rst:759 +#: ../../content/developer/reference/frontend/services.rst:834 +#: ../../content/developer/reference/user_interface/scss_inheritance.rst:6 +msgid "Overview" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:28 +msgid "The Players" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:30 +msgid "The Service Provider is (probably) you the reader, you will be providing value to the client in the form of a service paid per-use." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:32 +msgid "The Client installed your Odoo App, and from there will request services." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:33 +msgid "Odoo brokers crediting, the Client adds credit to their account, and you can draw credits from there to provide services." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:35 +msgid "The External Service is an optional player: *you* can either provide a service directly, or you can delegate the actual service acting as a bridge/translator between an Odoo system and the actual service." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:43 +msgid "The Credits" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:45 +msgid "The credits went from integer to float value starting **October 2018**. Integer values are still supported." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:48 +msgid "Every service provided through the IAP platform can be used by the clients with tokens or *credits*. The credits are an float unit and their monetary value depends on the service and is decided by the provider. This could be:" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:53 +msgid "for an sms service: 1 credit = 1 sms;" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:54 +msgid "for an ad service: 1 credit = 1 ad; or" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:55 +msgid "for a postage service: 1 credit = 1 post stamp." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:57 +msgid "A credit can also simply be associated with a fixed amount of money to palliate the variations of price (e.g. the prices of sms and stamps may vary following the countries)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:61 +msgid "The value of the credits is fixed with the help of prepaid credit packs that the clients can buy on https://iap.odoo.com (see :ref:`Packs `)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:64 +msgid "In the following explanations we will ignore the External Service, they are just a detail of the service you provide." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:70 +msgid "'Normal' service flow" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:72 +msgid "If everything goes well, the normal flow is the following:" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:74 +msgid "The Client requests a service of some sort." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:75 +msgid "The Service Provider asks Odoo if there are enough credits for the service in the Client's account, and creates a transaction over that amount." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:78 +msgid "The Service Provider provides the service (either on their own or calling to External Services)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:80 +msgid "The Service Provider goes back to Odoo to capture (if the service could be provided) or cancel (if the service could not be provided) the transaction created at step 2." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:83 +msgid "Finally, the Service Provider notifies the Client that the service has been rendered, possibly (depending on the service) displaying or storing its results in the client's system." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:90 +msgid "Insufficient credits" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:92 +msgid "However, if the Client's account lacks credits for the service, the flow will be as follows:" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:94 +msgid "The Client requests a service as previously." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:95 +msgid "The Service Provider asks Odoo if there are enough credits on the Client's account and gets a negative reply." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:97 +msgid "This is signaled back to the Client." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:98 +msgid "Who is redirected to their Odoo account to credit it and re-try." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:102 +msgid "Building your service" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:104 +msgid "For this example, the service we will provide is ~~mining dogecoins~~ burning 10 seconds of CPU for a credit. For your own services, you could, for example:" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:107 +msgid "provide an online service yourself (e.g. convert quotations to faxes for business in Japan);" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:109 +msgid "provide an *offline* service yourself (e.g. provide accountancy service); or" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:110 +msgid "act as intermediary to an other service provider (e.g. bridge to an MMS gateway)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:116 +msgid "Register the service on Odoo" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:118 +msgid "complete this part with screenshots" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:120 +msgid "The first step is to register your service on the IAP endpoint (production and/or test) before you can actually query user accounts. To create a service, go to your *Portal Account* on the IAP endpoint (https://iap.odoo.com for production, https://iap-sandbox.odoo.com for testing, the endpoints are *independent* and *not synchronized*). Alternatively, you can go to your portal on Odoo (https://iap.odoo.com/my/home) and select *In-App Services*." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:129 +msgid "On production, there is a manual validation step before the service can be used to manage real transactions. This step is automatically passed when on sandbox to ease the tests." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:133 +msgid "Log in then go to :menuselection:`My Account --> Your In-App Services`, click Create and provide the information of your service." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:137 +msgid "The service has *seven* important fields:" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:139 +msgid ":samp:`name` - :class:`ServiceName`: This is the string you will need to provide inside the client's :ref:`app ` when requesting a transaction from Odoo. (e.g. `self.env['iap.account].get(name)`). As good practice, this should match the technical name of your app." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:144 +msgid ":samp:`label` - :class:`Label`: The name displayed on the shopping portal for the client." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:149 +msgid "Both the :class:`ServiceName` and :class:`Label` are unique. As good practice, the :class:`ServiceName` should usually match the name of your Odoo Client App." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:152 +msgid ":samp:`icon` - :class:`Icon`: A generic icon that will serve as default for your :ref:`packs `." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:155 +msgid ":samp:`key` - :class:`ServiceKey`: The developer key that identifies you in IAP (see :ref:`your service `) and allows to draw credits from the client's account. It will be shown only once upon creation of the service and can be regenerated at will." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:161 +msgid "Your :class:`ServiceKey` *is a secret*, leaking your service key allows other application developers to draw credits bought for your service(s)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:165 +msgid ":samp:`trial credits` - :class:`Float`: This corresponds to the credits you are ready to offer upon first use to your app users. Note that such service will only be available to clients that have an active enterprise contract." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:169 +msgid ":samp:`privacy policy` - :class:`PrivacyPolicy`: This is an url to the privacy policy of your service. This should explicitly mention the **information you collect**, how you **use it, its relevance** to make your service work and inform the client on how they can **access, update or delete their personal information**." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:186 +msgid "You can then create *credit packs* which clients can purchase in order to use your service." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:192 +msgid "Packs" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:194 +msgid "A credit pack is essentially a product with five characteristics:" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:196 +msgid "Name: name of the pack," +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:197 +msgid "Icon: specific icon for the pack (if not provided, it will fallback on the service icon)," +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:198 +msgid "Description: details on the pack that will appear on the shop page as well as the invoice," +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:200 +msgid "Amount: amount of credits the client is entitled to when buying the pack," +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:201 +msgid "Price: price in EUR (for the time being, USD support is planned)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:205 +msgid "Odoo takes a 25% commission on all pack sales. Adjust your selling price accordingly." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:210 +msgid "Depending on the strategy, the price per credit may vary from one pack to another." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:220 +msgid "Odoo App" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:222 +msgid "does this actually require apps?" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:224 +msgid "The second step is to develop an `Odoo App`_ which clients can install in their Odoo instance and through which they can *request* the services you provide. Our app will just add a button to the Partners form which lets a user request burning some CPU time on the server." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:229 +msgid "First, we will create an *odoo module* depending on ``iap``. IAP is a standard V11 module and the dependency ensures a local account is properly set up and we will have access to some necessary views and useful helpers." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:233 +#: ../../content/developer/howtos/provide_iap_services.rst:248 +msgid "`coalroller/__manifest__.py`" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:243 +msgid "Second, the \"local\" side of the integration. Here we will only be adding an action button to the partners view, but you can of course provide significant local value via your application and additional parts via a remote service." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:261 +msgid "`coalroller/views/res_partner_views.xml`" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:286 +msgid "We can now implement the action method/callback. This will *call our own server*." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:289 +msgid "There are no requirements when it comes to the server or the communication protocol between the app and our server, but ``iap`` provides a :func:`~odoo.addons.iap.tools.iap_tools.iap_jsonrpc` helper to call a JSON-RPC2_ endpoint on an other Odoo instance and transparently re-raise relevant Odoo exceptions (:class:`~odoo.addons.iap.tools.iap_tools.InsufficientCreditError`, :class:`odoo.exceptions.AccessError` and :class:`odoo.exceptions.UserError`)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:296 +msgid "In that call, we will need to provide:" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:298 +msgid "any relevant client parameter (none here)," +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:299 +msgid "the :class:`token ` of the current client that is provided by the ``iap.account`` model's ``account_token`` field. You can retrieve the account for your service by calling :samp:`env['iap.account'].get({service_name})` where :class:`service_name ` is the name of the service registered on IAP endpoint." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:305 +msgid "`coalroller/models/res_partner.py`" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:333 +msgid "``iap`` automatically handles :class:`~odoo.addons.iap.tools.iap_tools.InsufficientCreditError` coming from the action and prompts the user to add credits to their account." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:337 +msgid ":func:`~odoo.addons.iap.tools.iap_tools.iap_jsonrpc` takes care of re-raising :class:`~odoo.addons.iap.models.iap.InsufficientCreditError` for you." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:342 +msgid "If you are not using :func:`~odoo.addons.iap.tools.iap_tools.iap_jsonrpc` you *must* be careful to re-raise :class:`~odoo.addons.iap.tools.iap_tools.InsufficientCreditError` in your handler otherwise the user will not be prompted to credit their account, and the next call will fail the same way." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:351 +#: ../../content/developer/reference/frontend/javascript_reference.rst:876 +msgid "Service" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:353 +msgid "Though that is not *required*, since ``iap`` provides both a client helper for JSON-RPC2_ calls (:func:`~odoo.addons.iap.tools.iap_tools.iap_jsonrpc`) and a service helper for transactions (:class:`~odoo.addons.iap.tools.iap_tools.iap_charge`) we will also be implementing the service side as an Odoo module:" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:358 +#: ../../content/developer/howtos/provide_iap_services.rst:448 +msgid "`coalroller_service/__manifest__.py`" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:368 +msgid "Since the query from the client comes as JSON-RPC2_ we will need the corresponding controller which can call :class:`~odoo.addons.iap.tools.iap_tools.iap_charge` and perform the service within:" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:372 +#: ../../content/developer/howtos/provide_iap_services.rst:461 +msgid "`coalroller_service/controllers/main.py`" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:406 +msgid "for the actual IAP will the \"portal\" page be on odoo.com or iap.odoo.com?" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:408 +msgid "\"My Account\" > \"Your InApp Services\"?" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:411 +msgid "The :class:`~odoo.addons.iap.tools.iap_tools.iap_charge` helper will:" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:413 +msgid "authorize (create) a transaction with the specified number of credits, if the account does not have enough credits it will raise the relevant error" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:416 +msgid "execute the body of the ``with`` statement" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:417 +msgid "if the body of the ``with`` executes successfully, update the price of the transaction if needed" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:419 +msgid "capture (confirm) the transaction" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:420 +msgid "otherwise, if an error is raised from the body of the ``with``, cancel the transaction (and release the hold on the credits)" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:425 +msgid "By default, :class:`~odoo.addons.iap.tools.iap_tools.iap_charge` contacts the *production* IAP endpoint, https://iap.odoo.com. While developing and testing your service you may want to point it towards the *development* IAP endpoint https://iap-sandbox.odoo.com." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:430 +msgid "To do so, set the ``iap.endpoint`` config parameter in your service Odoo: in debug/developer mode, :menuselection:`Setting --> Technical --> Parameters --> System Parameters`, just define an entry for the key ``iap.endpoint`` if none already exists)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:435 +msgid "The :class:`~odoo.addons.iap.tools.iap_tools.iap_charge` helper has two additional optional parameters we can use to make things clearer to the end-user." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:440 +#: ../../content/developer/reference/backend/reports.rst:198 +#: ../../content/developer/reference/extract_api.rst:546 +msgid "``description``" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:439 +msgid "is a message which will be associated with the transaction and will be displayed in the user's dashboard, it is useful to remind the user why the charge exists." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:446 +msgid "``credit_template``" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:443 +msgid "is the name of a :ref:`reference/qweb` template which will be rendered and shown to the user if their account has less credit available than the service provider is requesting, its purpose is to tell your users why they should be interested in your IAP offers." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:488 +msgid "`coalroller_service/views/no-credit.xml`" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:511 +msgid "how do you test your service?" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:514 +msgid "JSON-RPC2_ Transaction API" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:519 +msgid "The IAP transaction API does not require using Odoo when implementing your server gateway, calls are standard JSON-RPC2_." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:521 +msgid "Calls use different *endpoints* but the same *method* on all endpoints (``call``)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:523 +msgid "Exceptions are returned as JSON-RPC2_ errors, the formal exception name is available on ``data.name`` for programmatic manipulation." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:526 +msgid "`iap.odoo.com documentation`_ for additional information." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:529 +#: ../../content/developer/howtos/provide_iap_services.rst:775 +msgid "Authorize" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:533 +msgid "Verifies that the user's account has at least as ``credit`` available *and creates a hold (pending transaction) on that amount*." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:536 +msgid "Any amount currently on hold by a pending transaction is considered unavailable to further authorize calls." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:539 +msgid "Returns a :class:`TransactionToken` identifying the pending transaction which can be used to capture (confirm) or cancel said transaction (`iap.odoo.com documentation`_)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:0 +#: ../../content/developer/reference/backend/mixins.rst:0 +#: ../../content/developer/reference/frontend/framework_overview.rst:0 +#: ../../content/developer/reference/frontend/qweb.rst:0 +msgid "Parameters" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:545 +msgid "optional, helps users identify the reason for charges on their account" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:547 +msgid "optional, allows the user to benefit from trial credits if his database is eligible (see :ref:`Service registration `)" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:549 +msgid "optional, transaction time to live in hours. If the credit are not captured when the transaction expires, the transaction is cancelled. The default value is set to 4320 hours (= 180 days)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:0 +#: ../../content/developer/reference/backend/mixins.rst:0 +#: ../../content/developer/reference/frontend/assets.rst:0 +#: ../../content/developer/reference/frontend/framework_overview.rst:0 +#: ../../content/developer/reference/frontend/hooks.rst:0 +#: ../../content/developer/reference/frontend/javascript_reference.rst:0 +#: ../../content/developer/reference/frontend/mobile.rst:0 +#: ../../content/developer/reference/frontend/qweb.rst:0 +#: ../../content/developer/reference/frontend/registries.rst:0 +#: ../../content/developer/reference/frontend/services.rst:0 +msgid "Returns" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:551 +msgid ":class:`TransactionToken` if the authorization succeeded" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:0 +msgid "raises" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:552 +msgid ":class:`~odoo.exceptions.AccessError` if the service token is invalid" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:553 +msgid ":class:`~odoo.addons.iap.models.iap.InsufficientCreditError` if the account does not have enough credits" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:554 +msgid "``TypeError`` if the ``credit`` value is not an integer or a float" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:577 +#: ../../content/developer/howtos/provide_iap_services.rst:855 +msgid "Capture" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:581 +msgid "Confirms the specified transaction, transferring the reserved credits from the user's account to the service provider's." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:584 +msgid "Capture calls are idempotent: performing capture calls on an already captured transaction has no further effect." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:589 +msgid "optional parameter to capture a smaller amount of credits than authorized" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:590 +#: ../../content/developer/howtos/provide_iap_services.rst:622 +msgid ":class:`~odoo.exceptions.AccessError`" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:610 +#: ../../content/developer/howtos/provide_iap_services.rst:817 +msgid "Cancel" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:614 +msgid "Cancels the specified transaction, releasing the hold on the user's credits." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:617 +msgid "Cancel calls are idempotent: performing capture calls on an already cancelled transaction has no further effect." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:640 +#: ../../content/developer/tutorials/getting_started/04_basicmodel.rst:134 +msgid "Types" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:642 +msgid "Exceptions aside, these are *abstract types* used for clarity, you should not care how they are implemented." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:647 +msgid "String identifying your service on https://iap.odoo.com (production) as well as the account related to your service in the client's database." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:652 +msgid "Identifier generated for the provider's service. Each key (and service) matches a token of a fixed value, as generated by the service provide." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:655 +msgid "Multiple types of tokens correspond to multiple services. As an exampe, SMS and MMS could either be the same service (with an MMS being 'worth' multiple SMS) or could be separate services at separate price points." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:659 +msgid "Your service key *is a secret*, leaking your service key allows other application developers to draw credits bought for your service(s)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:665 +msgid "Identifier for a user account." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:669 +msgid "Transaction identifier, returned by the authorization process and consumed by either capturing or cancelling the transaction." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:674 +msgid "Raised during transaction authorization if the credits requested are not currently available on the account (either not enough credits or too many pending transactions/existing holds)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:681 +msgid "Raised by:" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:683 +msgid "any operation to which a service token is required, if the service token is invalid; or" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:684 +msgid "any failure in an inter-server call. (typically, in :func:`~odoo.addons.iap.tools.iap_tools.iap_jsonrpc`)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:689 +msgid "Raised by any unexpected behaviour at the discretion of the App developer (*you*)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:693 +msgid "Test the API" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:695 +msgid "In order to test the developed app, we propose a sandbox platform that allows you to:" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:697 +msgid "Test the whole flow from the client's point of view - Actual services and transactions that can be consulted. (again this requires to change the endpoint, see the danger note in :ref:`Service `)." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:700 +msgid "Test the API." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:702 +msgid "The latter consists in specific tokens that will work on **IAP-Sandbox only**." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:704 +msgid "Token ``000000``: Represents a non-existing account. Returns an :class:`~odoo.addons.iap.tools.iap_tools.InsufficientCreditError` on authorize attempt." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:706 +msgid "Token ``000111``: Represents an account without sufficient credits to perform any service. Returns an :class:`~odoo.addons.iap.tools.iap_tools.InsufficientCreditError` on authorize attempt." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:708 +msgid "Token ``111111``: Represents an account with enough credits to perform any service. An authorize attempt will return a dummy transaction token that is processed by the capture and cancel routes." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:714 +msgid "Those tokens are only active on the IAP-Sanbox server." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:715 +msgid "The service key is completely ignored with this flow, If you want to run a robust test of your service, you should ignore these tokens." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:719 +msgid "Odoo Helpers" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:721 +msgid "For convenience, if you are implementing your service using Odoo the ``iap`` module provides a few helpers to make IAP flow even simpler." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:727 +msgid "Charging" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:731 +msgid "A *context manager* for authorizing and automatically capturing or cancelling transactions for use in the backend/proxy." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:734 +msgid "Works much like e.g. a cursor context manager:" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:736 +msgid "immediately authorizes a transaction with the specified parameters;" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:737 +msgid "executes the ``with`` body;" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:738 +msgid "if the body executes in full without error, captures the transaction;" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:739 +msgid "otherwise cancels it." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:741 +#: ../../content/developer/howtos/provide_iap_services.rst:781 +#: ../../content/developer/howtos/provide_iap_services.rst:823 +#: ../../content/developer/howtos/provide_iap_services.rst:861 +msgid "used to retrieve the ``iap.endpoint`` configuration key" +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:779 +msgid "Will authorize everything." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:821 +msgid "Will cancel an authorized transaction." +msgstr "" + +#: ../../content/developer/howtos/provide_iap_services.rst:859 +msgid "Will capture the amount ``credit`` on the given transaction." +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:3 +msgid "Write lean easy-to-maintain CSS" +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:5 +msgid "There are many ways to lean and simplify SCSS. The first step is to establish if custom code is needed at all." +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:8 +msgid "Odoo's webclient has been designed to be modular, meaning that (potentially all) classes can be shared across views. Check the code before creating a new class. Chances are that there is already a class or an HTML tag doing exactly what you're looking for." +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:12 +msgid "On top of that, Odoo relies on `Bootstrap `_ (BS), one of the most complete CSS frameworks available. The framework has been customized in order to match Odoo's design (both community and enterprise versions), meaning that you can use any BS class directly in Odoo and achieve a visual result that is consistent with our UI." +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:19 +msgid "The fact that a class achieves the desired visual result doesn't necessarily mean that it's the right one for the job. Be aware of classes triggering JS behaviors, for example." +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:21 +msgid "Be careful about class semantics. Applying a **button class** to a **title** is not only semantically wrong, it may also lead to migration issues and visual inconsistencies." +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:24 +msgid "The following sections describe tips to strip-down SCSS lines **when custom-code is the only way to go**." +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:30 +msgid "Browser defaults" +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:32 +msgid "By default, each browser renders content using a *user agent stylesheet*. To overcome inconsistencies between browsers, some of these rules are overridden by `Bootstrap Reboot `_." +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:36 +msgid "At this stage all \"browser-specific-decoration\" rules have been stripped away, but a big chunk of rules defining basic layout information is maintained (or reinforced by *Reboot* for consistency reasons)." +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:40 +msgid "You can rely on these rules." +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:44 +msgid "Applying `display: block;` to a `
` is normally not necessary." +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:55 +msgid "In this instance, you may opt to switching the HTML tag rather than adding a new CSS rule." +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:65 +msgid "Here's a non-comprehensive list of default rules:" +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:70 +msgid "Tag / Attribute" +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:71 +msgid "Defaults" +msgstr "" + +#: ../../content/developer/howtos/scss_tips.rst:72 +msgid "`
`, `
`, `
`, `