Compare commits

...

31 Commits

Author SHA1 Message Date
Valentino 528758a916 [IMP]l10n_br: IAP Free Credits Clarification.rst
Odoo gives users 500 free IAP credits when they start with Odoo in BR in production databases. This is an important information that was not clarified.
2024-10-16 14:03:46 -07:00
Olivier Dony ab9313a451 [FIX] legal: update license info for 18.0 2024-10-16 19:07:31 +02:00
xpl-odoo 868ecc61a5 [IMP] studio: update approval rules for v18
closes odoo/documentation#11200

Signed-off-by: Xavier Platteau (xpl) <xpl@odoo.com>
2024-10-16 11:13:34 +00:00
Felicious 73638c012c [IMP] inventory: improve routes definitions
closes odoo/documentation#11168

X-original-commit: 21cb6bb5cf
Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
Signed-off-by: Felicia Kuan (feku) <feku@odoo.com>
2024-10-15 18:59:26 +00:00
Felicious 753d10106a [IMP] inventory: merge resupply
closes odoo/documentation#11204

X-original-commit: 7f24a51d7d
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Signed-off-by: Felicia Kuan (feku) <feku@odoo.com>
Co-authored-by: Liz Bender <92882399+benderliz@users.noreply.github.com>
Co-authored-by: Zachary Straub <zst@odoo.com>
Co-authored-by: Sam Lieber (sali) <36018073+samueljlieber@users.noreply.github.com>
2024-10-15 18:59:25 +00:00
KC (ksc) 64a0fbd75e [IMP] surveys: add cards and links/intros
closes odoo/documentation#11176

X-original-commit: 3337149a62
Signed-off-by: Kevin Scannell (ksc) <ksc@odoo.com>
2024-10-15 14:23:05 +00:00
Odoo Translation Bot a2af035da6 [I18N] Update translation terms from Transifex 2024-10-13 02:42:30 +02:00
Felicious bb761431d5 [REF] inventory: resupply warehouses
closes odoo/documentation#11194

X-original-commit: ef367bd442
Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
Signed-off-by: Felicia Kuan (feku) <feku@odoo.com>
2024-10-11 22:11:21 +00:00
Felicious 0b5e4bb5b4 [IMP] inventory: fix typos in shipping table
closes odoo/documentation#11184

X-original-commit: e41e3c7ba0
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Signed-off-by: Felicia Kuan (feku) <feku@odoo.com>
2024-10-11 17:21:32 +00:00
larm-odoo 32ecbd0c5b [ADD] Payroll: Work entry analysis report
closes odoo/documentation#11180

X-original-commit: 34814984ec
Signed-off-by: Lara Martini (larm) <larm@odoo.com>
2024-10-11 16:07:13 +00:00
Odoo's Mergebot 31725deaf0 [FW][ADD] odoo.sh: new ci token usage
closes odoo/documentation#11189

Forward-port-of: odoo/documentation#11172
Signed-off-by: Fabien Meghazi (fme) <fme@odoo.com>
Signed-off-by: Stanislas Sobieski (sts) <sts@odoo.com>
Co-authored-by: Fabien Meghazi <fme@odoo.com>
Co-authored-by: Stanislas Sobieski <sts@odoo.com>
2024-10-11 11:35:31 +00:00
afma-odoo 0e71f8681e [IMP] accounting: pdf menu to export reports
task-3605633

closes odoo/documentation#11113

X-original-commit: 380c4bc10f
Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
Signed-off-by: Anne-Françoise Marcq (afma) <afma@odoo.com>
2024-10-11 08:58:30 +00:00
Demesmaeker da682b7f22 [ADD] payment_providers/worldline
task-3499275

New payment provider and its related configuration; remove Ogone and SIPS payments providers as they were replaced by Wordline.

closes odoo/documentation#11070

Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-10-10 08:40:21 +00:00
Donatienne (dopi) cc270a9afe [IMP] ecommerce: products page updated
closes odoo/documentation#11164

Taskid: 4056328
X-original-commit: 1c5bf1337e
Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
Signed-off-by: Donatienne Pirlot (dopi) <dopi@odoo.com>
2024-10-10 06:49:12 +00:00
Ricardo Gomes Rodrigues df0cf93856 [IMP] accounting: split deferred settings
This has been done in https://github.com/odoo/enterprise/commit/39fffc5541eb51d7a3ae25405abe90fe6031001a

closes odoo/documentation#11161

X-original-commit: ac69e2872c
Signed-off-by: Ricardo Gomes Rodrigues (rigr) <rigr@odoo.com>
2024-10-09 17:58:16 +00:00
dikd-odoo 213a3ca73b [IMP] calendar: expand parent documentation
[ADD] expand parent calendar documentation

[FIX] formatting changes

[FIX] formatting changes

[FIX] content changes

Apply suggestions from KAEK review

[FIX] KAEK review edits

[FIX] resize images

Apply suggestions from KSC review

[FIX] content from KSC review

[FIX] revisions KSC review

[FIX] formatting

newline

formatting

Apply suggestions from KSC review

[FIX] Content change

[FIX] Content changes

Apply suggestions from KSC review

Apply suggestions from SALI review

Apply suggestions from SALI review2

content changes

format

Apply suggestions from SALI review

content

content

closes odoo/documentation#11132

