Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 528758a916 | |||
| ab9313a451 | |||
| 868ecc61a5 | |||
| 73638c012c | |||
| 753d10106a | |||
| 64a0fbd75e | |||
| a2af035da6 | |||
| bb761431d5 | |||
| 0b5e4bb5b4 | |||
| 32ecbd0c5b | |||
| 31725deaf0 | |||
| 0e71f8681e | |||
| da682b7f22 | |||
| cc270a9afe | |||
| df0cf93856 | |||
| 213a3ca73b | |||
| 0e4810f40b | |||
| 4e7df807e7 | |||
| 0a3c8ec10a | |||
| 416fcaa7a1 | |||
| d8e0ae04b9 | |||
| 5688664e3a | |||
| 61f05b699a | |||
| 318d80a4a1 | |||
| b79c83f52a | |||
| 6d2f193622 | |||
| 0cd4dd2978 | |||
| b4beccaf8e | |||
| fd5d5581cc | |||
| 9083a0927c | |||
| b5c37e33b1 |
@@ -1,7 +1,7 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
|
||||
[o:odoo:p:odoo-17-doc:r:administration]
|
||||
[o:odoo:p:odoo-18-doc:r:administration]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/administration.po
|
||||
source_file = locale/sources/administration.pot
|
||||
type = POT
|
||||
@@ -11,7 +11,7 @@ replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-17-doc:r:applications]
|
||||
[o:odoo:p:odoo-18-doc:r:applications]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/applications.po
|
||||
source_file = locale/sources/applications.pot
|
||||
type = POT
|
||||
@@ -21,7 +21,7 @@ replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-17-doc:r:essentials]
|
||||
[o:odoo:p:odoo-18-doc:r:essentials]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/essentials.po
|
||||
source_file = locale/sources/essentials.pot
|
||||
type = POT
|
||||
@@ -31,7 +31,7 @@ replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-17-doc:r:finance]
|
||||
[o:odoo:p:odoo-18-doc:r:finance]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/finance.po
|
||||
source_file = locale/sources/finance.pot
|
||||
type = POT
|
||||
@@ -41,7 +41,7 @@ replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-17-doc:r:general]
|
||||
[o:odoo:p:odoo-18-doc:r:general]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/general.po
|
||||
source_file = locale/sources/general.pot
|
||||
type = POT
|
||||
@@ -51,7 +51,7 @@ replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-17-doc:r:hr]
|
||||
[o:odoo:p:odoo-18-doc:r:hr]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/hr.po
|
||||
source_file = locale/sources/hr.pot
|
||||
type = POT
|
||||
@@ -61,7 +61,7 @@ replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-17-doc:r:index]
|
||||
[o:odoo:p:odoo-18-doc:r:index]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/index.po
|
||||
source_file = locale/sources/index.pot
|
||||
type = POT
|
||||
@@ -71,7 +71,7 @@ replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-17-doc:r:inventory_and_mrp]
|
||||
[o:odoo:p:odoo-18-doc:r:inventory_and_mrp]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/inventory_and_mrp.po
|
||||
source_file = locale/sources/inventory_and_mrp.pot
|
||||
type = POT
|
||||
@@ -81,7 +81,7 @@ replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-17-doc:r:marketing]
|
||||
[o:odoo:p:odoo-18-doc:r:marketing]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/marketing.po
|
||||
source_file = locale/sources/marketing.pot
|
||||
type = POT
|
||||
@@ -91,7 +91,7 @@ replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-17-doc:r:productivity]
|
||||
[o:odoo:p:odoo-18-doc:r:productivity]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/productivity.po
|
||||
source_file = locale/sources/productivity.pot
|
||||
type = POT
|
||||
@@ -101,7 +101,7 @@ replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-17-doc:r:sales]
|
||||
[o:odoo:p:odoo-18-doc:r:sales]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/sales.po
|
||||
source_file = locale/sources/sales.pot
|
||||
type = POT
|
||||
@@ -111,7 +111,7 @@ replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-17-doc:r:services]
|
||||
[o:odoo:p:odoo-18-doc:r:services]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/services.po
|
||||
source_file = locale/sources/services.pot
|
||||
type = POT
|
||||
@@ -121,7 +121,7 @@ replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-17-doc:r:user_settings]
|
||||
[o:odoo:p:odoo-18-doc:r:user_settings]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/settings.po
|
||||
source_file = locale/sources/settings.pot
|
||||
type = POT
|
||||
@@ -131,7 +131,7 @@ replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-17-doc:r:studio]
|
||||
[o:odoo:p:odoo-18-doc:r:studio]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/studio.po
|
||||
source_file = locale/sources/studio.pot
|
||||
type = POT
|
||||
@@ -141,7 +141,7 @@ replace_edited_strings = false
|
||||
keep_translations = false
|
||||
source_lang = en
|
||||
|
||||
[o:odoo:p:odoo-17-doc:r:websites]
|
||||
[o:odoo:p:odoo-18-doc:r:websites]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/websites.po
|
||||
source_file = locale/sources/websites.pot
|
||||
type = POT
|
||||
|
||||
@@ -27,7 +27,7 @@ SOURCE_DIR = content
|
||||
|
||||
HTML_BUILD_DIR = $(BUILD_DIR)/html
|
||||
ifdef VERSIONS
|
||||
HTML_BUILD_DIR := $(HTML_BUILD_DIR)/master
|
||||
HTML_BUILD_DIR := $(HTML_BUILD_DIR)/18.0
|
||||
endif
|
||||
ifneq ($(CURRENT_LANG),en)
|
||||
HTML_BUILD_DIR := $(HTML_BUILD_DIR)/$(CURRENT_LANG)
|
||||
|
||||
@@ -22,7 +22,7 @@ copyright = 'Odoo S.A.'
|
||||
# `version` is the version info for the project being documented, acts as replacement for |version|,
|
||||
# also used in various other places throughout the built documents.
|
||||
# `release` is the full version, including alpha/beta/rc tags. Acts as replacement for |release|.
|
||||
version = release = 'master'
|
||||
version = release = '18.0'
|
||||
|
||||
# `current_branch` is the technical name of the current branch.
|
||||
# E.g., saas-15.4 -> saas-15.4; 12.0 -> 12.0, master -> master (*).
|
||||
@@ -231,18 +231,12 @@ sphinx.transforms.i18n.docname_to_domain = (
|
||||
# is populated. If a version is passed to `versions` but is not listed here, it will not be shown.
|
||||
versions_names = {
|
||||
'master': "Master",
|
||||
'18.0': "Odoo 18",
|
||||
'saas-17.4': "Odoo Online",
|
||||
'saas-17.2': "Odoo Online",
|
||||
'saas-17.1': "Odoo Online",
|
||||
'17.0': "Odoo 17",
|
||||
'saas-16.4': "Odoo Online",
|
||||
'saas-16.3': "Odoo Online",
|
||||
'saas-16.2': "Odoo Online",
|
||||
'saas-16.1': "Odoo Online",
|
||||
'16.0': "Odoo 16",
|
||||
'saas-15.2': "Odoo Online",
|
||||
'15.0': "Odoo 15",
|
||||
'14.0': "Odoo 14",
|
||||
}
|
||||
|
||||
# The language names that should be shown in the language switcher, if the config option `languages`
|
||||
|
||||
@@ -217,6 +217,26 @@ Production and staging builds are excluded, visitors can only see their status.
|
||||
|
||||
.. _odoosh-gettingstarted-settings-modules-installation:
|
||||
|
||||
GitHub commit statuses
|
||||
======================
|
||||
|
||||
This option enables Odoo.sh to push commit statuses to your GitHub repository when a build is
|
||||
created or updated. It requires a GitHub token with permissions to push commit statuses to the
|
||||
repository. Refer to `GitHub's documentation on personal access tokens <https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens>`_
|
||||
for instructions to create yours.
|
||||
|
||||
.. note::
|
||||
GitHub's **fine-grained personal tokens** have an expiration date and will be disabled if they
|
||||
fail to update the commit status. You can replace the token at any time on Odoo.sh.
|
||||
|
||||
The commit statuses pushed to GitHub can have the following contexts:
|
||||
|
||||
- :guilabel:`ci/odoo.sh (dev)`: status of a development build
|
||||
- :guilabel:`ci/odoo.sh (staging)`: status of a staging build
|
||||
- :guilabel:`ci/odoo.sh (production)`: status of a production build
|
||||
- :guilabel:`ci/odoo.sh (test_ci)`: testing the token from the Settings page will push a test
|
||||
status on the last commit of your repository
|
||||
|
||||
Custom domains
|
||||
==============
|
||||
|
||||
|
||||
@@ -61,8 +61,8 @@ To resolve the issue:
|
||||
your **network and firewall settings** allow the Odoo server to open outgoing connections
|
||||
towards:
|
||||
|
||||
- `services.odoo.com` on port `443` (or `80`)
|
||||
- for older deployments, `services.openerp.com` on port `443` (or `80`)
|
||||
- Odoo 18.0 and above: `services.odoo.com` on port `443` (or `80`)
|
||||
- Odoo 17.0 and below: `services.openerp.com` on port `443` (or `80`)
|
||||
|
||||
These ports must be kept open even after registering a database, as the update notification runs
|
||||
once a week.
|
||||
|
||||
@@ -31,24 +31,24 @@ This matrix shows the support status of every version.
|
||||
- On-Premise
|
||||
- Release date
|
||||
- End of support
|
||||
* - Odoo saas~17.4
|
||||
* - **Odoo 18.0**
|
||||
- |green|
|
||||
- |green|
|
||||
- |green|
|
||||
- October 2024
|
||||
- October 2027 (planned)
|
||||
* - Odoo SaaS 17.4
|
||||
- |green|
|
||||
- N/A
|
||||
- N/A
|
||||
- July 2024
|
||||
-
|
||||
* - Odoo saas~17.2
|
||||
* - Odoo SaaS 17.2
|
||||
- |green|
|
||||
- N/A
|
||||
- N/A
|
||||
- April 2024
|
||||
-
|
||||
* - Odoo saas~17.1
|
||||
- |green|
|
||||
- N/A
|
||||
- N/A
|
||||
- January 2024
|
||||
-
|
||||
* - **Odoo 17.0**
|
||||
- |green|
|
||||
- |green|
|
||||
@@ -60,31 +60,25 @@ This matrix shows the support status of every version.
|
||||
- |green|
|
||||
- |green|
|
||||
- October 2022
|
||||
- November 2025 (planned)
|
||||
- October 2025 (planned)
|
||||
* - **Odoo 15.0**
|
||||
- |green|
|
||||
- |green|
|
||||
- |green|
|
||||
- |red|
|
||||
- |red|
|
||||
- |red|
|
||||
- October 2021
|
||||
- November 2024 (planned)
|
||||
- October 2024
|
||||
* - **Odoo 14.0**
|
||||
- |red|
|
||||
- |red|
|
||||
- |red|
|
||||
- October 2020
|
||||
- November 2023
|
||||
* - **Odoo 13.0**
|
||||
- |red|
|
||||
- |red|
|
||||
- |red|
|
||||
- October 2019
|
||||
- October 2022
|
||||
* - Older versions
|
||||
- |red|
|
||||
- |red|
|
||||
- |red|
|
||||
- Before 2019
|
||||
- Before 2022
|
||||
- Before 2020
|
||||
- Before 2023
|
||||
|
||||
.. admonition:: Legend
|
||||
|
||||
|
||||
@@ -33,18 +33,16 @@ Make sure the default settings are correctly configured for your business. To do
|
||||
|
||||
Journal
|
||||
The deferral entries are posted in this journal.
|
||||
Deferred Expense Account
|
||||
Expenses are deferred on this Current Asset account until they are recognized.
|
||||
Deferred Revenue Account
|
||||
Deferred Revenue
|
||||
Revenues are deferred on this Current Liability account until they are recognized.
|
||||
Generate Entries
|
||||
By default, Odoo :ref:`automatically generates <customer_invoices/deferred/generate_on_validation>`
|
||||
the deferral entries when you post a customer invoice. However, you can also choose to
|
||||
:ref:`generate them manually <customer_invoices/deferred/generate_manually>` by selecting the
|
||||
:guilabel:`Manually & Grouped` option instead.
|
||||
Amount Computation
|
||||
Suppose an invoice of $1200 must be deferred over 12 months. The :guilabel:`Equal per month`
|
||||
computation accounts for $100 each month, while the :guilabel:`Based on days` computation
|
||||
Based on
|
||||
Suppose an invoice of $1200 must be deferred over 12 months. The :guilabel:`Months`
|
||||
computation accounts for $100 each month, while the :guilabel:`Days` computation
|
||||
accounts for different amounts depending on the number of days in each month.
|
||||
|
||||
.. _customer_invoices/deferred/generate_on_validation:
|
||||
|
||||
@@ -24,8 +24,9 @@ the details.
|
||||
.. image:: reporting/reporting-annotate.png
|
||||
:alt: Annotate reports.
|
||||
|
||||
To export reports in PDF or XLSX format, click :guilabel:`PDF` or :guilabel:`XLSX` at the top of the
|
||||
page.
|
||||
To export reports in PDF or XLSX format, click :guilabel:`PDF` at the top or click the
|
||||
:icon:`fa-caret-down` (:guilabel:`down arrow`) icon next to the :guilabel:`PDF` button and
|
||||
select :guilabel:`XLSX`.
|
||||
|
||||
To compare values across periods, click the :guilabel:`Comparison` menu and select the periods you
|
||||
want to compare.
|
||||
|
||||
@@ -33,18 +33,16 @@ Make sure the default settings are correctly configured for your business. To do
|
||||
|
||||
Journal
|
||||
The deferral entries are posted in this journal.
|
||||
Deferred Expense Account
|
||||
Deferred Expense
|
||||
Expenses are deferred on this Current Asset account until they are recognized.
|
||||
Deferred Revenue Account
|
||||
Revenues are deferred on this Current Liability account until they are recognized.
|
||||
Generate Entries
|
||||
By default, Odoo :ref:`automatically generates <vendor_bills/deferred/generate_on_validation>`
|
||||
the deferral entries when you post a vendor bill. However, you can also choose to
|
||||
:ref:`generate them manually <vendor_bills/deferred/generate_manually>` by selecting the
|
||||
:guilabel:`Manually & Grouped` option instead.
|
||||
Amount Computation
|
||||
Suppose a bill of $1200 must be deferred over 12 months. The :guilabel:`Equal per month`
|
||||
computation recognizes $100 each month, while the :guilabel:`Based on days` computation recognizes
|
||||
Based on
|
||||
Suppose a bill of $1200 must be deferred over 12 months. The :guilabel:`Months`
|
||||
computation recognizes $100 each month, while the :guilabel:`Days` computation recognizes
|
||||
different amounts depending on the number of days in each month.
|
||||
|
||||
.. _vendor_bills/deferred/generate_on_validation:
|
||||
|
||||
@@ -136,6 +136,7 @@ Correction letter, Invalidate invoice number range), an API call is made using c
|
||||
.. note::
|
||||
- Odoo is a certified partner of Avalara Brazil.
|
||||
- You can `buy IAP credit on odoo.com <https://iap.odoo.com/iap/in-app-services/819>`_.
|
||||
- You will receive 500 free credits for one time when you start.
|
||||
|
||||
Credential configuration
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -17,11 +17,10 @@ Online payments
|
||||
payment_providers/flutterwave
|
||||
payment_providers/mercado_pago
|
||||
payment_providers/mollie
|
||||
payment_providers/ogone
|
||||
payment_providers/paypal
|
||||
payment_providers/razorpay
|
||||
payment_providers/sips
|
||||
payment_providers/stripe
|
||||
payment_providers/worldline
|
||||
payment_providers/xendit
|
||||
|
||||
Odoo embeds several **payment providers** that allow your customers to pay online, on their
|
||||
@@ -126,18 +125,18 @@ Online payment providers
|
||||
- Full only
|
||||
- Full and partial
|
||||
-
|
||||
* - :doc:`SIPS <payment_providers/sips>`
|
||||
- The provider's website
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
* - :doc:`Stripe <payment_providers/stripe>`
|
||||
- Odoo
|
||||
- |V|
|
||||
- Full only
|
||||
- Full and partial
|
||||
- |V|
|
||||
* - :doc:`Worldline <payment_providers/worldline>`
|
||||
- The provider's website
|
||||
- |V|
|
||||
-
|
||||
-
|
||||
-
|
||||
* - :doc:`Xendit <payment_providers/xendit>`
|
||||
- The provider's website
|
||||
-
|
||||
@@ -457,11 +456,10 @@ other payments.
|
||||
- :doc:`payment_providers/demo`
|
||||
- :doc:`payment_providers/mercado_pago`
|
||||
- :doc:`payment_providers/mollie`
|
||||
- :doc:`payment_providers/ogone`
|
||||
- :doc:`payment_providers/paypal`
|
||||
- :doc:`payment_providers/razorpay`
|
||||
- :doc:`payment_providers/sips`
|
||||
- :doc:`payment_providers/stripe`
|
||||
- :doc:`payment_providers/worldline`
|
||||
- :doc:`payment_providers/xendit`
|
||||
- :doc:`../websites/ecommerce/checkout_payment_shipping/payments`
|
||||
- :doc:`accounting/bank`
|
||||
|
||||
@@ -1,107 +0,0 @@
|
||||
=====
|
||||
Ogone
|
||||
=====
|
||||
|
||||
`Ogone <https://www.ingenico.com/>`_, also known as **Ingenico Payment Services** is a France-based
|
||||
company that provides the technology involved in secure electronic transactions.
|
||||
|
||||
.. seealso::
|
||||
- :ref:`payment_providers/add_new`
|
||||
- `Ogone's documentation <https://epayments-support.ingenico.com/get-started/>`_.
|
||||
|
||||
.. warning::
|
||||
The provider Ogone is deprecated. It is recommended to use :doc:`stripe` instead.
|
||||
|
||||
Settings in Ogone
|
||||
=================
|
||||
|
||||
Create an API user
|
||||
------------------
|
||||
|
||||
Log into your Ogone account and head to the :guilabel:`Configuration` tab.
|
||||
|
||||
You need to create an **API user** to be used in the creation of transactions from Odoo. While you
|
||||
can use your main account to do so, using an **API user** ensures that if the credentials used in
|
||||
Odoo are leaked, no access to your Ogone configuration is possible. Additionally, passwords for
|
||||
**API users** do not need to be updated regularly, unlike normal users.
|
||||
|
||||
To create an **API user**, go to :menuselection:`Configuration --> Users` and click on
|
||||
:guilabel:`New User`. The following fields must be configured:
|
||||
|
||||
.. _ogone/ogone:
|
||||
|
||||
- :guilabel:`UserID`: you can choose anything you want.
|
||||
- :guilabel:`User's Name, E-mail and Timezone`: you can enter the information you want.
|
||||
- :guilabel:`Profile`: should be set to :guilabel:`Admin`.
|
||||
- :guilabel:`Special user for API`: should be checked.
|
||||
|
||||
After the creation of the user, you are required to generate a password. Save the password and
|
||||
**UserID**, as they will be required later on during the setup.
|
||||
|
||||
.. tip::
|
||||
If you already have an user set up, make sure it is activated without any error. If not, simply
|
||||
click the :guilabel:`Activate(Errors)` button to reset the user.
|
||||
|
||||
Set up Ogone for Odoo
|
||||
---------------------
|
||||
|
||||
Ogone must now be configured to accept payments from Odoo. Head to :menuselection:`Configuration -->
|
||||
Technical Information --> Global Security Parameters`, select :guilabel:`SHA-512` as
|
||||
:guilabel:`Hash Algorithm` and :guilabel:`UTF-8` as :guilabel:`character encoding`. Then, go to the
|
||||
:guilabel:`Data and Origin verification` tab of the same page and leave the URL field of the
|
||||
:guilabel:`e-Commerce and Alias Gateway` section blank.
|
||||
|
||||
.. tip::
|
||||
If you need to use another algorithm, such as `sha-1` or `sha-256`, within Odoo, activate the
|
||||
:ref:`developer mode <developer-mode>` and go to the **Payment Providers** page in
|
||||
:menuselection:`Accounting --> Configuration --> Payment Providers`. Click on :guilabel:`Ogone`,
|
||||
and in the :guilabel:`Credentials` tab, select the algorithm you wish to use in the
|
||||
:guilabel:`Hash function` field.
|
||||
|
||||
You are now required to generate **SHA-IN** passphrases. **SHA-IN** and **SHA-OUT** passphrases are
|
||||
used to digitally sign the transaction requests and responses between Odoo and Ogone. By using these
|
||||
secret passphrases and the `sha-1` algorithm, both systems can ensure that the information they
|
||||
receive from the other was not altered or tampered with.
|
||||
|
||||
Enter the same **SHA-IN** passphrase in both :guilabel:`Checks for e-Commerce & Alias Gateway` and
|
||||
:guilabel:`Checks for DirectLink and Batch (Automatic)`. You can leave the IP address field blank.
|
||||
|
||||
Your **SHA-IN** and **SHA-OUT** passphrases should be different, and between 16 and 32 characters
|
||||
long. Make sure to use the same **SHA-IN** and **SHA-OUT** passphrases throughout the entire Ogone
|
||||
configuration, as Odoo only allows a single **SHA-IN** and single **SHA-OUT** passphrase.
|
||||
|
||||
In order to retrieve the **SHA-OUT** key, log into your Ogone account, go to
|
||||
:menuselection:`Configuration --> Technical Information --> Transaction feedback --> All
|
||||
transaction submission modes`, and get or generate your **API Key** and **Client Key**. Be careful
|
||||
to copy your API key as you’ll not be allowed to get it later without generating a new one.
|
||||
|
||||
When done, head to :menuselection:`Configuration --> Technical Information --> Transaction Feedback`
|
||||
and check the following options:
|
||||
|
||||
- The :guilabel:`URL` fields for :guilabel:`HTTP redirection in the browser` can be left empty, as
|
||||
Odoo will specify these URLs for every transaction request.
|
||||
- :guilabel:`I would like to receive transaction feedback parameters on the redirection URLs`:
|
||||
should be checked.
|
||||
- :guilabel:`Direct HTTP server-to-server request`: should to be set to `Online but switch to a
|
||||
deferred request when the online request fails`.
|
||||
- Both **URL** fields should contain the same following URL, with `<example>` replaced by your
|
||||
database: `https://<example>/payment/ogone/return`.
|
||||
|
||||
- :guilabel:`Dynamic eCommerce Parameters` should contain the following values: `ALIAS`, `AMOUNT`,
|
||||
`CARDNO`, `CN`, `CURRENCY`, `IP`, `NCERROR` `ORDERID`, `PAYID`, `PM`, `STATUS`, `TRXDATE`. Other
|
||||
parameters can be included (if you have another integration with Ogone that requires them), but
|
||||
are not advised.
|
||||
- In the :guilabel:`All transaction submission modes` section, fill out **SHA-OUT** passphrase and
|
||||
disable `HTTP request for status change`.
|
||||
|
||||
To allow your customers to save their credit card credentials for future use, head to
|
||||
:menuselection:`Configuration --> Alias --> My alias information`. From this tab, you can configure
|
||||
how the user can have its card details saved, for how long the information is saved, if a checkbox
|
||||
to save the card information should be displayed, etc.
|
||||
|
||||
Settings in Odoo
|
||||
================
|
||||
|
||||
To set up Ogone in Odoo, head to :menuselection:`Accounting --> Configuration --> Payment Providers`
|
||||
and open the Ogone provider. In the :guilabel:`Credentials` tab, enter the **PSPID** of your Ogone
|
||||
account, and fill out the other fields as configured in your :ref:`Ogone portal <ogone/ogone>`.
|
||||
@@ -1,32 +0,0 @@
|
||||
====
|
||||
SIPS
|
||||
====
|
||||
|
||||
`SIPS <https://sips.worldline.com/>`_ is an online payments solution from the multinational
|
||||
Worldline.
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
.. seealso::
|
||||
- :ref:`payment_providers/add_new`
|
||||
|
||||
Credentials tab
|
||||
---------------
|
||||
|
||||
Odoo needs your **API Credentials** to connect with your SIPS account, which comprise:
|
||||
|
||||
- **Merchant ID**: The ID solely used to identify the merchant account with SIPS.
|
||||
- **Secret Key**: The key to sign the merchant account with SIPS.
|
||||
- **Secret Key Version**: The version of the key, pre-filled.
|
||||
- **Interface Version**: Pre-filled, don't change it.
|
||||
|
||||
You can copy your credentials from your SIPS environment info documentation, in the section
|
||||
**PROD**, and paste them in the related fields under the **Credentials** tab.
|
||||
|
||||
.. important::
|
||||
If you are trying SIPS as a test, with the *TEST* credentials, change the **State** to *Test
|
||||
Mode*. We recommend doing this on a test Odoo database, rather than on your main database.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`../payment_providers`
|
||||
@@ -0,0 +1,68 @@
|
||||
=========
|
||||
Worldline
|
||||
=========
|
||||
|
||||
`Worldline <https://worldline.com/>`_ is a France-based company and the world's fourth largest
|
||||
payment provider.
|
||||
|
||||
Settings in Worldline
|
||||
=====================
|
||||
|
||||
.. _worldline/API-user:
|
||||
|
||||
Create an API user
|
||||
------------------
|
||||
|
||||
It is recommended to set up an **API user** to create transactions from Odoo to ensure that your
|
||||
Worldline configuration remains safe even if credentials are compromised. Additionally, API users do
|
||||
not require frequent password updates like regular accounts.
|
||||
|
||||
To create an **API user**, proceed as follows:
|
||||
|
||||
#. Log into your `Worldline Merchant Portal <https://merchant-portal.preprod.worldline-solutions.com/dashboard>`_,
|
||||
click the :icon:`fa-th` (:guilabel:`menu`) icon, and select :guilabel:`Back Office`.
|
||||
#. Go to :menuselection:`Configuration --> Users` and click on :guilabel:`New User`.
|
||||
#. Configure the following fields:
|
||||
|
||||
#. Specify a :guilabel:`UserID`, :guilabel:`User's name`, :guilabel:`E-mail address`, and
|
||||
:guilabel:`Timezone` of your choice.
|
||||
#. Set the :guilabel:`Profile` field to :guilabel:`Admin`.
|
||||
#. Enable :guilabel:`Special user for API`.
|
||||
|
||||
.. tip::
|
||||
If you have already set up a user, make sure it is activated without any error.
|
||||
|
||||
.. _worldline/set-up:
|
||||
|
||||
Set up Worldline for Odoo
|
||||
-------------------------
|
||||
|
||||
Worldline must now be configured to accept payments from Odoo.
|
||||
|
||||
#. From your merchant portal, go to :menuselection:`Developer --> Payment API` and click on
|
||||
:guilabel:`Generate API key`. Copy the :guilabel:`API key ID` and the :guilabel:`Secret API key`
|
||||
and save them for :ref:`later <wordline/odoo-configuration>`.
|
||||
#. Go to :menuselection:`Developer --> Webhooks` and click on :guilabel:`Generate webhook keys`.
|
||||
Copy the :guilabel:`Webhook ID` and the associated :guilabel:`Secret webhook key` and
|
||||
save them for :ref:`later <wordline/odoo-configuration>`.
|
||||
#. | Click :guilabel:`Add webhook endpoint`, enter your Odoo database's URL followed by
|
||||
`/payment/worldline/webhook` in the :guilabel:`Endpoint url` field, and :guilabel:`Confirm`.
|
||||
| For example: `https://example.odoo.com/payment/worldline/webhook`.
|
||||
|
||||
.. _wordline/odoo-configuration:
|
||||
|
||||
Settings in Odoo
|
||||
================
|
||||
|
||||
To set up Worldline in Odoo:
|
||||
|
||||
#. :ref:`Navigate to the payment provider Worldline <payment_providers/add_new>` and change its
|
||||
state to :guilabel:`Enabled`.
|
||||
#. In the :guilabel:`Credentials` tab, enter the :guilabel:`PSPID` of your Worldline account and
|
||||
fill in the :guilabel:`API Key`, :guilabel:`API Secret`, :guilabel:`Webhook Key`, and
|
||||
:guilabel:`Webhook Secret` with the values you saved at the step :ref:`Set up Worldline for
|
||||
Odoo <worldline/set-up>`.
|
||||
#. Configure the rest of the options to your liking.
|
||||
|
||||
.. seealso::
|
||||
:doc:`../payment_providers`
|
||||
@@ -174,6 +174,7 @@ document.
|
||||
- :doc:`appraisals/new_appraisals`
|
||||
- :doc:`appraisals/goals`
|
||||
- :doc:`appraisals/appraisal_analysis`
|
||||
- :doc:`appraisals/skills_evolution`
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
@@ -181,3 +182,4 @@ document.
|
||||
appraisals/new_appraisals
|
||||
appraisals/goals
|
||||
appraisals/appraisal_analysis
|
||||
appraisals/skills_evolution
|
||||
|
||||
@@ -24,13 +24,12 @@ Each appraisal card displays the following information:
|
||||
|
||||
- **Name**: the employee's name.
|
||||
- **Department**: the department the employee is associated with.
|
||||
- **Company**: the company the employee works for. This only appears in a multi-company
|
||||
database.
|
||||
- **Company**: the company the employee works for. This only appears in a multi-company database.
|
||||
- **Date**: the date the appraisal was requested, or is scheduled for in the future.
|
||||
- **Activities**: any :doc:`activities <../../essentials/activities>` that are scheduled for the
|
||||
appraisal, such as *Meetings* or *Phone Calls*.
|
||||
- **Manager**: the employee's manager, indicated by the profile icon in the bottom-right
|
||||
corner of an appraisal card.
|
||||
- **Manager**: the employee's manager, indicated by the profile icon in the bottom-right corner of
|
||||
an appraisal card.
|
||||
- **Status banner**: the status of the appraisal. A banner appears if an appraisal is marked as
|
||||
either *Canceled* or *Done*. If no banner is present, that means the appraisal has not happened,
|
||||
or has not been scheduled yet.
|
||||
@@ -274,8 +273,9 @@ Once the appraisal is marked as *Done*, the :guilabel:`Mark as Done` button disa
|
||||
button.
|
||||
|
||||
Then, click the :guilabel:`Confirm` button that appears, and make any modifications needed. Once
|
||||
all modifications are complete, click the the :guilabel:`Mark as Done` button again.
|
||||
all modifications are complete, click the :guilabel:`Mark as Done` button again.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`../appraisals/goals`
|
||||
- :doc:`../appraisals/appraisal_analysis`
|
||||
- :doc:`../appraisals/skills_evolution`
|
||||
|
||||
@@ -0,0 +1,164 @@
|
||||
================
|
||||
Skills evolution
|
||||
================
|
||||
|
||||
In Odoo's **Appraisals** app, it is possible to view employee's skills as they progress over time in
|
||||
the :ref:`Skills Evolution <appraisals/identify-skills-evolution>` report, also known as the
|
||||
*Appraisal Skills Report*.
|
||||
|
||||
Managers can use this to see who is achieving their various skill goals set on their appraisals, who
|
||||
is meeting their skill deadlines, who has the highest performance in terms of skill development, and
|
||||
more.
|
||||
|
||||
The *Skills Evolution* report also provides the ability to :ref:`search for employees with specific
|
||||
skills <appraisals/identify-skills>` at certain levels, which can be helpful for scenarios where
|
||||
specific skills are required.
|
||||
|
||||
.. _appraisals/identify-skills-evolution:
|
||||
|
||||
Skills evolution report
|
||||
=======================
|
||||
|
||||
To access this *Skills Evolution* report, navigate to :menuselection:`Appraisals app --> Reporting
|
||||
--> Skills Evolution`.
|
||||
|
||||
Doing so reveals the :guilabel:`Appraisal Skills Report` page, which displays a report of all
|
||||
skills, grouped by employee, in alphabetical order, by default.
|
||||
|
||||
.. note::
|
||||
Skill levels are **only** updated after an appraisal is marked as done. Any skill level changes
|
||||
from ongoing appraisals that have **not** been finalized are **not** included in this report.
|
||||
|
||||
All the :guilabel:`Employee` lines are expanded, with all the various skill types nested below. Each
|
||||
individual skill type is collapsed, by default. To view the individual skills contained within a
|
||||
skill type, click anywhere on the skill type line to expand the data.
|
||||
|
||||
Each skill has the following information listed:
|
||||
|
||||
- :guilabel:`Employee`: the name of the employee.
|
||||
- :guilabel:`Skill Type`: the category the skill falls under.
|
||||
- :guilabel:`Skill`: the specific, individual skill.
|
||||
- :guilabel:`Previous Skill Level`: the level the employee had previously achieved for the skill.
|
||||
- :guilabel:`Previous Skill Progress`: the previous percentage of competency achieved for the skill
|
||||
(based on the :guilabel:`Skill Level`).
|
||||
- :guilabel:`Current Skill Level`: the current level the employee has achieved for the skill.
|
||||
- :guilabel:`Current Skill Progress`: the current percentage of competency achieved for the skill.
|
||||
- :guilabel:`Justification`: any notes entered on the skill, explaining the progress.
|
||||
|
||||
The color of the skill text indicates any changes from the previous appraisal. Skill levels that
|
||||
have increased since the last appraisal appear in green, as an *Improvement*. Skill levels that have
|
||||
**not** changed appear in black, as *No Change*. Skills that have regressed appear in red, as
|
||||
*Regression*.
|
||||
|
||||
This report can be modified to find specific information by adjusting the :ref:`filters
|
||||
<search/filters>` and :ref:`groupings <search/group>` set in the search bar at the top.
|
||||
|
||||
.. image:: skills_evolution/skills-report.png
|
||||
:align: center
|
||||
:alt: A report showing all the skills grouped by employee.
|
||||
|
||||
.. _appraisals/identify-skills:
|
||||
|
||||
Use case: Identify employees with specific skills
|
||||
=================================================
|
||||
|
||||
Since the :guilabel:`Appraisal Skills Report` organizes all skills by employee, it can be difficult
|
||||
to find employees with a specific skill at a specific level. To find these employees, a custom
|
||||
filter must be used.
|
||||
|
||||
In this example, the report is modified to show employees with an expert level of Javascript
|
||||
knowledge. To view only those employees, first remove all active filters in the search bar.
|
||||
|
||||
Next, click the :icon:`fa-caret-down` :guilabel:`(down arrow)` icon in the search bar, then click
|
||||
:guilabel:`Add Custom Filter` beneath the :icon:`fa-filters` :guilabel:`Filters` column to load an
|
||||
:guilabel:`Add Custom Filter` pop-up window.
|
||||
|
||||
Using the drop-down menu in the first field, select :guilabel:`Skill`. Then, keep the second field
|
||||
as-is, and select :guilabel:`Javascript` from the third drop-down menu in the third field.
|
||||
|
||||
Next, click :guilabel:`New Rule`, and another line appears. In this second line, select
|
||||
:guilabel:`Current Skill Level` for the first drop-down field, leave the second field as-is, then
|
||||
select :guilabel:`Expert` for the third drop-down field.
|
||||
|
||||
After the :guilabel:`New Rule` button is clicked, the word :guilabel:`"any"` in the sentence
|
||||
:guilabel:`Match any of the following rules:`, changes from plain text into a drop-down menu. Click
|
||||
the :icon:`fa-caret-down` :guilabel:`(down arrow)` icon after the word :guilabel:`any`, and select
|
||||
:guilabel:`all`.
|
||||
|
||||
Finally, click the :guilabel:`Add` button.
|
||||
|
||||
.. image:: skills_evolution/javascript.png
|
||||
:align: center
|
||||
:alt: The Custom Filter pop-up with the parameters set.
|
||||
|
||||
Now, only employees that have an :guilabel:`Expert` level for the skill :guilabel:`Javascript`
|
||||
appear. In this example, only :guilabel:`Marc Demo` meets these criteria.
|
||||
|
||||
.. image:: skills_evolution/results.png
|
||||
:align: center
|
||||
:alt: The employees with expert Javascript skills.
|
||||
|
||||
Use case: Assess highest improvement
|
||||
====================================
|
||||
|
||||
Another way to modify the :guilabel:`Appraisal Skills Report` is to identify the employee who has
|
||||
the highest amount of improved skills over a specific period of time.
|
||||
|
||||
To view this information, first remove the default filter in the search bar. Next, click the
|
||||
:icon:`fa-caret-down` :guilabel:`(down arrow)` icon in the search bar, then click
|
||||
:guilabel:`Improvement` beneath the :icon:`fa-filter` :guilabel:`Filters` column. Enabling this
|
||||
filter only presents skills that have improved.
|
||||
|
||||
It is possible to view the skills that have improved over a period of time, such as a specific
|
||||
quarter, or month. With the search bar drop-down menu still expanded, click :guilabel:`Add Custom
|
||||
Filter` at the bottom of the :icon:`fa-filter` :guilabel:`Filters` column, and an :guilabel:`Add
|
||||
Custom Filter` pop-up window appears.
|
||||
|
||||
Select :guilabel:`Create Date` for the first drop-down field, then select :guilabel:`is between` for
|
||||
the second drop-down field. Once :guilabel:`is between` is selected, a second field appears after
|
||||
the last field. Using the calendar selector, select the date range to apply the filter to. Once all
|
||||
the fields are properly formatted, click :guilabel:`Add`.
|
||||
|
||||
The custom filter presents only the skills that have improved during the specified time period,
|
||||
organized by employee.
|
||||
|
||||
.. example::
|
||||
To determine the employee with the most amount of improved skills for the third quarter, remove
|
||||
the default filter in the search bar of the :guilabel:`Appraisal Skills Report`. Next, activate
|
||||
the :guilabel:`Improvement` filter, then click :guilabel:`Add Custom Filter` at the bottom of the
|
||||
:icon:`fa-filter` :guilabel:`Filters` column.
|
||||
|
||||
In the resulting :guilabel:`Add Custom Filter` pop-up window, select :guilabel:`Create Date` for
|
||||
the first drop-down field, then select :guilabel:`is between` for the second drop-down field. Two
|
||||
date fields appear after :guilabel:`is between` is selected.
|
||||
|
||||
Using the calendar selector, set the first date to :guilabel:`07/01/2024` and the second date to
|
||||
:guilabel:`09/30/2024`, then click :guilabel:`Add`.
|
||||
|
||||
These filters present only the skills that have improved during the third quarter (between July
|
||||
1st and September 30th, 2024), organized by employee.
|
||||
|
||||
.. image:: skills_evolution/custom-filter.png
|
||||
:alt: The Custom Filter pop-up with the parameters set.
|
||||
|
||||
To view the number of employees and skills in further detail, click the :icon:`oi-view-pivot`
|
||||
:guilabel:`(Pivot)` icon in the top-right corner to view the data in a pivot table. This presents a
|
||||
pivot table with the employees populating the rows, and the only visible column represents the total
|
||||
number of improved skills.
|
||||
|
||||
To expand more rows or columns to view which skill types had the most overall improvement, click
|
||||
:icon:`fa-plus-square` :guilabel:`Total` above the :guilabel:`Count` column, then click
|
||||
:guilabel:`Skill Type` from the resulting drop-down menu. This organizes the total improved skills
|
||||
by their respective skill type.
|
||||
|
||||
.. example::
|
||||
In this example, it is determined that :guilabel:`Charles Reginald` had the largest improvement
|
||||
in the third quarter, with six improved skills. Additionally, they also had the most skill
|
||||
improvements for both :guilabel:`Languages` (three) and :guilabel:`Programming Languages` (two).
|
||||
|
||||
.. image:: skills_evolution/largest-improvement.png
|
||||
:alt: The pivot table showing the skill improvements for the third quarter.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`Odoo essentials reporting <../../essentials/reporting>`
|
||||
- :doc:`../../essentials/search`
|
||||
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 33 KiB |
@@ -13,4 +13,6 @@ Odoo *Employees* organizes a company's employee records, contracts, and departme
|
||||
|
||||
employees/new_employee
|
||||
employees/departments
|
||||
employees/certifications
|
||||
employees/offboarding
|
||||
employees/retention_report
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
==============
|
||||
Certifications
|
||||
==============
|
||||
|
||||
When jobs require specific knowledge, it is necessary to track employee certifications to ensure the
|
||||
necessary knowledge and certifications are in place.
|
||||
|
||||
Certifications include classes, tests, professional seminars, and more. There are no restrictions in
|
||||
terms of what type of certification records can be added in Odoo.
|
||||
|
||||
.. important::
|
||||
To access the *Employee Certifications* report, the **Surveys** app **must** be installed.
|
||||
|
||||
View certifications
|
||||
===================
|
||||
|
||||
To view a full list of all employee certifications, navigate to :menuselection:`Employees app -->
|
||||
Reporting --> Certifications`.
|
||||
|
||||
All certifications appear in a list view, grouped by employee. Each certification entry displays the
|
||||
following:
|
||||
|
||||
- :guilabel:`Employee`: the employee's name, along with their avatar image.
|
||||
- :guilabel:`Name`: the title of the certification.
|
||||
- :guilabel:`Validity Start`: when the employee received the certification.
|
||||
- :guilabel:`Validity End`: when the certification expires.
|
||||
- :guilabel:`Certification`: the corresponding course in the **Surveys** app that was completed by
|
||||
the employee, if applicable.
|
||||
|
||||
The entries are also color-coded. Current certifications that are still valid appear in black,
|
||||
expired certifications appear in red, and certifications that are going to expire within the next
|
||||
90 days appear in orange.
|
||||
|
||||
.. image:: certifications/certifications.png
|
||||
:align: center
|
||||
:alt: The list of employee certifications.
|
||||
|
||||
.. important::
|
||||
**Only** certification records with the *Display Type* set to *Certification* on their
|
||||
:ref:`certification form <employees/certifications-form>` appear on the :guilabel:`Employee
|
||||
Certifications` report. All other certifications appear in the resume section of the
|
||||
:doc:`employee form <new_employee>`.
|
||||
|
||||
View certifications by expiration status
|
||||
----------------------------------------
|
||||
|
||||
When managing a large number of employees with a variety of certifications, it can be difficult to
|
||||
determine which employees need to keep necessary certifications current in the default list view. In
|
||||
this scenario, it is beneficial to view the certifications by expiration status.
|
||||
|
||||
To do so, navigate to :menuselection:`Employees app --> Reporting --> Certifications`. Next, click
|
||||
the :icon:`fa-caret-down` :guilabel:`(down arrow)` in the search bar, then click :guilabel:`Add
|
||||
Custom Group`, revealing a drop-down menu. Click :guilabel:`Expiration Status`, then click away from
|
||||
the drop-down menu to close it.
|
||||
|
||||
After doing so, all the certifications are organized by status, starting with :guilabel:`Expired`
|
||||
certifications, then certifications that are :guilabel:`Expiring` soon (within the next 90 days),
|
||||
and lastly, certifications that are still :guilabel:`Valid`.
|
||||
|
||||
This view provides an easy way to see which employees have certifications that are going to expire
|
||||
soon, to determine which employees need to take action to keep their certifications current.
|
||||
|
||||
.. image:: certifications/status.png
|
||||
:align: center
|
||||
:alt: The list of employee certifications, grouped by status.
|
||||
|
||||
.. _employees/certifications-form:
|
||||
|
||||
Log a certification
|
||||
===================
|
||||
|
||||
To log a certification for an employee, navigate to :menuselection:`Employees app --> Reporting -->
|
||||
Certifications`. Click :guilabel:`New`, and a blank certification form loads. Enter the following
|
||||
information on the form:
|
||||
|
||||
- :guilabel:`Title`: Enter a short description for the certification in this field.
|
||||
- :guilabel:`Employee`: Using the drop-down menu, select the employee who received the
|
||||
certification.
|
||||
- :guilabel:`Type`: Using the drop-down menu, select the type of certification received. This field
|
||||
determines where on the employee's resume the certification appears. To create a new
|
||||
:guilabel:`Type`, enter the type in the field, then click :guilabel:`Create "type"`.
|
||||
|
||||
The default options are:
|
||||
|
||||
- :guilabel:`Experience`: Select this option to have the certification appear in the *Experience*
|
||||
section of the *Resume* tab on the :doc:`employee form <new_employee>`.
|
||||
- :guilabel:`Education`: Select this option to have the certification appear in the *Education*
|
||||
section of the *Resume* tab on the :doc:`employee form <new_employee>`.
|
||||
- :guilabel:`Internal Certification`: Select this option to have the certification appear in the
|
||||
*Internal Certification* section of the *Resume* tab on the :doc:`employee form <new_employee>`.
|
||||
- :guilabel:`Completed Internal Training`: Select this option to have the certification appear in
|
||||
*Completed Internal Training* section of the *Resume* tab on the :doc:`employee form
|
||||
<new_employee>`.
|
||||
|
||||
- :guilabel:`Display Type`: Select the visibility of the certification in this field. The default
|
||||
options are:
|
||||
|
||||
- :guilabel:`Classic`: Select this option to have the certification appear in the *Resume* section
|
||||
of the employee form, and **not** appear on the *Employee Certifications* report.
|
||||
- :guilabel:`Course`: Select this option to have the certification appear in the *Resume* section
|
||||
of the employee form, and **not** appear on the *Employee Certifications* report. Once this
|
||||
option is selected, a :guilabel:`Course` field appears beneath the :guilabel:`Display Type`
|
||||
field. Using the drop-down menu, select the course the employee took. The course is created in
|
||||
the **Surveys** app.
|
||||
- :guilabel:`Certification`: Select this option to have the certification appear in the *Resume*
|
||||
section of the employee form, **and** appear on the *Employee Certifications* report. Once this
|
||||
is selected, a :guilabel:`Certification` field appears beneath the :guilabel:`Display
|
||||
Type` field. Using the drop-down menu, select the certification the employee took.
|
||||
|
||||
- :guilabel:`Description`: Enter a description for the certification in this field.
|
||||
- :guilabel:`Duration`: Click into the first field, and a calendar pop-over window appears. Click on
|
||||
the start and end dates for the certification validity period. When the correct dates are
|
||||
selected, click :icon:`fa-check` :guilabel:`Apply`, and both fields are populated.
|
||||
|
||||
.. image:: certifications/osha.png
|
||||
:align: center
|
||||
:alt: A certification form filled out for an OSHA certificate for construction.
|
||||
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 33 KiB |
@@ -0,0 +1,103 @@
|
||||
=========================
|
||||
Employee retention report
|
||||
=========================
|
||||
|
||||
It is possible to determine the retention rate for a company by modifying an existing report.
|
||||
|
||||
First, navigate to :menuselection:`Employees app --> Reporting --> Contracts` to open the
|
||||
:guilabel:`Employee Analysis` report. This report shows the number of all employees for the
|
||||
:guilabel:`Last 365 Days`, in a default :icon:`fa-line-chart` :guilabel:`Line Chart`.
|
||||
|
||||
.. image:: retention_report/employees-analysis.png
|
||||
:align: center
|
||||
:alt: The default Employees Analysis report.
|
||||
|
||||
Next, click the :guilabel:`Measures` :icon:`fa-caret-down` button in the upper-left corner,
|
||||
revealing a drop-down menu. Click :guilabel:`# Departure Employee` in the list, then click away from
|
||||
the drop-down menu to close it. Now, the report shows all the employees who were archived for the
|
||||
:guilabel:`Last 365 Days`.
|
||||
|
||||
To view this information in an easier format, click the :icon:`oi-view-pivot` :guilabel:`(Pivot)`
|
||||
icon in the upper-right corner, and the data is presented in a pivot table.
|
||||
|
||||
The various employees, organized by department, populate the rows. The columns display the following
|
||||
totals: the monthly :guilabel:`Wage`, the :guilabel:`Fuel Card` budget, total :guilabel:`Annual
|
||||
Employee Budget` (also referred to as the *annual salary*), the number of :guilabel:`New Employees`,
|
||||
as well as the number of :guilabel:`Departure Employees` (employees who left).
|
||||
|
||||
.. image:: retention_report/pivot-departures.png
|
||||
:align: center
|
||||
:alt: The Employees Analysis report, modified to show departed employees only.
|
||||
|
||||
Employee retention rate comparison report
|
||||
=========================================
|
||||
|
||||
It is possible to compare data only for employees who left, compared to the total current employees,
|
||||
between two separate time periods. This is commonly referred to as the *employee retention rate*.
|
||||
|
||||
To view these metrics, first open the :guilabel:`Employee Analysis` report by navigating to
|
||||
:menuselection:`Employees app --> Reporting --> Contracts`. Click the :icon:`oi-view-pivot`
|
||||
:guilabel:`(Pivot)` icon in the upper-right corner to view the information in a pivot table.
|
||||
|
||||
Next, click the :guilabel:`Measures` :icon:`fa-caret-down` button in the upper-left corner,
|
||||
revealing a drop-down menu. Click :guilabel:`# New Employees`, :guilabel:`Annual Employee Budget`,
|
||||
:guilabel:`Fuel Card`, and :guilabel:`Wage` in the list, to deselect these metrics and hide them in
|
||||
the table. Then, click :guilabel:`Count` at the bottom of the list to enable that metric.
|
||||
|
||||
Click away from the drop-down menu to close it. Now, the report shows all the employees who left the
|
||||
company (:guilabel:`# Departure Employee`), as well as the total number of employees
|
||||
(:guilabel:`Count`), for the :guilabel:`Last 365 Days`.
|
||||
|
||||
To compare the data for the current year with the previous year, click the :icon:`fa-caret-down`
|
||||
:guilabel:`(down arrow)` in the search bar, revealing multiple filter and grouping options. Click
|
||||
:guilabel:`Last 365 Days` in the :icon:`fa-filter` :guilabel:`Filters` column, to turn off that
|
||||
filter. Then, click :guilabel:`Date`, and click the current year (in this example, :guilabel:`2024`)
|
||||
from the resulting drop-down menu.
|
||||
|
||||
Once a selection is made beneath :guilabel:`Date` in the :icon:`fa-filter` :guilabel:`Filters`
|
||||
column, a :icon:`fa-adjust` :guilabel:`Comparison` column appears. Click :guilabel:`Date: Previous
|
||||
Year` in the new column, then click off of the drop-down menu to close it.
|
||||
|
||||
.. note::
|
||||
In Odoo, in order to access the :icon:`fa-adjust` :guilabel:`Comparison` column, a specific time
|
||||
*other than* :guilabel:`Last 365 Days` **must** be selected. If not, the :icon:`fa-adjust`
|
||||
:guilabel:`Comparison` column is **not** visible.
|
||||
|
||||
Now, the pivot table displays the total number of employees who left the company (:guilabel:`#
|
||||
Departure Employee`), as well as the total number of employees (:guilabel:`Count`) in the columns.
|
||||
These are further divided by the two different years, and also displays the :guilabel:`Variation`
|
||||
between the two.
|
||||
|
||||
The rows display the departments, and lists each individual employee for each department, in the
|
||||
rows.
|
||||
|
||||
For a more concise view of this report, click :icon:`fa-minus-square-o` :guilabel:`Total` above the
|
||||
top row of the departments and employees, to collapse the rows. Now, the table presents the total
|
||||
number of employees who left the company for both years, compared to the total number of employees
|
||||
for both years, including the difference, in a percentage.
|
||||
|
||||
.. example::
|
||||
In this example, :guilabel:`3` employees out of :guilabel:`83` left in 2023, and :guilabel:`8`
|
||||
employees out of :guilabel:`202` left in 2024. There was a :guilabel:`166.67%` increase in the
|
||||
employees who left in 2024 as compared to 2023. Additionally, there was a :guilabel:`143.37%`
|
||||
increase in the total number of employees in 2024 as compared to 2023.
|
||||
|
||||
.. image:: retention_report/comparison-years.png
|
||||
:align: center
|
||||
:alt: The report modified to show the difference between two years of employees who left.
|
||||
|
||||
To view more detailed rates for each department, click :icon:`fa-plus-square` :guilabel:`Total` in
|
||||
the single row, revealing a drop-down menu, and click :guilabel:`Department`. Click away from the
|
||||
drop-down to close it, and now the pivot table displays the total number of employees who left
|
||||
(:guilabel:`# Departure Employee`), the total number of employees (:guilabel:`Count`), and the
|
||||
:guilabel:`Variation` (in a percentage) for both 2023 and 2024, organized by department.
|
||||
|
||||
.. example::
|
||||
In this example, it can be determined that the :guilabel:`Management` department had the best
|
||||
retention rate in 2024 as compared to 2023, with a :guilabel:`Variation` rate of
|
||||
:guilabel:`-100%`. Additionally, it can be determined that the :guilabel:`Management / Research &
|
||||
Development` department had the most turnover, with a :guilabel:`Variation` of :guilabel:`300%`.
|
||||
|
||||
.. image:: retention_report/department-totals.png
|
||||
:align: center
|
||||
:alt: The expanded employee retention report by department.
|
||||
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 29 KiB |
@@ -963,6 +963,7 @@ form.
|
||||
- :doc:`payroll/payslips`
|
||||
- :doc:`payroll/work_entries`
|
||||
- :doc:`payroll/reporting`
|
||||
- :doc:`payroll/work_entry_analysis`
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
@@ -971,3 +972,4 @@ form.
|
||||
payroll/work_entries
|
||||
payroll/payslips
|
||||
payroll/reporting
|
||||
payroll/work_entry_analysis
|
||||
|
||||
@@ -178,63 +178,11 @@ spreadsheet view with the report added to it.
|
||||
.. _payroll/doc-storage:
|
||||
|
||||
.. note::
|
||||
If the *Documents* app is **not** installed, the :guilabel:`Insert in Spreadsheet` option places
|
||||
the newly-created spreadsheet in the *Dashboards* app.
|
||||
If the **Documents** app is **not** installed, the :guilabel:`Insert in Spreadsheet` option
|
||||
places the newly-created spreadsheet in the **Dashboards** app.
|
||||
|
||||
If the *Documents* application **is** installed, the spreadsheet has the option to be stored in
|
||||
either the *Dashboards* app or *Documents* app.
|
||||
|
||||
Work entry analysis
|
||||
-------------------
|
||||
|
||||
The default :guilabel:`Work entry analysis` report provides an overview of the validated work
|
||||
entries for the current month. To view this report, navigate to :menuselection:`Payroll app -->
|
||||
Reporting --> Work Entry Analysis`.
|
||||
|
||||
The work entries appear in a pivot table, with the default filters of `Current month: (Month)(Year)`
|
||||
and `Validated`. The various types of :doc:`work_entries` are listed on the left-hand side (x-axis),
|
||||
while the :guilabel:`Total` values appear along the top (the y-axis).
|
||||
|
||||
To change the displayed view, click the :guilabel:`➕ (plus)` icon next to the word
|
||||
:guilabel:`Total`, then click on one of the grouping options. The available options are
|
||||
:guilabel:`Work Entry Type`, :guilabel:`Employee`, and :guilabel:`Department`. If in a multi-company
|
||||
database, a :guilabel:`Company` option also appears.
|
||||
|
||||
To add a new group to sort the data, click :guilabel:`Add Custom Group`, then click one of the
|
||||
presented options.
|
||||
|
||||
.. tip::
|
||||
Wherever a :guilabel:`➕ (plus)` icon appears on a pivot table, the information can be further
|
||||
grouped. Click on a :guilabel:`➕ (plus)` icon to reveal the available grouping options.
|
||||
|
||||
Click on a :guilabel:`➖ (minus)` icon anywhere on the pivot table to remove that respective
|
||||
grouping.
|
||||
|
||||
It is possible to compare the current :guilabel:`Work entry analysis` report to the previous month
|
||||
or the previous year. To view these comparisons, click the :guilabel:`⬇️ (down arrow)` icon in the
|
||||
search bar to reveal the various :ref:`filter <payroll/filters>` and grouping options.
|
||||
|
||||
In the section titled :guilabel:`Comparison`, click on either :guilabel:`Current Month: Previous
|
||||
Period` or :guilabel:`Current Month: Previous Year`. The report updates and displays the previous
|
||||
time period values, as well as the :guilabel:`Variation` between the two.
|
||||
|
||||
.. image:: reporting/work-entry-comparison.png
|
||||
:align: center
|
||||
:alt: A pivot table comparing the work entries of the current month and the previous month.
|
||||
|
||||
To export the data in an XLSX format, click the :guilabel:`Download xlsx` button, represented by a
|
||||
:guilabel:`⬇️ (down arrow above a horizontal bar)` icon, located at the far-right of the available
|
||||
icons. The information is then downloaded into a spreadsheet.
|
||||
|
||||
The data can also be inserted into a spreadsheet. Click the :guilabel:`Insert in Spreadsheet` button
|
||||
and a :guilabel:`Select a spreadsheet to insert your (type of report)` pop-up window appears, asking
|
||||
which spreadsheet to place the information in. Select an existing spreadsheet or dashboard, or
|
||||
select a new :guilabel:`Blank spreadsheet`. Click the :guilabel:`Confirm` button to move to a
|
||||
spreadsheet view with the report added to it.
|
||||
|
||||
.. note::
|
||||
The work entry analysis spreadsheet is :ref:`stored in the same locations <payroll/doc-storage>`
|
||||
as a pivot table.
|
||||
If the **Documents** application *is* installed, the spreadsheet has the option to be stored in
|
||||
either the **Dashboards** app or **Documents** app.
|
||||
|
||||
Salary attachment report
|
||||
------------------------
|
||||
|
||||
|
Before Width: | Height: | Size: 28 KiB |
@@ -59,8 +59,8 @@ Enter the following information on the form:
|
||||
this field is left blank, it automatically populates once an employee is selected. The default
|
||||
entry is `Attendance: (Employee)`.
|
||||
- :guilabel:`Employee`: select the employee the work entry is for, using the drop-down menu.
|
||||
- :guilabel:`Work Entry Type`: select the :ref:`work entry type <payroll/work-entries-config>` using
|
||||
the drop-down menu.
|
||||
- :guilabel:`Work Entry Type`: select the :ref:`work entry type <payroll/work-entries>` using the
|
||||
drop-down menu.
|
||||
- :guilabel:`From` and :guilabel:`To`: enter the start (:guilabel:`From`) and end (:guilabel:`To`)
|
||||
dates and times for the work entry.
|
||||
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
===================
|
||||
Work entry analysis
|
||||
===================
|
||||
|
||||
The default *Work Entries Analysis* report provides an overview of the validated work entries for
|
||||
the current month. To view this report, navigate to :menuselection:`Payroll app --> Reporting -->
|
||||
Work Entry Analysis`.
|
||||
|
||||
The work entries appear in a pivot table, with the default filters of :guilabel:`Current month:
|
||||
(Month)(Year)` and :guilabel:`Validated`. The various types of :doc:`work_entries` populate the
|
||||
rows, while the :guilabel:`Total` values populate the only visible column.
|
||||
|
||||
To change the displayed information, click :icon:`fa-plus-square` :guilabel:`Total` above the main
|
||||
column, revealing a drop-down menu of available metrics. Click on one of the available groupings,
|
||||
and the data is further organized by that selected metric. The default options are :guilabel:`Work
|
||||
Entry Type`, :guilabel:`Employee`, and :guilabel:`Department`. If in a multi-company database, a
|
||||
:guilabel:`Company` option also appears.
|
||||
|
||||
Work entry analysis comparison
|
||||
==============================
|
||||
|
||||
It is possible to compare the work entries from one time period to a previous time period. To view
|
||||
this comparison, first navigate to :menuselection:`Payroll app --> Reporting --> Work Entry
|
||||
Analysis`.
|
||||
|
||||
Next, click the :icon:`fa-caret-down` :guilabel:`(down arrow)` icon in the search bar, revealing a
|
||||
drop-down menu. Under the :icon:`fa-adjust` :guilabel:`Comparison` section, click on either
|
||||
:guilabel:`Current Month: Previous Period` or :guilabel:`Current Month: Previous Year`.
|
||||
|
||||
The report updates and displays the data for the current time period, data for the selected previous
|
||||
time period, as well as the :guilabel:`Variation` between the two, in a percentage.
|
||||
|
||||
.. image:: work_entry_analysis/work-entry-comparison.png
|
||||
:alt: A pivot table comparing the work entries of the current month and the previous month.
|
||||
|
||||
.. note::
|
||||
If no work entries for a specific :ref:`work entry type <payroll/work-entries>` are logged for
|
||||
the time period, it does **not** appear on the report. That does **not** mean the work entry type
|
||||
does not exist, or is not configured.
|
||||
|
||||
Additionally, if the default :guilabel:`Current month: (Month)(Year)` filter is removed from the
|
||||
search bar, the :guilabel:`Comparison` column does **not** appear; there must be a time-frame
|
||||
selected to view the :guilabel:`Comparison` column.
|
||||
|
||||
Use case: overtime report comparison
|
||||
====================================
|
||||
|
||||
It is possible to alter the *Work Entries Analysis* report to show a comparison of only overtime
|
||||
work entries, grouped by employee, for a specific time period. To view this data, first navigate to
|
||||
the default *Work entry analysis* report by going to :menuselection:`Payroll app --> Reporting -->
|
||||
Work Entry Analysis`.
|
||||
|
||||
Next, click the :icon:`fa-caret-down` :guilabel:`(down arrow)` icon in the search bar, revealing a
|
||||
drop-down menu. Under the :icon:`fa-filter` :guilabel:`Filters` column, click :guilabel:`Add Custom
|
||||
Filter`, and a :guilabel:`Add Custom Filter` pop-up window appears.
|
||||
|
||||
Using the drop-down menu, select :guilabel:`Work Entry Type` for the first field, leave the middle
|
||||
field as-is (with :guilabel:`is in` populating the field), and select :guilabel:`Overtime Hours` for
|
||||
the last field. Click :guilabel:`Add`, and all other work entry types disappear, and
|
||||
:guilabel:`Overtime Hours` appear in the sole row.
|
||||
|
||||
To compare overtime from the current month to the previous month, to see which month had more
|
||||
overtime logged, click the :icon:`fa-caret-down` :guilabel:`(down arrow)` icon again in the search
|
||||
bar. Under the :icon:`fa-adjust` :guilabel:`Comparison` section, click :guilabel:`Current Month:
|
||||
Previous Period`. Click away from the drop-down menu to close it.
|
||||
|
||||
Now, the report displays the :guilabel:`Overtime Hours` for the current month and the previous
|
||||
month, along with the :guilabel:`Variation`, in a percentage.
|
||||
|
||||
To view which employees received the most overtime, click :icon:`fa-plus-square` :guilabel:`Overtime
|
||||
Hours`, revealing a drop-down menu of options. Click :guilabel:`Employee`, and all employees with
|
||||
overtime work entries for either the current or previous month appears.
|
||||
|
||||
In this example, it can be determined that :guilabel:`Marc Demo` worked the most overtime in
|
||||
:guilabel:`August 2024`, whereas :guilabel:`Beth Evans` worked the most overtime hours in
|
||||
:guilabel:`September 2024`. Additionally, :guilabel:`Mitchell Admin` had the largest variation
|
||||
change, with a :guilabel:`-100%` change from :guilabel:`August 2024` to :guilabel:`September 2024`.
|
||||
|
||||
.. image:: work_entry_analysis/variation.png
|
||||
:alt: A pivot table comparing the overtime from September 2024 with August 2024.
|
||||
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 22 KiB |
@@ -167,6 +167,8 @@ warehouse. Next, in the :guilabel:`Applicable on` section, tick the :guilabel:`P
|
||||
|
||||
Route with "Packagings" selected, with "Products" and "Warehouses" not selected.
|
||||
|
||||
.. _inventory/product_management/route-on-packaging:
|
||||
|
||||
Apply route on packaging
|
||||
------------------------
|
||||
|
||||
|
||||
@@ -10,3 +10,4 @@ Inventory valuation
|
||||
inventory_valuation/inventory_valuation_config
|
||||
inventory_valuation/using_inventory_valuation
|
||||
inventory_valuation/integrating_landed_costs
|
||||
inventory_valuation/valuation_by_lots
|
||||
|
||||
@@ -108,6 +108,8 @@ available during a prior specified date can be seen and selected.
|
||||
the teal :guilabel:`➡️ (right arrow)` button to the right of the :guilabel:`Reference` column
|
||||
value.
|
||||
|
||||
.. _inventory/product_management/update-unit-price:
|
||||
|
||||
Update product unit price
|
||||
-------------------------
|
||||
|
||||
|
||||
@@ -0,0 +1,208 @@
|
||||
================================
|
||||
Valuation by lots/serial numbers
|
||||
================================
|
||||
|
||||
Track :doc:`inventory valuation <using_inventory_valuation>` by :doc:`lots or serial numbers
|
||||
<../../product_management/product_tracking>` to:
|
||||
|
||||
#. :ref:`Compare and differentiate purchasing cost <inventory/product_management/view-valuation>`,
|
||||
based on lot or serial numbers.
|
||||
#. Track the actual cost of manufactured products, based on the real cost of each tracked component
|
||||
used.
|
||||
#. Depreciate specific lot or serial numbers when they :doc:`sit in stock for too long
|
||||
<../../warehouses_storage/reporting/aging>`.
|
||||
|
||||
.. important::
|
||||
Please read this :doc:`introduction to inventory valuation <inventory_valuation_config>` before
|
||||
setting up valuation by lot/serial numbers.
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
To enable valuation by lots or serial numbers, begin by enabling the :doc:`Lots and Serial Numbers
|
||||
feature <../product_tracking>`. After that, go to :menuselection:`Inventory app --> Products -->
|
||||
Products`, and select the desired product, or create a new product, by clicking :guilabel:`New`.
|
||||
|
||||
On the product form, in the :guilabel:`Category` field, choose a product category. Ensure the
|
||||
product category's :ref:`Costing Method <inventory/warehouses_storage/costing_methods>` is set to
|
||||
*First In First Out (FIFO)* or *Average Cost (AVCO)*.
|
||||
|
||||
.. tip::
|
||||
To check the costing method set on the product category, hover over the :guilabel:`Category`
|
||||
field, and click the :icon:`oi-arrow-right` :guilabel:`(Internal Link)` icon.
|
||||
|
||||
.. seealso::
|
||||
:ref:`Costing methods <inventory/warehouses_storage/costing_methods>`
|
||||
|
||||
Next, activate the product to be tracked by lots or serial numbers by ticking the :guilabel:`Track
|
||||
Inventory` checkbox. Then, click the adjacent field that appears, and choose either :guilabel:`By
|
||||
Lots` or :guilabel:`By Unique Serial Number` from the resulting drop-down menu.
|
||||
|
||||
Doing so makes the :guilabel:`Valuation by Lot/Serial number` checkbox appear below it. Tick that
|
||||
checkbox, and the configuration to track valuation by lot or serial numbers is complete.
|
||||
|
||||
.. figure:: valuation_by_lots/product-form.png
|
||||
:alt: Product form showing the Valuation by Lot or Serial Number feature.
|
||||
|
||||
Product form showing the Valuation by Lot or Serial Number feature
|
||||
|
||||
Valuation layers
|
||||
================
|
||||
|
||||
To understand how valuation by lots and serial numbers works, consider these scenarios:
|
||||
|
||||
#. :ref:`Purchase and sell products <inventory/product_management/valuation-cost-example>`: cost is
|
||||
calculated based on the *product category's* costing method.
|
||||
#. :ref:`Create new lot/serial numbers <inventory/product_management/valuation-cost-new>` using an
|
||||
inventory adjustment: value of the new lot/serial number is assigned to the cost from the product
|
||||
form.
|
||||
#. Inventory adjustment to update quantities for an :ref:`existing lot/serial number
|
||||
<inventory/product_management/valuation-cost-existing>`: value is assigned based on the most
|
||||
recent cost for that lot/serial number.
|
||||
|
||||
For both :abbr:`AVCO (Average Cost)` and :abbr:`FIFO (First In First Out)` methods, the *Cost* field
|
||||
on the product form is calculated using this formula:
|
||||
|
||||
:math:`Avg~Cost = \frac{Total~Value}{Total~Qty}`
|
||||
|
||||
.. _inventory/product_management/valuation-cost-example:
|
||||
|
||||
Purchase products
|
||||
-----------------
|
||||
|
||||
Consider how purchasing products affect the inventory valuation, in the table below.
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
:stub-columns: 1
|
||||
|
||||
* -
|
||||
- Quantity
|
||||
- Lot number
|
||||
- Math
|
||||
- Average cost on product form
|
||||
* - Empty stock
|
||||
- 0.00
|
||||
-
|
||||
-
|
||||
- $0
|
||||
* - Day 1: Receive one product at $10/unit
|
||||
- 1.00
|
||||
- LOT 1
|
||||
- :math:`\frac{10}{1}`
|
||||
- $10
|
||||
* - Day 2: Receive another product at $20/unit
|
||||
- 1.00
|
||||
- LOT 2
|
||||
- :math:`\frac{10+20}{2}`
|
||||
- $15
|
||||
|
||||
.. figure:: valuation_by_lots/lip-gloss.png
|
||||
:alt: Show Cost on the product form.
|
||||
|
||||
As a result, the product form displays an average cost of $15 in the **Cost** field.
|
||||
|
||||
.. _inventory/product_management/valuation-cost-new:
|
||||
|
||||
Create new lot/serial number
|
||||
----------------------------
|
||||
|
||||
Creating a new lot/serial number through an :doc:`inventory adjustment
|
||||
<../../warehouses_storage/inventory_management/count_products>` assigns the same value as the cost
|
||||
on the product form.
|
||||
|
||||
To make an inventory adjustment, and assign a lot number, go to :menuselection:`Inventory app -->
|
||||
Operations --> Physical Inventory`. Then, click :guilabel:`New`.
|
||||
|
||||
In the new inventory adjustment line that appears, set the :guilabel:`Product`, create the
|
||||
:guilabel:`Lot/Serial Number`, set the :guilabel:`Counted Quantity`, and click :icon:`fa-floppy-o`
|
||||
:guilabel:`Apply`.
|
||||
|
||||
To view the valuation layer, go to :menuselection:`Inventory app --> Reporting --> Valuation`. The
|
||||
:guilabel:`Total Value` per unit matches the *Cost* on the product form.
|
||||
|
||||
.. example::
|
||||
Continuing the example in the table above, when the product cost is `$15`, the valuation for a
|
||||
newly-created `LOT3` is also be `$15`.
|
||||
|
||||
.. image:: valuation_by_lots/create-new.png
|
||||
:alt: Show inventory adjustment valuation.
|
||||
|
||||
.. _inventory/product_management/valuation-cost-existing:
|
||||
|
||||
Existing lot/serial number
|
||||
--------------------------
|
||||
|
||||
When adjusting the quantity of an existing lot/serial number, the value is based on the most recent
|
||||
valuation layer for that specific lot/serial number.
|
||||
|
||||
.. example::
|
||||
Continuing the example in the table above, the value for `LOT 1` is `$10`.
|
||||
|
||||
So, when the quantity is updated from `1.00` to `2.00`, the additional quantity is also valued at
|
||||
`$10`, reflecting the latest valuation layer for `LOT 1`.
|
||||
|
||||
.. figure:: valuation_by_lots/existing.png
|
||||
:alt: Show valuation of LOT 1 getting updated.
|
||||
|
||||
The inventory adjustment (top line) is valued the same as LOT 1 (bottom line).
|
||||
|
||||
.. _inventory/product_management/view-valuation:
|
||||
|
||||
View valuation
|
||||
==============
|
||||
|
||||
To find the average cost of a specific lot/serial number, go to :menuselection:`Inventory app -->
|
||||
Products --> Lots/Serial Numbers`, and select the desired record.
|
||||
|
||||
Both the :guilabel:`Cost` and :guilabel:`Average Cost` fields show a unit's average cost. The
|
||||
:guilabel:`Total Value` reflects the total on-hand value for that lot/serial number.
|
||||
|
||||
.. important::
|
||||
Ensure the costing method is set to *First In First Out (FIFO)* or *Average Cost (AVCO)* to
|
||||
display the cost on this page.
|
||||
|
||||
.. figure:: valuation_by_lots/lot.png
|
||||
:alt: Show cost of the lot/serial number.
|
||||
|
||||
Lot form, displaying **Cost** field. The **Valuation** smart button is in the top-right.
|
||||
|
||||
Valuation layers of a lot/serial number can be viewed through the :ref:`valuation report
|
||||
<inventory/product_management/valuation-report>`, or by clicking the lot/serial number's
|
||||
:guilabel:`Valuation` smart button. These detailed, line-by-line records can help determine how each
|
||||
inventory move of the specific lot/serial number affects its valuation.
|
||||
|
||||
.. _inventory/product_management/valuation-report:
|
||||
|
||||
Valuation report
|
||||
----------------
|
||||
|
||||
Display the valuation of lots and serial numbers in the database by going to
|
||||
:menuselection:`Inventory app --> Reporting --> Valuation`.
|
||||
|
||||
On the resulting :guilabel:`Stock Valuation` report, click the search bar, and in the
|
||||
:icon:`oi-group` :guilabel:`Group By` section of the resulting drop-down menu, select
|
||||
:guilabel:`Lot/Serial number`.
|
||||
|
||||
.. tip::
|
||||
Click the :icon:`fa-plus` :guilabel:`(plus)` icon to the right of a collapsed lot number line to
|
||||
:ref:`manually modify the cost <inventory/product_management/update-unit-price>`.
|
||||
|
||||
This is useful for adjusting individual lot prices when a purchase order or bill includes
|
||||
multiple lots/serial numbers, as initial prices are identical upon reception.
|
||||
|
||||
.. image:: valuation_by_lots/stock-valuation.png
|
||||
:alt: Show valuation report, by lots.
|
||||
|
||||
Valuation smart button
|
||||
----------------------
|
||||
|
||||
To access a filtered part of the *Stock Valuation* report, specific to a lot or serial number, go to
|
||||
:menuselection:`Inventory app --> Products --> Lots/Serial Numbers`, and select the desired item.
|
||||
|
||||
On the :guilabel:`Lot/Serial Numbers` page, click the :guilabel:`Valuation` smart button.
|
||||
|
||||
.. figure:: valuation_by_lots/lot-stock-valuation.png
|
||||
:alt: All stock moves relating to `LOT 1`.
|
||||
|
||||
All stock moves that affect the valuation of `LOT 1`.
|
||||
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 26 KiB |
@@ -143,6 +143,8 @@ deliveries or manufacturing orders.
|
||||
:align: center
|
||||
:alt: Internal transfer form for products ordered from vendor.
|
||||
|
||||
.. _inventory/shipping_receiving/two-step-delivery:
|
||||
|
||||
Process delivery order in two steps (pick + ship)
|
||||
=================================================
|
||||
|
||||
|
||||
@@ -1,19 +1,21 @@
|
||||
.. _use-routes:
|
||||
|
||||
==========================
|
||||
Routes and push/pull rules
|
||||
==========================
|
||||
|
||||
In inventory management, the supply chain strategy determines when products should be
|
||||
purchased/manufactured, delivered to distribution centers, and made available to the retail
|
||||
channel.
|
||||
*Routes* in Odoo control the movement of products between different locations, whether internal or
|
||||
external, using push and pull rules. Once set up, these rules help automate the logistics of product
|
||||
movement based on specific conditions.
|
||||
|
||||
In Odoo, a product's supply chain strategy can be configured using *Routes*, which feature *Pull
|
||||
and Push Rules*. Once everything is properly configured, the Inventory app can automatically
|
||||
generate transfers following the configured push/pull rules.
|
||||
.. seealso::
|
||||
- `Odoo Tutorials: Routes <https://www.youtube.com/watch?v=qkhDUezyZuc>`_
|
||||
- :doc:`Standard routes in Odoo <../daily_operations>`
|
||||
|
||||
Inside the warehouse
|
||||
====================
|
||||
.. note::
|
||||
Routes are applicable on products, product categories, shipping methods, :ref:`packagings
|
||||
<inventory/product_management/route-on-packaging>`, and on the sales order line.
|
||||
|
||||
About routes and terminology
|
||||
============================
|
||||
|
||||
In a generic warehouse, there are receiving docks, a quality control area, storage locations,
|
||||
picking and packing areas, and shipping docks. All products go through all these locations. As the
|
||||
@@ -42,58 +44,56 @@ boxes, and conveyor belts bring them to the shipping docks, ready to be delivere
|
||||
:align: center
|
||||
:alt: View of a generic pull from rule when preparing deliveries.
|
||||
|
||||
Pull rules
|
||||
==========
|
||||
|
||||
With *Pull Rules*, a demand for some products triggers procurements, while *Push Rules* are
|
||||
triggered by products arriving in a specific location.
|
||||
|
||||
Pull Rules are used to fulfill a sales order. Odoo generates a need at the *Customer Location* for
|
||||
each product in the order. Because pull rules are triggered by a need, Odoo looks for a pull rule
|
||||
defined on the *Customer Location*.
|
||||
|
||||
In this case, a "delivery order" pull rule that transfers products from the *Shipping Area* to the
|
||||
*Customer Location* is found, and a transfer between the two locations is created.
|
||||
|
||||
Then, Odoo finds another pull rule that tries to fulfill the need for the *Shipping Area*: the
|
||||
"packing" rule that transfers products from the *Packing Area* to the *Shipping Area*. Finally,
|
||||
other pull rules are triggered until a transfer between the *Stock* and the *Picking Area* is
|
||||
created.
|
||||
|
||||
.. note::
|
||||
All these product transfers are automatically generated by Odoo based on the pull rules, starting
|
||||
from the end (the customer location) and going backward (the stock warehouse). While working, the
|
||||
operator processes these transfers in the opposite order: first the picking, then the packing,
|
||||
and finally the delivery order.
|
||||
|
||||
Push rules
|
||||
==========
|
||||
----------
|
||||
|
||||
On the other hand, *Push Rules* are much easier to understand. Instead of generating documents
|
||||
based on needs, they are triggered in real time when products arrive in a specific location. Push
|
||||
rules basically say: "when a product arrives at a specific location, move it to another location."
|
||||
|
||||
An example of a push rule would be: when a product arrives in the *Receipt Area*, move it to the
|
||||
*Storage Location*. As different push rules can be applied to different products, the user can
|
||||
assign different storage locations for different products.
|
||||
|
||||
Another push rule could be: when products arrive at a location, move them to the *Quality Control
|
||||
Area*. Then, once the quality check is done, move them to their *Storage Location*.
|
||||
Push rules are used to *supply products into a storage locations* as soon as they arrive at a
|
||||
specific receiving location.
|
||||
|
||||
.. note::
|
||||
Push rules can only be triggered if there are no pull rules that have already generated the
|
||||
product transfers.
|
||||
|
||||
.. important::
|
||||
Sets of push/pull rules like those are called *Routes*. The grouping on the rule decides if
|
||||
products are grouped in the same transfer or not. For example, during the picking operation, all
|
||||
orders and their products are grouped in one transfer, whereas the packing operation respects the
|
||||
grouping per customer order.
|
||||
In a :doc:`one-step receipt route <receipts_delivery_one_step>`, which uses one push rule, when a
|
||||
product arrives in the warehouse, a push rule can automatically transfer it to the *Storage
|
||||
Location*. Different push rules can be applied to different products, allowing for customized
|
||||
storage locations.
|
||||
|
||||
.. figure:: use_routes/push-rule.png
|
||||
:align: center
|
||||
:alt: Rule for a Receive in one step route.
|
||||
|
||||
Push rule for the 'Receive in one step' route.
|
||||
|
||||
For more information about configuring rules, skip to the :ref:`Configure rules section
|
||||
<inventory/shipping_receiving/configure-rules>`.
|
||||
|
||||
Pull rules
|
||||
----------
|
||||
|
||||
Pull rules trigger product moves on demand, such as a sales order or a :doc:`need to restock
|
||||
<../../warehouses_storage/replenishment/reordering_rules>`.
|
||||
|
||||
Pull rules work backward from the demand location. For example, in a :ref:`two-step delivery
|
||||
<inventory/shipping_receiving/two-step-delivery>` route, where items move from *Stock* to *Output*
|
||||
before being delivered to the *Customer Location*, the pull rule first creates a transfer from
|
||||
*Output* to the customer. If the product is not at *Output*, another pull rule creates a transfer
|
||||
from *Stock* to *Output*. The warehouse workers then process these transfers in the reverse order:
|
||||
picking, then shipping.
|
||||
|
||||
.. figure:: use_routes/pull-rule.png
|
||||
:align: center
|
||||
:alt: Example pull rule.
|
||||
|
||||
Pull rules for the 'Deliver in two steps' route.
|
||||
|
||||
For more information about configuring rules, skip to the :ref:`Configure rules section
|
||||
<inventory/shipping_receiving/configure-rules>`.
|
||||
|
||||
.. _use-routes/routes-rules:
|
||||
|
||||
Use routes and rules
|
||||
====================
|
||||
Configuration
|
||||
=============
|
||||
|
||||
Since *Routes* are a collection of *Push and Pull Rules*, Odoo helps you manage advanced route
|
||||
configurations such as:
|
||||
@@ -221,6 +221,8 @@ section, select the :guilabel:`Routes`.
|
||||
.. important::
|
||||
Rules must be set on the route in order for the route to work.
|
||||
|
||||
.. _inventory/shipping_receiving/configure-rules:
|
||||
|
||||
Rules
|
||||
~~~~~
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 5.9 KiB |
@@ -30,30 +30,27 @@ The following is a list of available shipping connectors in Odoo:
|
||||
- Region availability
|
||||
* - :doc:`FedEx <fedex>`
|
||||
- All
|
||||
* - :doc:`DHL Express* <dhl_credentials>`
|
||||
* - :doc:`DHL Express <dhl_credentials>`
|
||||
- All
|
||||
* - :doc:`UPS <ups_credentials>`
|
||||
- All
|
||||
* - US Postal Service
|
||||
- United States of America
|
||||
* - :doc:`Sendcloud <sendcloud_shipping>`
|
||||
- :ref:`EU** <inventory/shipping_receiving/sendcloud-eu>`
|
||||
* - :doc:`Bpost <bpost>`
|
||||
- Some European countries (see details below)
|
||||
* - Bpost
|
||||
- Belgium
|
||||
* - Easypost
|
||||
- North America
|
||||
* - Shiprocket
|
||||
- India
|
||||
* - :doc:`Starshipit <starshipit_shipping>`
|
||||
- Australasia
|
||||
|
||||
.. _inventory/shipping_receiving/sendcloud-eu:
|
||||
- Australia and New Zealand
|
||||
|
||||
.. important::
|
||||
Other services from DHL are **not** supported.
|
||||
|
||||
\* Other services from DHL are **not** supported.
|
||||
|
||||
** Sendcloud currently supports shipping **from** Austria, Belgium, France, Germany, Italy, the
|
||||
Sendcloud currently supports shipping **from** Austria, Belgium, France, Germany, Italy, the
|
||||
Netherlands, Spain, and the United Kingdom, and **to** any European country.
|
||||
|
||||
Configuration
|
||||
|
||||
@@ -206,4 +206,3 @@ on the product form.
|
||||
replenishment/reordering_rules
|
||||
replenishment/lead_times
|
||||
replenishment/resupply_warehouses
|
||||
replenishment/warehouse_replenishment_transfer
|
||||
|
||||
@@ -26,6 +26,8 @@ current stock level of the product being ordered.
|
||||
|
||||
Finally, click :guilabel:`Save` to save the change.
|
||||
|
||||
.. _inventory/warehouses_storage/unarchive-mto:
|
||||
|
||||
Unarchive MTO route
|
||||
===================
|
||||
|
||||
|
||||
@@ -95,6 +95,8 @@ For advanced usage of reordering rules, learn about the following reordering rul
|
||||
- :ref:`Visibility days <inventory/product_management/visibility-days>`
|
||||
- :ref:`Route <inventory/product_management/route>`
|
||||
|
||||
.. _inventory/warehouses_storage/zero-zero:
|
||||
|
||||
0/0/1 reordering rule
|
||||
---------------------
|
||||
|
||||
|
||||
@@ -1,70 +1,172 @@
|
||||
===============================
|
||||
Resupply from another warehouse
|
||||
===============================
|
||||
=============================
|
||||
Inter-warehouse replenishment
|
||||
=============================
|
||||
|
||||
A common use case for multiple warehouses is to have one central warehouse that resupplies multiple
|
||||
shops, and in this case, each shop is considered a local warehouse. When a shop wants to replenish
|
||||
a product, the product is ordered to the central warehouse. Odoo allows the user to easily set
|
||||
which warehouse(s) can resupply another warehouse.
|
||||
.. |MTO| replace:: :abbr:`MTO (Make to Order)`
|
||||
|
||||
When a business operates multiple locations, such as warehouses, retail shops, or manufacturing
|
||||
facilities, resupplying stock from a central warehouse is sometimes necessary. Odoo uses a *Route*
|
||||
configuration that enables locations to replenish from a central distribution center, automatically
|
||||
generating *inter-warehouse transfers*. Odoo :guilabel:`Inventory` manages these transfers to keep
|
||||
stores in stock.
|
||||
|
||||
This guide explains how to conduct inter-warehouse transfers using two replenishment strategies:
|
||||
|
||||
#. :ref:`Make to order (MTO) <inventory/warehouses_storage/MTO>`
|
||||
#. :ref:`Reordering rule <inventory/warehouses_storage/reordering-rule>`
|
||||
|
||||
.. seealso::
|
||||
:doc:`Difference between MTO and reordering rules <../replenishment>`
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
To resupply from another warehouse, first go to :menuselection:`Inventory --> Configuration -->
|
||||
Settings --> Warehouse` and activate :guilabel:`Multi-Step Routes`. Then, click :guilabel:`Save` to
|
||||
apply the setting.
|
||||
The initial configuration for both replenishment strategies is the same. First go to
|
||||
:menuselection:`Inventory app --> Configuration --> Settings`. In the :guilabel:`Warehouse` section,
|
||||
activate :guilabel:`Storage Locations`. Then, click :guilabel:`Save` to apply the setting.
|
||||
|
||||
.. image:: resupply_warehouses/virtual-warehouses-settings.png
|
||||
.. image:: resupply_warehouses/storage-locations.png
|
||||
:align: center
|
||||
:alt: Enable Multi-Step Routes in Inventory settings.
|
||||
:alt: Enable Storage Locations in Inventory settings.
|
||||
|
||||
View all the configured warehouses by going to :menuselection:`Inventory --> Configuration -->
|
||||
Warehouses`.
|
||||
Warehouses
|
||||
----------
|
||||
|
||||
Create a new warehouse by clicking :guilabel:`Create`. Then, give the warehouse a name and a
|
||||
:guilabel:`Short Name`. Finally, click :guilabel:`Save` to finish creating the warehouse.
|
||||
Configure the settings for the central warehouse and connecting storage locations by going to
|
||||
:menuselection:`Inventory app --> Configuration --> Warehouses`.
|
||||
|
||||
After that, go back to the :guilabel:`Warehouses` page and open the warehouse that will be
|
||||
resupplied by the second warehouse. Then, click :guilabel:`Edit`. In the :guilabel:`Warehouse
|
||||
Configuration` tab, locate the :guilabel:`Resupply From` field, and check the box next to the
|
||||
second warehouse's name. If the warehouse can be resupplied by more than one warehouse, make sure
|
||||
to check those warehouses' boxes too. Finally, click :guilabel:`Save` to apply the setting. Now,
|
||||
Odoo knows which warehouses can resupply this warehouse.
|
||||
.. important::
|
||||
Each central warehouse and other locations *must* have its own warehouse. For example, each shop
|
||||
is considered a local warehouse.
|
||||
|
||||
.. image:: resupply_warehouses/resupply-from-second-warehouse.png
|
||||
Select an existing warehouse, or create a new one to be resupplied from the central warehouse, by
|
||||
clicking :guilabel:`New`. Then, give the warehouse a name and a :guilabel:`Short Name`, which will
|
||||
appear on that warehouse's transfers.
|
||||
|
||||
In the :guilabel:`Warehouse Configuration` tab, locate the :guilabel:`Resupply From` field. Check
|
||||
the box next to the central warehouse's name. If the warehouse can be resupplied by more than one
|
||||
warehouse, make sure to check those warehouses' boxes too. Now, Odoo knows which warehouses can
|
||||
resupply this warehouse.
|
||||
|
||||
.. example::
|
||||
The central warehouse that will supply the shops is called `Central warehouse`. The
|
||||
:guilabel:`Resupply From` field is set to this warehouse on the shop's warehouse configuration
|
||||
page.
|
||||
|
||||
.. seealso::
|
||||
:doc:`../inventory_management/warehouses`
|
||||
|
||||
.. image:: resupply_warehouses/warehouse.png
|
||||
:align: center
|
||||
:alt: Supply one warehouse with another in the Warehouse Configuration tab.
|
||||
|
||||
Set route on a product
|
||||
======================
|
||||
----------------------
|
||||
|
||||
After configuring which warehouse(s) to resupply from, a new route is now available on all product
|
||||
forms. The new route appears as :guilabel:`Supply Product from [Warehouse Name]` under the
|
||||
:guilabel:`Inventory` tab on a product form. Use the :guilabel:`Supply Product from [Warehouse
|
||||
Name]` route with a reordering rule or the make to order (MTO) route to replenish stock by moving
|
||||
the product from one warehouse to another.
|
||||
Products must also be configured properly in order for them to be transferred between warehouses.
|
||||
|
||||
.. image:: resupply_warehouses/product-resupply-route-settings.png
|
||||
:align: center
|
||||
:alt: Route setting which enables a product to resupplied from a second warehouse.
|
||||
Go to :menuselection:`Inventory app --> Products --> Products` and select the desired product.
|
||||
|
||||
When a product's reordering rule is triggered and the product has the :guilabel:`Supply Product
|
||||
from [Warehouse Name]` route set, Odoo automatically creates two pickings. One picking is a
|
||||
*delivery order* from the second warehouse, which contains all the necessary products, and the
|
||||
second picking is a *receipt* with the same products for the main warehouse. The product move from
|
||||
the second warehouse to the main warehouse is fully tracked in Odoo.
|
||||
In the :guilabel:`Inventory` tab, the new route appears as :guilabel:`X: Supply Product from Y` in
|
||||
the :guilabel:`Routes` section, where 'X' is the store's warehouse that receives products, and 'Y'
|
||||
is the warehouse that sends products.
|
||||
|
||||
On the picking/transfer records created by Odoo, the :guilabel:`Source Document` is the product's
|
||||
reordering rule. The location between the delivery order and the receipt is a transit location.
|
||||
Tick the :guilabel:`X: Supply Product from Y` checkbox, which is intended to be used with the |MTO|
|
||||
route or a reordering rule to replenish stock by moving the product from one warehouse to another.
|
||||
Proceed to the dedicated sections below to continue the process.
|
||||
|
||||
.. image:: resupply_warehouses/resupply-receipts-from-reordering-rule.png
|
||||
:align: center
|
||||
:alt: A reordering rule automatically creates two receipts for stock between warehouses.
|
||||
.. _inventory/warehouses_storage/MTO:
|
||||
|
||||
.. image:: resupply_warehouses/second-warehouse-delivery-order.png
|
||||
:align: center
|
||||
:alt: A warehouse order for resupplying one warehouse's stock with another.
|
||||
MTO
|
||||
~~~
|
||||
|
||||
To replenish products using the make-to-order method, go to the product form and ensure the
|
||||
:ref:`MTO route is unarchived <inventory/warehouses_storage/unarchive-mto>`, so it appears in the
|
||||
:guilabel:`Routes` section of the :guilabel:`Inventory` tab.
|
||||
|
||||
With the resupply and |MTO| routes ticked, jump to the section titled: :ref:`Replenish from another
|
||||
warehouse <inventory/warehouses_storage/resupply-workflow>`.
|
||||
|
||||
.. example::
|
||||
The product, sold at the warehouse, `Store`, is resupplied from the central warehouse, named
|
||||
`YourCompany`. To replenish the product using |MTO|, the following routes are selected:
|
||||
|
||||
- :guilabel:`Store: Supply Product from YourCompany`
|
||||
- :guilabel:`Replenish on Order (MTO)`
|
||||
|
||||
.. image:: resupply_warehouses/resupply-route.png
|
||||
:align: center
|
||||
:alt: Route setting which enables a product to resupplied from a second warehouse.
|
||||
|
||||
.. _inventory/warehouses_storage/reordering-rule:
|
||||
|
||||
Reordering rule
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
To replenish products using reordering rules, first ensure the :guilabel:`X: Supply Product from Y`
|
||||
route is selected in the :guilabel:`Inventory` tab of the product form.
|
||||
|
||||
Then, create a reordering rule to automate replenishment by clicking the :guilabel:`Reordering
|
||||
Rules` smart button.
|
||||
|
||||
Click :guilabel:`New`, and set:
|
||||
|
||||
- :guilabel:`Location`: the stock location of the retail store. For example, `SHOP/Stock`.
|
||||
- :guilabel:`Route`: :guilabel:`X: Supply Product from Y`.
|
||||
- :guilabel:`Min Quantity` and :guilabel:`Max Quantity` to trigger automatic stock transfers when
|
||||
inventory falls below the set threshold.
|
||||
|
||||
.. seealso::
|
||||
:doc:`reordering_rules`
|
||||
|
||||
.. example::
|
||||
A :ref:`0/0 reordering rule <inventory/warehouses_storage/zero-zero>` to replenish the shop's
|
||||
warehouse is created, with the :guilabel:`Location` set to `SHOP/Stock`, and the
|
||||
:guilabel:`Route` set to :guilabel:`Store: Resupply from YourCompany`.
|
||||
|
||||
.. image:: resupply_warehouses/reordering-rule.png
|
||||
:align: center
|
||||
:alt: Show reordering rule configurations.
|
||||
|
||||
.. _inventory/warehouses_storage/resupply-workflow:
|
||||
|
||||
Replenish one warehouse from another
|
||||
====================================
|
||||
|
||||
After completing the setup, trigger replenishment using one of several methods, such as:
|
||||
|
||||
- Navigate to the product form of the product that is resupplied from another warehouse.
|
||||
|
||||
Click the :guilabel:`Replenish` button on the top-left of the product page. In the pop-up window,
|
||||
set the warehouse to the retail shop, (e.g. `Store`), and click :guilabel:`Confirm`.
|
||||
|
||||
.. image:: resupply_warehouses/replenish.png
|
||||
:align: center
|
||||
:alt: Replenish pop-up window on the product form.
|
||||
|
||||
- Create a quotation, and in the :guilabel:`Other Info` tab, set the :guilabel:`Warehouse` to the
|
||||
retail shop (e.g. `Store`), when selling the product makes the on-hand quantity of the product go
|
||||
below the minimum set on the reordering rule.
|
||||
|
||||
.. image:: resupply_warehouses/warehouse-field.png
|
||||
:align: center
|
||||
:alt: Create a quote at the store.
|
||||
|
||||
Once triggered, Odoo creates two transfers: One is a *delivery order* from the central, supplying
|
||||
warehouse, which contains all the necessary products to the store, and the second is a *receipt* at
|
||||
the shop, from the main warehouse.
|
||||
|
||||
While in transit, the product is located at `Physical Locations/Inter-warehouse transit`.
|
||||
|
||||
.. example::
|
||||
A sales order for the product at the shop is created. To replenish the product at the shop and
|
||||
ship it from there, Odoo generates a delivery order from the central warehouse's stock,
|
||||
`WH/Stock` to the shop's warehouse `SHOP/Stock`. While the products are traveling between
|
||||
warehouses, they are in `Physical Locations/Inter-warehouse transit`.
|
||||
|
||||
The final delivery order is from the shop to the customer's delivery address, and is not
|
||||
pertinent to the workflow in this guide.
|
||||
|
||||
.. image:: resupply_warehouses/transfers.png
|
||||
:alt: Show shipments from warehouse to store.
|
||||
|
||||
.. image:: resupply_warehouses/second-warehouse-stock-receipt.png
|
||||
:align: center
|
||||
:alt: A receipt for stock received to one warehouse from another.
|
||||
|
||||
|
After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 14 KiB |
@@ -1,150 +0,0 @@
|
||||
========================================================
|
||||
Transfer products between warehouses using replenishment
|
||||
========================================================
|
||||
|
||||
For companies that use multiple warehouses, it is often necessary to transfer items between them.
|
||||
This is referred to as an *inter-warehouse transfer*. Odoo *Inventory* handles the administrative
|
||||
process of inter-warehouse transfers to ensure that inventory counts remain accurate during and
|
||||
after the transfer. This document will detail the method for conducting an inter-warehouse transfer
|
||||
using replenishment.
|
||||
|
||||
Configure warehouses for inter-warehouse replenishment
|
||||
======================================================
|
||||
|
||||
First, ensure the :guilabel:`Multi-Step Routes` setting is enabled by navigating to
|
||||
:menuselection:`Inventory --> Configuration --> Settings`, and then check the box under the
|
||||
:guilabel:`Warehouse` tab. This will provide additional configuration options when creating a second
|
||||
warehouse that are needed for inter-warehouse replenishment.
|
||||
|
||||
By default, Odoo comes with a main warehouse already configured. If an additional warehouse has not
|
||||
already been created, do so now from the :guilabel:`Inventory` module by selecting
|
||||
:menuselection:`Configuration --> Warehouses --> Create`. Otherwise, select the warehouse that
|
||||
products will be transferred to from the :guilabel:`Warehouses` page and then click :guilabel:`Edit`
|
||||
to change its settings. Configure the warehouse as follows:
|
||||
|
||||
- :guilabel:`Warehouse`: choose a name that is not already being used for another warehouse (e.g.
|
||||
`Alternative Warehouse`)
|
||||
- :guilabel:`Short Name`: choose a short name by which the warehouse will be identified (e.g.
|
||||
`ALT_WH`)
|
||||
|
||||
Click :guilabel:`Save` and the new warehouse will be created. In addition, a new :guilabel:`Resupply
|
||||
From` field will appear on the warehouse's form. Click :guilabel:`Edit` and then check the box next
|
||||
to the warehouse that will be used to resupply the warehouse that is currently being configured.
|
||||
|
||||
.. image:: warehouse_replenishment_transfer/new-warehouse-configuration.png
|
||||
:align: center
|
||||
:alt: A warehouse settings form configured to allow resupplying between warehouses.
|
||||
|
||||
.. note::
|
||||
For the purposes of this demonstration, the warehouse that products are transferred from
|
||||
(outgoing) will be titled "San Francisco", and the warehouse that products are transferred to
|
||||
(incoming) will be titled "San Francisco 2".
|
||||
|
||||
Configure products for inter-warehouse replenishment
|
||||
====================================================
|
||||
|
||||
Products must also be configured properly in order for them to be transferred between warehouses.
|
||||
Navigate to :menuselection:`Inventory --> Products --> Products` and select an existing product or
|
||||
:guilabel:`Create` a new one, if necessary.
|
||||
|
||||
Then, on the product form, go to the :guilabel:`Inventory` tab and enable the checkbox for
|
||||
:guilabel:`X: Supply Product from Y`, with *X* being the warehouse receiving the transferred
|
||||
products and *Y* being the warehouse that products are transferred from.
|
||||
|
||||
.. image:: warehouse_replenishment_transfer/product-transfer-configuration.png
|
||||
:align: center
|
||||
:alt: Enable the checkbox to resupply one warehouse from another.
|
||||
|
||||
Replenish one warehouse from another
|
||||
====================================
|
||||
|
||||
Starting in the :menuselection:`Inventory` module, select :menuselection:`Products --> Products` and
|
||||
then choose the product that will be replenished. Click the :guilabel:`Replenish` button on the top
|
||||
left of the product page and fill out the pop-up form as follows:
|
||||
|
||||
- :guilabel:`Quantity`: the number of units that will be sent to the warehouse being replenished
|
||||
- :guilabel:`Scheduled Date`: the date that the replenishment is scheduled to take place
|
||||
- :guilabel:`Warehouse`: the warehouse that will be replenished
|
||||
- :guilabel:`Preferred Routes`: select `X: Supply Product from Y`, with *X* being the warehouse to
|
||||
be replenished and *Y* being the warehouse that the product will be transferred from
|
||||
|
||||
.. image:: warehouse_replenishment_transfer/product-replenishment-form.png
|
||||
:align: center
|
||||
:alt: The form for replenishing a product.
|
||||
|
||||
Click :guilabel:`Confirm` and a delivery order will be created for the outgoing warehouse along with
|
||||
a receipt for the warehouse that will receive the product. Depending on the configuration settings
|
||||
for the outgoing and incoming warehouses, processing delivery orders and receipts will require
|
||||
between one and three steps. This document will detail how to process one-step deliveries and
|
||||
receipts.
|
||||
|
||||
Process the delivery order
|
||||
--------------------------
|
||||
|
||||
The first stage of a replenishment order is processing the delivery from the warehouse that the
|
||||
product is being transferred from. On the :menuselection:`Inventory` dashboard, select the
|
||||
:guilabel:`X to Process` button on the :guilabel:`Delivery Orders` card for the outgoing warehouse,
|
||||
then the delivery order created for the replenishment. On the delivery order page, click the
|
||||
:guilabel:`Check Availability` button in the top left to reserve the quantity of the product to be
|
||||
transferred. Once the delivery has been dispatched, click the :guilabel:`Validate` button to
|
||||
register the quantities shipped.
|
||||
|
||||
.. image:: warehouse_replenishment_transfer/delivery-orders-card.png
|
||||
:align: center
|
||||
:alt: The delivery orders card for the outgoing warehouse.
|
||||
|
||||
Process the receipt
|
||||
-------------------
|
||||
|
||||
Once the goods arrive at the incoming warehouse, the receipt created for that warehouse must be
|
||||
processed as well. Return to the :menuselection:`Inventory` dashboard and select the :guilabel:`X to
|
||||
Process` button on the :guilabel:`Receipts` card for the incoming warehouse, then the receipt
|
||||
created for the replenishment. On the receipt page, click the :guilabel:`Validate` button in the top
|
||||
left of the page to register the quantities received.
|
||||
|
||||
.. image:: warehouse_replenishment_transfer/receipts-card.png
|
||||
:align: center
|
||||
:alt: The delivery orders card for the outgoing warehouse.
|
||||
|
||||
After processing the receipt, the products transferred will now appear in the inventory of the
|
||||
incoming warehouse. The stock numbers for both warehouses can be viewed by returning to the product
|
||||
page and selecting the :guilabel:`X Units On Hand` button at the top of the screen.
|
||||
|
||||
Automate inter-warehouse replenishment
|
||||
======================================
|
||||
|
||||
Using reordering rules, it is possible to automate the process of replenishing one warehouse from
|
||||
another.
|
||||
|
||||
To get started, navigate to :menuselection:`Inventory --> Products --> Products`, and then
|
||||
choose the product that will be replenished. From the product page, select the :guilabel:`Reordering
|
||||
Rules` smart button at the top of the form, and then on the next page, click :guilabel:`Create` to
|
||||
configure the form as follows:
|
||||
|
||||
- :guilabel:`Location`: the location that the reordering rule will replenish when triggered, in this
|
||||
case, the incoming warehouse
|
||||
- :guilabel:`Min Quantity`: when the quantity on hand at the incoming warehouse falls below this
|
||||
number, the reordering rule will be triggered
|
||||
- :guilabel:`Max Quantity`: when the reordering rule is triggered, the product will be replenished
|
||||
at the incoming warehouse up to this quantity
|
||||
- :guilabel:`Multiple Quantity`: specify if the product should be replenished in batches of a
|
||||
certain quantity; for example, 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:: warehouse_replenishment_transfer/reordering-rule-configuration.png
|
||||
:align: center
|
||||
:alt: A fully configured reordering rule.
|
||||
|
||||
Finish by clicking :guilabel:`Save` and the reordering rule will be created. Now, when the scheduler
|
||||
runs automatically each day, a transfer will be created for each reordering rule that has been
|
||||
triggered.
|
||||
|
||||
.. tip::
|
||||
To manually trigger reordering rules, start from the :menuselection:`Inventory` module and select
|
||||
:menuselection:`Operation --> Run Scheduler`, then click the green :guilabel:`Run Scheduler`
|
||||
button in the pop-up that appears.
|
||||
|
||||
After the scheduler runs, a delivery order and receipt will be created for the outgoing and incoming
|
||||
warehouses, respectively. Both the delivery order and receipt should be processed using the same
|
||||
method as detailed above.
|
||||
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 10 KiB |
@@ -33,12 +33,17 @@ name. Then, go to the :guilabel:`Inventory` tab, and enable the :guilabel:`Buy`
|
||||
:align: center
|
||||
:alt: Required configuration for purchasable products.
|
||||
|
||||
.. _purchase/manage_deals/vendor-pricelist:
|
||||
|
||||
Vendor pricelist
|
||||
----------------
|
||||
|
||||
In the :guilabel:`Purchase` tab of the product form, input the vendor and their price, to have this
|
||||
information auto-populate on an |RFQ| each time the product is listed.
|
||||
|
||||
.. seealso::
|
||||
:doc:`../products/pricelist`
|
||||
|
||||
Default columns include :guilabel:`Quantity`, :guilabel:`Price`, and :guilabel:`Delivery Lead Time`,
|
||||
but other columns like, :guilabel:`Product Variant` or :guilabel:`Discounts`, can also be enabled.
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ Products
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
products/pricelist
|
||||
products/reordering
|
||||
products/temporary_reordering
|
||||
products/uom
|
||||
|
||||
@@ -0,0 +1,256 @@
|
||||
=======================
|
||||
Import vendor pricelist
|
||||
=======================
|
||||
|
||||
Set vendor prices to auto-populate requests for quotations (RFQs) or purchase orders (POs) with the
|
||||
unit price, once the product is added, which reduces errors and saves time.
|
||||
|
||||
In Odoo, vendor pricelists can be :ref:`added individually <purchase/products/pricelist>` on the
|
||||
product form, or :ref:`imported in bulk <purchase/products/import-pricelist>`, via an XLSX or CSV
|
||||
file.
|
||||
|
||||
.. important::
|
||||
Please review this :doc:`import guide <../../../essentials/export_import_data>` before uploading
|
||||
vendor pricelists.
|
||||
|
||||
.. _purchase/products/pricelist:
|
||||
|
||||
On product form
|
||||
===============
|
||||
|
||||
To manually add the vendor price on the product form, go to the :menuselection:`Purchase app -->
|
||||
Products --> Products`, and click the desired product.
|
||||
|
||||
.. note::
|
||||
Product forms are accessible from multiple apps, such as **Sales**, **Inventory**, and
|
||||
**Manufacturing**.
|
||||
|
||||
In the :guilabel:`Purchase` tab of the product form, input the vendor and their price, to have this
|
||||
information auto-populate on a request for quotation each time the product is listed.
|
||||
|
||||
.. seealso::
|
||||
:ref:`Vendor pricelist on product form <purchase/manage_deals/vendor-pricelist>`
|
||||
|
||||
.. image:: pricelist/product-form-pricelist.png
|
||||
:alt: Vendor pricelist on product form.
|
||||
|
||||
.. _purchase/products/import-pricelist:
|
||||
|
||||
Import vendor pricelist
|
||||
=======================
|
||||
|
||||
To import vendor pricelists, ensure the XLSX or CSV file is accurately completed. The best way to
|
||||
obtain a correctly formatted template, including product names, references, and vendor details, is
|
||||
to first :ref:`export a pricelist <purchase/products/export-price>` from the database.
|
||||
|
||||
Modify the exported file, as needed, then import it back into the Odoo database.
|
||||
|
||||
.. _purchase/products/export-price:
|
||||
|
||||
Export pricelist
|
||||
----------------
|
||||
|
||||
To export a pricelist, go to :menuselection:`Purchase app --> Configuration --> Vendor Pricelists`.
|
||||
|
||||
On the page, tick the checkbox(es) for the desired vendor pricelists.
|
||||
|
||||
Then, click the :icon:`fa-cog` :guilabel:`Actions` button that appears, and choose :icon:`fa-upload`
|
||||
:guilabel:`Export` from the drop-down menu.
|
||||
|
||||
.. image:: pricelist/export.png
|
||||
:alt: Show selected exported fields, with the Export button visible.
|
||||
|
||||
In the resulting pop-up window, fields listed under the :guilabel:`Fields to export` section are
|
||||
included in the exported file. To add more fields, find the desired field in the
|
||||
:guilabel:`Available fields` section, and click the :icon:`fa-plus` :guilabel:`(plus)` icon to the
|
||||
right of the field.
|
||||
|
||||
.. note::
|
||||
To update to existing records, tick the :guilabel:`I want to update data (import-compatible
|
||||
export)` checkbox, and refer to the section on the :ref:`External ID
|
||||
<purchase/products/external-id>` field.
|
||||
|
||||
For details on commonly-used fields for importing vendor pricelists, see the :ref:`Common fields
|
||||
<purchase/products/common-fields>` section.
|
||||
|
||||
Select the desired :guilabel:`Export Format`: :guilabel:`XLSX` or :guilabel:`CSV`.
|
||||
|
||||
To save the selected fields as a template, click the :guilabel:`Template` field, and select
|
||||
:guilabel:`New template` from the drop-down menu. Type the name of the new template, and click the
|
||||
:icon:`fa-floppy-o` :guilabel:`(save)` icon. After that, the template is a selectable option when
|
||||
clicking the :guilabel:`Template` field.
|
||||
|
||||
Finally, click :guilabel:`Export`.
|
||||
|
||||
.. note::
|
||||
With :ref:`developer mode <developer-mode>` turned on, the column names of the exported file
|
||||
display the *field name* with the *technical name* in parenthesis.
|
||||
|
||||
.. example::
|
||||
.. figure:: pricelist/export-data.png
|
||||
:alt: Exporting vendor pricelist.
|
||||
|
||||
Export vendor pricelist in XLSX format. It includes :guilabel:`Product Template` and other
|
||||
fields in the :guilabel:`Fields to export` section.
|
||||
|
||||
.. _purchase/products/external-id:
|
||||
|
||||
External ID
|
||||
~~~~~~~~~~~
|
||||
|
||||
*External ID* is a unique identifier used to update existing vendor pricelists. Without it, imported
|
||||
records create new entries, instead of updating existing ones. Including this field in the XLSX or
|
||||
CSV, indicates the line replaces an existing vendor pricelist in the Odoo database.
|
||||
|
||||
.. example::
|
||||
.. figure:: pricelist/duplicate-values.png
|
||||
:alt: Show 'Ready Mat' appear twice.
|
||||
|
||||
`Ready Mat` appears twice because the external ID was omitted during the price update from
|
||||
`$790` to `$780`.
|
||||
|
||||
To look-up the :guilabel:`External ID` for a vendor pricelist, tick the :guilabel:`I want to update
|
||||
data (import-compatible export)` checkbox at the top of the :guilabel:`Export Data` pop-up window.
|
||||
|
||||
.. note::
|
||||
Selecting :guilabel:`External ID` from the :guilabel:`Available fields` section with the
|
||||
:guilabel:`I want to update data (import-compatible export)` checkbox ticked results in an export
|
||||
file with two columns containing the external ID.
|
||||
|
||||
.. _purchase/products/common-fields:
|
||||
|
||||
Common fields
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
Below is a list of commonly-used fields when importing vendor pricelists:
|
||||
|
||||
.. list-table:: Field name definitions
|
||||
:header-rows: 1
|
||||
|
||||
* - Field name
|
||||
- Used for
|
||||
- Field in Odoo database
|
||||
- Technical name of field
|
||||
* - Vendor
|
||||
- The only required field for creating a vendor pricelist record. This field specifies the
|
||||
vendor associated with the product.
|
||||
- :guilabel:`Vendor` field in the :ref:`vendor pricelist of the product form
|
||||
<purchase/products/pricelist>`.
|
||||
- `partner_id`
|
||||
* - Product Template
|
||||
- The Odoo product the vendor pricelist entry is related to.
|
||||
- :guilabel:`Product` field in the vendor pricelist.
|
||||
- `product_tmpl_id`
|
||||
* - Quantity
|
||||
- The minimum quantity required to receive the product at the specified price.
|
||||
- :guilabel:`Quantity` field in the vendor pricelist. (If not visible, enable it by clicking
|
||||
the :icon:`oi-settings-adjust` :guilabel:`(settings)` icon, and tick the :guilabel:`Quantity`
|
||||
checkbox)
|
||||
- `min_qty`
|
||||
* - Unit Price
|
||||
- The purchase price for the product from the vendor.
|
||||
- :guilabel:`Price` field in the vendor pricelist.
|
||||
- `price`
|
||||
* - Delivery Lead Time
|
||||
- :ref:`Number of days <inventory/shipping_receiving/purchase-lt>` before receiving the
|
||||
product after confirming a purchase order.
|
||||
- :guilabel:`Delivery Lead Time` field on the vendor pricelist.
|
||||
- `delay`
|
||||
* - Sequence
|
||||
- Defines the order of vendors in the pricelist when multiple vendors are available. For
|
||||
example, if `Azure Interior` is listed first and Wood Corner second, their sequences would be
|
||||
`1` and `2`.
|
||||
- N/A
|
||||
- `sequence`
|
||||
* - Company
|
||||
- Name of company the product belongs to.
|
||||
- :guilabel:`Company` field in the vendor pricelist.
|
||||
- `company_id`
|
||||
* - :ref:`External ID <purchase/products/external-id>`
|
||||
- Unique ID of a record used to update existing vendor pricelists.
|
||||
- N/A
|
||||
- `id`
|
||||
|
||||
Import records
|
||||
--------------
|
||||
|
||||
With a template downloaded, fill out the XLSX or CSV file with the necessary information. After
|
||||
inputting everything, import the file back into the Odoo database, by going to
|
||||
:menuselection:`Purchase app --> Configuration --> Vendor Pricelists`.
|
||||
|
||||
On the page, click the :icon:`fa-cog` :guilabel:`(gear)` icon in the top-left corner. In the
|
||||
drop-down menu that appears, click :guilabel:`Import records`.
|
||||
|
||||
Then, click :guilabel:`Upload File` in the upper-left corner, and after selecting the XLSX or CSV
|
||||
file, confirm the correct fields, and click :guilabel:`Import`.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`../../../essentials/export_import_data`
|
||||
- :ref:`Common fields <purchase/products/common-fields>`
|
||||
|
||||
.. image:: pricelist/supplier-pricelist-example.png
|
||||
:alt: Upload file screen.
|
||||
|
||||
Formatting import file
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To understand how to format import files for vendor pricelists, consider the following example.
|
||||
|
||||
- `Storage Box` (:guilabel:`Reference`: `E-COM08`) is sold by `Wood Corner` for `$10`.
|
||||
- `Large Desk` (:guilabel:`Reference`: `E-COM09`) has no records in the vendor pricelist.
|
||||
|
||||
An import file is created to do the following:
|
||||
|
||||
- Update the price for `Wood Corner` from `$10` to `$13`.
|
||||
- Add pricelist for `Storage Box`: the vendor, `Ready Mat` intends to sell the product for `$14`.
|
||||
- Add pricelist for `Large Desk`: vendor is `Wood Corner`, price is `$1299`.
|
||||
- Add pricelist for `Large Desk`: vendor is `Azure Interior`, price is `$1399`.
|
||||
|
||||
.. list-table:: Vendor pricelist data
|
||||
:header-rows: 1
|
||||
|
||||
* - id
|
||||
- company_id
|
||||
- delay
|
||||
- price
|
||||
- product_tmpl_id
|
||||
- sequence
|
||||
- partner_id
|
||||
* - product.product_supplierinfo_3
|
||||
- My Company (San Francisco)
|
||||
- 3
|
||||
- 13.00
|
||||
- [E-COM08] Storage Box
|
||||
- 4
|
||||
- Wood Corner
|
||||
* -
|
||||
- My Company (San Francisco)
|
||||
- 3
|
||||
- 14.00
|
||||
- [E-COM08] Storage Box
|
||||
- 5
|
||||
- Ready Mat
|
||||
* -
|
||||
- My Company (San Francisco)
|
||||
- 2
|
||||
- 1299.00
|
||||
- [E-COM09] Large Desk
|
||||
- 6
|
||||
- Wood Corner
|
||||
* -
|
||||
- My Company (San Francisco)
|
||||
- 4
|
||||
- 1399.00
|
||||
- [E-COM09] Large Desk
|
||||
- 7
|
||||
- Azure Interior
|
||||
|
||||
.. note::
|
||||
The *technical field name* was used to create this information.
|
||||
|
||||
.. note::
|
||||
Download the sample files for reference:
|
||||
|
||||
- :download:`Sample XLSX import file <pricelist/pricelist-example.xlsx>`
|
||||
- :download:`Sample CSV import file <pricelist/pricelist-example.csv>`
|
||||
|
||||
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 17 KiB |
@@ -0,0 +1,5 @@
|
||||
"id","company_id","delay","price","product_tmpl_id","sequence","partner_id"
|
||||
"product.product_supplierinfo_3","My Company (San Francisco)","3","13.0","[E-COM08] Storage Box","4","Wood Corner"
|
||||
"","My Company (San Francisco)","3","14.4","[E-COM08] Storage Box","5","Ready Mat"
|
||||
"","My Company (San Francisco)","2","1299.0","[E-COM09] Large Desk","6","Wood Corner"
|
||||
"","My Company (San Francisco)","4","1399.0","[E-COM09] Large Desk","7","Azure Interior"
|
||||
|
|
After Width: | Height: | Size: 9.9 KiB |
|
After Width: | Height: | Size: 27 KiB |
@@ -15,6 +15,33 @@ shifting market trends.
|
||||
.. seealso::
|
||||
`Odoo Tutorials: Surveys <https://www.odoo.com/slides/surveys-62>`_
|
||||
|
||||
.. cards::
|
||||
|
||||
.. card:: Create surveys
|
||||
:target: surveys/create
|
||||
|
||||
Discover how to create surveys with Odoo.
|
||||
|
||||
.. card:: Scoring surveys
|
||||
:target: surveys/scoring
|
||||
|
||||
Learn how to create and analyze survey scores with Odoo.
|
||||
|
||||
.. card:: Create questions
|
||||
:target: surveys/questions
|
||||
|
||||
See how to create, configure, and customize all types of survey questions with Odoo.
|
||||
|
||||
.. card:: Live Session surveys
|
||||
:target: surveys/live_session
|
||||
|
||||
Find out everything there is to know about Odoo's unique Live Session surveys.
|
||||
|
||||
.. card:: Survey analysis
|
||||
:target: surveys/analysis
|
||||
|
||||
Explore the various ways to analyze surveys using Odoo's in-depth reporting pages.
|
||||
|
||||
Dashboard
|
||||
=========
|
||||
|
||||
@@ -185,6 +212,53 @@ and the columns depict the various activity types.
|
||||
A new survey cannot be created in this view, as it is solely for the purpose of creating and
|
||||
viewing scheduled activities.
|
||||
|
||||
Create surveys
|
||||
==============
|
||||
|
||||
Learn about all the different options and configurations that can be utilized when creating a survey
|
||||
in Odoo.
|
||||
|
||||
.. seealso::
|
||||
:doc:`surveys/create`
|
||||
|
||||
Scoring surveys
|
||||
===============
|
||||
|
||||
Discover how to measure a survey participant's performance, or overall satisfaction, with Odoo's
|
||||
detailed (and fully customizable) survey scoring options.
|
||||
|
||||
.. seealso::
|
||||
:doc:`surveys/scoring`
|
||||
|
||||
Create questions
|
||||
================
|
||||
|
||||
With Odoo *Surveys*, there are many question types and options to choose from, providing the ability
|
||||
to create any kind of unique survey, questionnarire, and/or certification.
|
||||
|
||||
.. seealso::
|
||||
:doc:`surveys/questions`
|
||||
|
||||
Live Session surveys
|
||||
====================
|
||||
|
||||
The *Live Session* survey option available in Odoo can enhance in-person demonstrations and
|
||||
presentations, where participants' real-time responses can be used to dictate where the conversation
|
||||
goes next.
|
||||
|
||||
.. seealso::
|
||||
:doc:`surveys/live_session`
|
||||
|
||||
Survey analysis
|
||||
===============
|
||||
|
||||
Once the surveys start to come in, it is time to analyze the responses from your participants.
|
||||
Fortuantely, the in-depth reporting pages and options available in Odoo *Surveys* provide countless
|
||||
ways to examine everything related to surveys, and their submitted responses.
|
||||
|
||||
.. seealso::
|
||||
:doc:`surveys/analysis`
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
|
||||
@@ -1,9 +1,284 @@
|
||||
:nosearch:
|
||||
:show-content:
|
||||
|
||||
========
|
||||
Calendar
|
||||
========
|
||||
|
||||
Odoo **Calendar** is a scheduling app that allows users to integrate a company's business flow into
|
||||
a single management platform. By integrating with the other apps in Odoo's ecosystem, **Calendar**
|
||||
allows users to schedule and organize meetings, schedule events, plan employee appraisals,
|
||||
coordinate projects, and more – all from the same platform.
|
||||
|
||||
Upon opening the :menuselection:`Calendar app`, users have an overview of their current meetings.
|
||||
The selected view option appears as a :guilabel:`Day`, :guilabel:`Week`, :guilabel:`Month`, or
|
||||
:guilabel:`Year` drop-down menu. Under the view options drop-down menu, users can also enable or
|
||||
disable :guilabel:`Show weekends`.
|
||||
|
||||
.. image:: calendar/calendar-overview.png
|
||||
:alt: Overview of Calendar app.
|
||||
|
||||
.. tip::
|
||||
Depending on the selected view option, users can click the :icon:`oi-arrow-left`
|
||||
:icon:`oi-arrow-right` :guilabel:`(left or right arrow)` buttons to switch between days, weeks,
|
||||
etc., and switch back to the current day with the :guilabel:`Today` button.
|
||||
|
||||
Sync third-party calendars
|
||||
--------------------------
|
||||
|
||||
Users can sync Odoo with existing :doc:`Outlook <calendar/outlook>` and/or
|
||||
:doc:`Google <calendar/google>` calendars, by heading to
|
||||
:menuselection:`Calendar app --> Configuration --> Settings`. From here, enter
|
||||
:guilabel:`Client ID` and :guilabel:`Client Secret`. There is also an option to pause
|
||||
synchronization by ticking the checkbox, or automating synchronization by keeping it blank.
|
||||
|
||||
Once the desired configurations are complete, be sure to click :guilabel:`Save` before moving on.
|
||||
|
||||
Events created in synced calendars automatically appear across the integrated platforms.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`Synchronize Outlook calendar with Odoo <calendar/outlook>`
|
||||
- :doc:`Synchronize Google calendar with Odoo <calendar/google>`
|
||||
|
||||
Create activities from chatter
|
||||
------------------------------
|
||||
|
||||
Instantly create new meetings anywhere in Odoo through an individual record's chatter, like
|
||||
in a **CRM** opportunity card or task in the **Projects** app.
|
||||
|
||||
From the chatter, click on the :guilabel:`Activities` button. In the :guilabel:`Schedule Activity`
|
||||
pop-up window, select the desired :guilabel:`Activity Type`, which populates a set of buttons,
|
||||
depending on the activity.
|
||||
|
||||
Activities that involve other schedules, like :guilabel:`Meeting` or :guilabel:`Call for Demo`, link
|
||||
to the **Calendar** app. Select one of these activities to link to the **Calendar** app, then hit
|
||||
:guilabel:`Open Calendar` to navigate back to the app. Alternatively, it is also possible to
|
||||
:guilabel:`Schedule & Mark as Done` to close out the activity, or select :guilabel:`Done & Schedule
|
||||
Next` to keep the :guilabel:`Schedule Activity` window open to create another.
|
||||
|
||||
.. seealso::
|
||||
:doc:`Schedule activities in Odoo <../essentials/activities>`
|
||||
|
||||
Plan an event
|
||||
-------------
|
||||
|
||||
To put an event on the calendar, open the :menuselection:`Calendar app`, and click into the target
|
||||
date. On the :guilabel:`New Event` pop-up window that appears, start by adding the event title.
|
||||
|
||||
.. image:: calendar/calendar-schedule-event.png
|
||||
:alt: Schedule an event window on Calendar app.
|
||||
|
||||
The target date auto-populates in the :guilabel:`Start` field. This can be changed by clicking
|
||||
into the date section, and selecting a date from the calendar. For multi-day events, select the end
|
||||
date in the second field, then click :guilabel:`Apply`.
|
||||
|
||||
Tick the :guilabel:`All Day` checkbox if there is no specific start or end time.
|
||||
|
||||
For events with specific start and stop times, ensure the :guilabel:`All Day` checkbox is unticked
|
||||
to enable time selection. With the :guilabel:`All Day` checkbox unticked, time selections appear in
|
||||
the :guilabel:`Start` field.
|
||||
|
||||
The signed-in user auto-populates as the first attendee. Additional :guilabel:`Attendees` can be
|
||||
added or created from here, as well.
|
||||
|
||||
For virtual meetings, copy and paste the URL into the space provided in the
|
||||
:guilabel:`Videocall URL` field. Or, click :icon:`fa-plus` :guilabel:`Odoo meeting` to create a
|
||||
link.
|
||||
|
||||
Next, either create the event by clicking :guilabel:`Save & Close`, or select :guilabel:`More
|
||||
Options` to further configure the event.
|
||||
|
||||
.. tip::
|
||||
Once the event is created, users can click into the virtual meeting directly from the calendar
|
||||
event to access more configuration options.
|
||||
|
||||
.. image:: calendar/calendar-new-meeting.png
|
||||
:alt: The full event form for a new calendar event.
|
||||
|
||||
The :guilabel:`Description` field allows users to add additional information and details about the
|
||||
meeting.
|
||||
|
||||
Click :guilabel:`More Options` to navigate to the meeting form, which provides additional
|
||||
configurations for the event:
|
||||
|
||||
- :guilabel:`Duration`: Define the length of the meeting in :guilabel:`hours`, or toggle the
|
||||
:guilabel:`All Day` switch.
|
||||
- :guilabel:`Recurrent`: Tick the checkbox to create a recurring meeting. Once selected, this
|
||||
opens new fields:
|
||||
|
||||
- :guilabel:`Timezone`: Select the timezone for which this meeting time is specified.
|
||||
- :guilabel:`Repeat`: Select the recurring period of this meeting. Depending on what type of
|
||||
recurrence has been selected, a subsequent field appears, in which users can indicate when the
|
||||
meeting should recur. For example, if :guilabel:`Monthly` is selected as the :guilabel:`Repeat`
|
||||
option, a new field appears, in which the user decides on what :guilabel:`Day of Month` the
|
||||
meeting should recur.
|
||||
- :guilabel:`Until`: Select the limited :guilabel:`Number of repetitions` this meeting should
|
||||
recur, the :guilabel:`End date` of when the recurrences should stop, or if the meetings should
|
||||
recur :guilabel:`Forever`.
|
||||
- :guilabel:`Tags`: Add tags to the event, like `Customer Meeting` or `Internal Meeting`. These can
|
||||
be searched and filtered in the **Calendar** app when organizing multiple events.
|
||||
- :guilabel:`Appointment`: Link existing or new appointments. These can be configured through the
|
||||
:ref:`Share Availabilities <calendar/share-availabilities>` button from the main **Calendar**
|
||||
dashboard.
|
||||
- :guilabel:`Privacy`: Toggle between visibility options to control who can view the event.
|
||||
- :guilabel:`Organizer`: This is defaulted to the current Odoo user. Select a new one from
|
||||
existing users, or create and edit a new user.
|
||||
- :guilabel:`Description`: Add additional information or details about the meeting.
|
||||
- :guilabel:`Reminders`: Select notification options to send to attendees. Choose a default
|
||||
notification, or configure new reminders.
|
||||
|
||||
Coordinate with teams' availability
|
||||
-----------------------------------
|
||||
|
||||
When scheduling an event for multiple users, on the **Calendar** app dashboard, tick the checkbox
|
||||
next to :guilabel:`Attendees` to view team members' availability. Tick (or untick) the checkbox next
|
||||
to listed users to show (or hide) individual calendars.
|
||||
|
||||
.. image:: calendar/calendar-attendees.png
|
||||
:alt: View of Attendees section on Calendar app.
|
||||
|
||||
.. _calendar/share-availabilities:
|
||||
|
||||
Share Availabilities
|
||||
--------------------
|
||||
|
||||
On the **Calendar** app main dashboard, click the :guilabel:`Share Availabilities` button at the top
|
||||
of the page. Next, click and drag to select the available times and dates on the calendar to add
|
||||
them as options in the invitation.
|
||||
|
||||
.. tip::
|
||||
To remove a selected time range, hover over the availability to click the :icon:`fa-trash`
|
||||
:guilabel:`(trash)` icon.
|
||||
|
||||
.. note::
|
||||
Within the :guilabel:`Share Availabilities` feature, selecting times is only possible on the
|
||||
*Day* calendar views.
|
||||
|
||||
Once availability has been selected, click the :icon:`fa-external-link` :guilabel:`Open` button to
|
||||
navigate to the associated appointment.
|
||||
|
||||
.. image:: calendar/calendar-meeting-share-availability.png
|
||||
:alt: Share availability window on Calendar app.
|
||||
|
||||
Several configuration options are available on the appointment form:
|
||||
|
||||
In the :guilabel:`Scheduling` field, set a minimum hour window to ensure appointments are confirmed
|
||||
a specified amount of time in advance. For example, set `01:00` to require attendees to confirm at
|
||||
least one hour before their appointment time.
|
||||
|
||||
In the :guilabel:`Allow Cancelling` field, set a maximum hour window before the appointment that
|
||||
attendees are able to cancel.
|
||||
|
||||
The :guilabel:`Availability on` field enables attendees to book :guilabel:`Users` or
|
||||
:guilabel:`Resources`, such as meeting rooms or tables. After selecting :guilabel:`Users` or
|
||||
:guilabel:`Resources`, type in the desired user or resource in the space below.
|
||||
|
||||
The :guilabel:`Front-End Display` field is used to choose :guilabel:`No Picture` or
|
||||
:guilabel:`Show Pictures` related to the selected user or resource on the appointment page.
|
||||
|
||||
If :guilabel:`Resources` has been selected in the :guilabel:`Availability on` field, users have an
|
||||
option to :guilabel:`Manage Capacities`.
|
||||
|
||||
Tick the checkbox to limit the maximum amount of people that can use the resource at the same time.
|
||||
|
||||
The :guilabel:`Assignment Method` field enables the order in which attendees book their time and
|
||||
user/resource:
|
||||
|
||||
- :guilabel:`Pick User/Resource then Time`
|
||||
- :guilabel:`Select Time then User/Resource`
|
||||
|
||||
If :guilabel:`Resources` has been selected in the :guilabel:`Availability On` field, a third option
|
||||
is available, :guilabel:`Select Time then auto-assign`.
|
||||
|
||||
Optionally, configure the following tabs:
|
||||
|
||||
- :ref:`calendar/appointment-schedule`
|
||||
- :ref:`calendar/appointment-options`
|
||||
- :ref:`calendar/appointment-questions`
|
||||
- :ref:`calendar/appointment-messages`
|
||||
|
||||
Click the :guilabel:`Preview` button to see how the appointment link looks for attendees.
|
||||
|
||||
Once the configurations are finished, click the :guilabel:`Share` button to generate a link to send
|
||||
directly, or click :guilabel:`Publish` to publish the appointment selection on the connected Odoo
|
||||
website.
|
||||
|
||||
.. _calendar/appointment-schedule:
|
||||
|
||||
Schedule tab
|
||||
~~~~~~~~~~~~
|
||||
|
||||
In the :guilabel:`Schedule` tab of the appointment form, time slots can be managed. The target date
|
||||
and time populate as the first time slots.
|
||||
|
||||
To add a new time slot, hit :guilabel:`Add a line`. Click into the new blank space under the
|
||||
:guilabel:`From` field, then select and enter the new target start date and time, respectively.
|
||||
Repeat under the new blank space under :guilabel:`To` to select and enter the new target end date
|
||||
and time.
|
||||
|
||||
.. _calendar/appointment-options:
|
||||
|
||||
Options tab
|
||||
~~~~~~~~~~~
|
||||
|
||||
The :guilabel:`Options` tab provides additional configurations:
|
||||
|
||||
- :guilabel:`Website`: Specify which website this meeting invitation will be published on.
|
||||
- :guilabel:`Timezone`: This defaults to the company's timezone selected in the **Settings** app.
|
||||
To change the timezone, select the desired option from the drop-down menu.
|
||||
- :guilabel:`Location`: Select or create new locations from the drop-down menu. If this field is
|
||||
left empty, the meeting is considered to be taking place online.
|
||||
- :guilabel:`Videoconference Link`: Select from :guilabel:`Odoo Discuss` or :guilabel:`Google Meet`
|
||||
to include a video conference link in the meeting invitation, or leave it blank to prevent
|
||||
generating a meeting URL.
|
||||
- :guilabel:`Manual Confirmation`: Only shown if :guilabel:`Resources` has been selected in the
|
||||
:guilabel:`Availability On` field. Tick the checkbox and enter a maximum percentage of the
|
||||
selected resource(s)' total capacity to create a manual confirmation requirement to finalize the
|
||||
meeting.
|
||||
- :guilabel:`Up-front Payment`: Tick the checkbox to require users to pay before confirming their
|
||||
booking. Once this is ticked, a link appears to :icon:`oi-arrow-right` :guilabel:`Configure
|
||||
Payment Providers`, which enables online payments.
|
||||
- :guilabel:`Limit to Work Hours`: If :guilabel:`Users` has been selected in the
|
||||
:guilabel:`Availability On` field, tick the checkbox to limit meeting time slots to the selected
|
||||
:doc:`users' working hours <../hr/employees/new_employee>`.
|
||||
- :guilabel:`Create Opportunities`: When this is selected, each scheduled appointment creates
|
||||
a new **CRM** opportunity.
|
||||
- :guilabel:`Reminders`: Add or delete notification reminders in this field. Select the blank space
|
||||
for additional options.
|
||||
- :guilabel:`Confirmation Email`: Tick the checkbox to automatically send a confirmation email to
|
||||
attendees once the meeting is confirmed. Select from the email templates or click
|
||||
:guilabel:`Search More...`, then :guilabel:`New` to create a custom template.
|
||||
- :guilabel:`Cancelation Email`: Tick the checkbox to automatically send a cancelation email to
|
||||
attendees if the meeting is canceled. Select from the email templates or click
|
||||
:guilabel:`Search More...`, then :guilabel:`New` to create a custom template.
|
||||
- :guilabel:`CC to`: Add contacts to be notified of meeting updates in this field, regardless if
|
||||
they attend the meeting.
|
||||
- :guilabel:`Allow Guests`: Tick the checkbox to allow attendees to invite guests.
|
||||
|
||||
.. _calendar/appointment-questions:
|
||||
|
||||
Questions tab
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
In the :guilabel:`Questions` tab, add questions for the attendee to answer when confirming their
|
||||
meeting. Click :guilabel:`Add a line` to configure a :guilabel:`Question`. Then select a
|
||||
:guilabel:`Question Type`, optionally add a :guilabel:`Placeholder` answer, and choose whether it is
|
||||
a :guilabel:`Required Answer`.
|
||||
|
||||
To learn how to create more comprehensive questionnaires, head to the **Survey** app
|
||||
documentation on :doc:`creating and configuring data-capturing questions
|
||||
<../marketing/surveys/questions>`.
|
||||
|
||||
.. _calendar/appointment-messages:
|
||||
|
||||
Messages tab
|
||||
~~~~~~~~~~~~
|
||||
|
||||
In the :guilabel:`Introduction Message` field of the :guilabel:`Messages` tab, add additional
|
||||
meeting information that appears on the invitation.
|
||||
|
||||
Information added to the :guilabel:`Extra Message on Confirmation` field appears once the meeting is
|
||||
confirmed.
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 27 KiB |
@@ -28,7 +28,7 @@ within the Odoo *Sales* application.
|
||||
other similar records in Odoo.
|
||||
|
||||
.. seealso::
|
||||
:doc:`/applications/websites/ecommerce/products/variants`
|
||||
:ref:`ecommerce/products/product-variants`
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
@@ -2,21 +2,21 @@
|
||||
Renew subscriptions
|
||||
===================
|
||||
|
||||
The foundation of any subscription business model is recurring payments. That's when customers
|
||||
The foundation of any subscription business model is recurring payments. This is when customers
|
||||
reliably pay a regular amount at specific intervals, in exchange for access to a subscription
|
||||
product or service.
|
||||
|
||||
The renewal of a subscription is the process followed by customers when they willingly choose to
|
||||
continue their participation (and payment) for a subscription product or service.
|
||||
Subscription renewal is the process customers follow when they willingly choose to continue
|
||||
participating in, and paying for, a subscription product or service.
|
||||
|
||||
Subscribers experience the renewal process at different intervals -- weekly, monthly, annually, etc.
|
||||
-- depending on the duration of the agreed-upon contract.
|
||||
|
||||
Most companies that offer subscriptions prefer to automate the renewals process for customers, but,
|
||||
in some cases, manual subscription renewals are still used.
|
||||
Most companies that offer subscriptions prefer to automate the renewal process for customers.
|
||||
However, manual subscription renewals are still used in some cases.
|
||||
|
||||
With the Odoo *Subscriptions* application, a company can manage all of their subscriptions in one
|
||||
place. Renewals can be processed automatically or manually, include additional products or upsells
|
||||
With the Odoo **Subscriptions** application, a company can manage all of its subscriptions in one
|
||||
place. Renewals can be processed automatically, or manually, include additional products or upsells
|
||||
per renewal order, and be filtered in batch views to quickly locate customers who need to renew
|
||||
their subscriptions.
|
||||
|
||||
@@ -24,18 +24,29 @@ Subscription renewals
|
||||
=====================
|
||||
|
||||
In order to renew a subscription, a quotation with a subscription product **must** be confirmed,
|
||||
with a configured :guilabel:`Recurring Plan` selected, which turns it into a sales order.
|
||||
with a configured *Recurring Plan* selected.
|
||||
|
||||
To open a subscription quotation, navigate to :menuselection:`Subscriptions app --> Subscriptions
|
||||
--> Quotations`, and select the desired quotation from the list. Or, create a new one by clicking
|
||||
:guilabel:`New` to open a new quotation form.
|
||||
|
||||
.. note::
|
||||
- Only a singular product is required.
|
||||
- A subscription service is still a product (albeit a digital, recurring one)
|
||||
- A subscription service counts as a product, as it is considered a recurring product.
|
||||
|
||||
Then, that sales order needs to be confirmed, and payment from the customer for the initial
|
||||
subscription has to be invoiced and registered.
|
||||
Subscription quotations **must** be confirmed, and payment from the customer for the
|
||||
initial subscription **must** be invoiced and registered in order to successfully open a *Renewal
|
||||
Quotation*.
|
||||
|
||||
When those steps are complete, an :guilabel:`In Progress` tag is applied to the sales order form,
|
||||
and a series of buttons appear at the top of the sales order -- including a button titled,
|
||||
:guilabel:`Renew`.
|
||||
.. seealso::
|
||||
For more information on the above process of confirming quotations and invoicing payments,
|
||||
see:
|
||||
- :doc:`../sales/send_quotations/create_quotations`
|
||||
- :doc:`../sales/send_quotations/get_paid_to_validate`
|
||||
|
||||
Once the payment from the subscription quotation is confirmed, the quotation turns into a sales
|
||||
order. An :guilabel:`In Progress` tag is applied to the sales order form, and a series of buttons
|
||||
also appear at the top of the sales order, including a :guilabel:`Renew` button.
|
||||
|
||||
.. image:: renewals/renew-button.png
|
||||
:align: center
|
||||
@@ -48,12 +59,12 @@ complete with a :guilabel:`Renewal Quotation` tag.
|
||||
:align: center
|
||||
:alt: Renewal quotation in the Odoo Subscriptions application.
|
||||
|
||||
From here, a standard sales flow can occur in order to confirm the quotation. This typically begins
|
||||
by clicking :guilabel:`Send by Email`. This sends a copy of the quotation to the customer, by email,
|
||||
for them to confirm, and eventually, pay for.
|
||||
From here, a standard sales flow can occur to confirm the quotation. This typically begins
|
||||
by clicking :guilabel:`Send by Email`, which sends a copy of the quotation to the customer, by
|
||||
email, for them to confirm, and eventually, pay for.
|
||||
|
||||
.. note::
|
||||
In the *Chatter* of the :guilabel:`Renewal Quotation`, it is mentioned that this subscription is
|
||||
In the chatter of the :guilabel:`Renewal Quotation`, it is mentioned that this subscription is
|
||||
the renewal of the subscription from the original sales order.
|
||||
|
||||
Once the :guilabel:`Renewal Quotation` is confirmed, it becomes a sales order, and a
|
||||
@@ -81,6 +92,38 @@ also appears at the top of the sales order.
|
||||
When clicked, Odoo reveals an :guilabel:`MRR Analysis` page, detailing the monthly recurring revenue
|
||||
related to this specific subscription.
|
||||
|
||||
.. important::
|
||||
On rare occasions, automatic payment can fail, which results in a *Payment Failure* tag on the
|
||||
top-right of the sales order, if there is an error in the payment method.
|
||||
|
||||
This is done to prevent the system from charging the customer again the next time a scheduled
|
||||
action is run. Because the status of the payment is unknown, Odoo requests a manual operation to
|
||||
check if the payment has been made, before the payment can be used again.
|
||||
|
||||
To do this, navigate to :menuselection:`Subscriptions app --> Subscriptions --> Quotations`.
|
||||
Click into the desired subscription, then check the *Chatter* to see if the payment was made.
|
||||
|
||||
If the payment was **not** made, first enter :doc:`debug mode <../../general/developer_mode>`.
|
||||
Then, click the :guilabel:`Other Info` tab, and untick the checkbox next to :guilabel:`Contract
|
||||
in exception`. Reload the sales order, and the :guilabel:`Payment Failure` tag is gone.
|
||||
|
||||
If the payment **was** made, a new invoice must be made and posted manually. This automatically
|
||||
updates the next invoice date of the subscription. Once created, enter :doc:`debug mode
|
||||
<../../general/developer_mode>`, and navigate to the new sales order. Click the :guilabel:`Other
|
||||
Info` tab, and untick the checkbox next to :guilabel:`Contract in exception`.
|
||||
Reload the sales order, and the :guilabel:`Payment Failure` tag is gone.
|
||||
|
||||
.. figure:: renewals/contract-in-exception.png
|
||||
:align: center
|
||||
:alt: The "contract in exception" option selected with the "payment failure" tag shown.
|
||||
|
||||
The :guilabel:`contract in exception`` option selected with the :guilabel:`payment failure`
|
||||
tag shown.
|
||||
|
||||
In both cases, once the :guilabel:`Contract in exception` option is no longer selected, Odoo
|
||||
handles renewals automatically again. If the subscription remains in *payment failure*, it is
|
||||
skipped by Odoo until the sales order is closed.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`../subscriptions`
|
||||
- :doc:`plans`
|
||||
|
||||
|
After Width: | Height: | Size: 44 KiB |