X-original-commit: 721c07d341
Signed-off-by: Dina Klarisse Dugar (dikd) <dikd@odoo.com>
Co-authored-by: kekiss <karaekiss@yahoo.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
Co-authored-by: Sam Lieber (sali) <36018073+samueljlieber@users.noreply.github.com>
Co-authored-by: Sam Lieber (sali) <36018073+samueljlieber@users.noreply.github.com>
Co-authored-by: Sam Lieber (sali) <36018073+samueljlieber@users.noreply.github.com>
2024-10-08 19:20:15 +00:00
xpl-odoo 0e4810f40b [IMP] administration: on-premise publisher warranty URL
task-4226945

closes odoo/documentation#11154

X-original-commit: 544e2c18d0
Signed-off-by: Xavier Platteau (xpl) <xpl@odoo.com>
2024-10-07 16:38:37 +00:00
Tiffany Chang (tic) 4e7df807e7 [I18N] *: export latest terms
As per usual, leave off developer.pot and contributing.pot since we
don't translate them (not useful, can't really contribute to/dev in
Odoo without knowing English)

Also update the tx/config to point to v18 project

closes odoo/documentation#11148

X-original-commit: 5aa4151
Signed-off-by: Tiffany Chang (tic) <tic@odoo.com>
2024-10-07 15:14:06 +00:00
Odoo Translation Bot 0a3c8ec10a [I18N] Update translation terms from Transifex 2024-10-06 02:42:45 +02:00
Felicious 416fcaa7a1 [ADD] purchase: import vendor pricelist
closes odoo/documentation#11141

X-original-commit: 3b69030302
Signed-off-by: Felicia Kuan (feku) <feku@odoo.com>
Co-authored-by: kekiss <karaekiss@yahoo.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
Co-authored-by: Sam Lieber (sali) <36018073+samueljlieber@users.noreply.github.com>
2024-10-04 21:38:24 +00:00
Felicious d8e0ae04b9 [ADD] inventory: valuation by lots
closes odoo/documentation#11138

Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
2024-10-04 20:30:59 +00:00
larm-odoo 5688664e3a [IMP] Appraisals: Skills Report - highest improvement
closes odoo/documentation#11136

X-original-commit: 6c843244eb
Signed-off-by: Lara Martini (larm) <larm@odoo.com>
2024-10-04 19:16:45 +00:00
Antoine Vandevenne (anv) 61f05b699a [IMP] supported_versions: release 18.0
closes odoo/documentation#11125

X-original-commit: a0472c95e5
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2024-10-01 14:11:12 +00:00
Odoo Translation Bot 318d80a4a1 [I18N] Update translation terms from Transifex 2024-09-29 02:43:41 +02:00
Pierre Pulinckx (PIPU) b79c83f52a [IMP] developer/testing: update tours documentation
The towers interface was modified during version 17. Therefore, in this commit, we update the documentation of this interface.

closes odoo/documentation#11116

Signed-off-by: Victor Feyens (vfe) <vfe@odoo.com>
2024-09-28 14:29:32 +00:00
masp-odoo 6d2f193622 [FIX] website: recaptcha threshold number
task-4145451

closes odoo/documentation#11107

X-original-commit: 0aa1a671dd
Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
Signed-off-by: Marion Spindler (masp) <masp@odoo.com>
2024-09-26 15:09:34 +00:00
larm-odoo 0cd4dd2978 [ADD] Appraisals: Skills Evolution reporting
closes odoo/documentation#11100

X-original-commit: 1e39d90420
Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
Signed-off-by: Lara Martini (larm) <larm@odoo.com>
2024-09-25 19:52:56 +00:00
larm-odoo b4beccaf8e [ADD] Employees: Certifications
closes odoo/documentation#11099

X-original-commit: 14007868bb
Signed-off-by: Lara Martini (larm) <larm@odoo.com>
2024-09-25 19:52:55 +00:00
larm-odoo fd5d5581cc [ADD] Employees: Employee retention report
closes odoo/documentation#11093

X-original-commit: 43d99f8070
Signed-off-by: Lara Martini (larm) <larm@odoo.com>
2024-09-25 19:52:49 +00:00
Parish Bracha 9083a0927c [IMP] Subscriptions: Contract in exception
closes odoo/documentation#11090

X-original-commit: ea2fc6dbc4
Signed-off-by: Parish Bracha (pabr) <pabr@odoo.com>
2024-09-25 15:42:47 +00:00
Christophe Monniez b5c37e33b1 [REL] 18.0 2024-09-25 12:35:25 +00:00
469 changed files with 5043582 additions and 278652 deletions
+15 -15
View File
@@ -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
+1 -1
View File
@@ -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)
+2 -8
View File
@@ -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
==============
+2 -2
View File
@@ -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.
+15 -21
View File
@@ -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 youll 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`
+2
View File
@@ -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`
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

+2
View File
@@ -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.
Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

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.
Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

+2
View File
@@ -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
+4 -56
View File
@@ -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
------------------------
Binary file not shown.

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.
Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

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`.
@@ -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
~~~~~
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

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.
@@ -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.
@@ -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>`
Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

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"
1 id company_id delay price product_tmpl_id sequence partner_id
2 product.product_supplierinfo_3 My Company (San Francisco) 3 13.0 [E-COM08] Storage Box 4 Wood Corner
3 My Company (San Francisco) 3 14.4 [E-COM08] Storage Box 5 Ready Mat
4 My Company (San Francisco) 2 1299.0 [E-COM09] Large Desk 6 Wood Corner
5 My Company (San Francisco) 4 1399.0 [E-COM09] Large Desk 7 Azure Interior
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

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:
+276 -1
View File
@@ -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:
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

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`
Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

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