diff --git a/.tx/config b/.tx/config deleted file mode 100644 index 825968592e..0000000000 --- a/.tx/config +++ /dev/null @@ -1,152 +0,0 @@ -[main] -host = https://www.transifex.com - -[o:odoo:p:odoo-18-doc:r:administration] -file_filter = locale//LC_MESSAGES/administration.po -source_file = locale/sources/administration.pot -type = POT -minimum_perc = 0 -resource_name = administration -replace_edited_strings = false -keep_translations = false -source_lang = en - -[o:odoo:p:odoo-18-doc:r:applications] -file_filter = locale//LC_MESSAGES/applications.po -source_file = locale/sources/applications.pot -type = POT -minimum_perc = 0 -resource_name = applications -replace_edited_strings = false -keep_translations = false -source_lang = en - -[o:odoo:p:odoo-18-doc:r:essentials] -file_filter = locale//LC_MESSAGES/essentials.po -source_file = locale/sources/essentials.pot -type = POT -minimum_perc = 0 -resource_name = essentials -replace_edited_strings = false -keep_translations = false -source_lang = en - -[o:odoo:p:odoo-18-doc:r:finance] -file_filter = locale//LC_MESSAGES/finance.po -source_file = locale/sources/finance.pot -type = POT -minimum_perc = 0 -resource_name = finance -replace_edited_strings = false -keep_translations = false -source_lang = en - -[o:odoo:p:odoo-18-doc:r:general] -file_filter = locale//LC_MESSAGES/general.po -source_file = locale/sources/general.pot -type = POT -minimum_perc = 0 -resource_name = general -replace_edited_strings = false -keep_translations = false -source_lang = en - -[o:odoo:p:odoo-18-doc:r:hr] -file_filter = locale//LC_MESSAGES/hr.po -source_file = locale/sources/hr.pot -type = POT -minimum_perc = 0 -resource_name = hr -replace_edited_strings = false -keep_translations = false -source_lang = en - -[o:odoo:p:odoo-18-doc:r:index] -file_filter = locale//LC_MESSAGES/index.po -source_file = locale/sources/index.pot -type = POT -minimum_perc = 0 -resource_name = index -replace_edited_strings = false -keep_translations = false -source_lang = en - -[o:odoo:p:odoo-18-doc:r:inventory_and_mrp] -file_filter = locale//LC_MESSAGES/inventory_and_mrp.po -source_file = locale/sources/inventory_and_mrp.pot -type = POT -minimum_perc = 0 -resource_name = inventory_and_mrp -replace_edited_strings = false -keep_translations = false -source_lang = en - -[o:odoo:p:odoo-18-doc:r:marketing] -file_filter = locale//LC_MESSAGES/marketing.po -source_file = locale/sources/marketing.pot -type = POT -minimum_perc = 0 -resource_name = marketing -replace_edited_strings = false -keep_translations = false -source_lang = en - -[o:odoo:p:odoo-18-doc:r:productivity] -file_filter = locale//LC_MESSAGES/productivity.po -source_file = locale/sources/productivity.pot -type = POT -minimum_perc = 0 -resource_name = productivity -replace_edited_strings = false -keep_translations = false -source_lang = en - -[o:odoo:p:odoo-18-doc:r:sales] -file_filter = locale//LC_MESSAGES/sales.po -source_file = locale/sources/sales.pot -type = POT -minimum_perc = 0 -resource_name = sales -replace_edited_strings = false -keep_translations = false -source_lang = en - -[o:odoo:p:odoo-18-doc:r:services] -file_filter = locale//LC_MESSAGES/services.po -source_file = locale/sources/services.pot -type = POT -minimum_perc = 0 -resource_name = services -replace_edited_strings = false -keep_translations = false -source_lang = en - -[o:odoo:p:odoo-18-doc:r:user_settings] -file_filter = locale//LC_MESSAGES/settings.po -source_file = locale/sources/settings.pot -type = POT -minimum_perc = 0 -resource_name = settings -replace_edited_strings = false -keep_translations = false -source_lang = en - -[o:odoo:p:odoo-18-doc:r:studio] -file_filter = locale//LC_MESSAGES/studio.po -source_file = locale/sources/studio.pot -type = POT -minimum_perc = 0 -resource_name = studio -replace_edited_strings = false -keep_translations = false -source_lang = en - -[o:odoo:p:odoo-18-doc:r:websites] -file_filter = locale//LC_MESSAGES/websites.po -source_file = locale/sources/websites.pot -type = POT -minimum_perc = 0 -resource_name = websites -replace_edited_strings = false -keep_translations = false -source_lang = en diff --git a/Makefile b/Makefile index fb1c9d116d..42c79e6cd6 100644 --- a/Makefile +++ b/Makefile @@ -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)/saas-18.3 endif ifneq ($(CURRENT_LANG),en) HTML_BUILD_DIR := $(HTML_BUILD_DIR)/$(CURRENT_LANG) diff --git a/conf.py b/conf.py index c815aacaf3..35aae85e9f 100644 --- a/conf.py +++ b/conf.py @@ -22,7 +22,7 @@ # `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 a/b/rc tags. Acts as replacement for |release|. -version = release = 'master' +version = release = 'saas-18.3' # `current_branch` is the technical name of the current branch. # E.g., saas-15.4 -> saas-15.4; 12.0 -> 12.0, master -> master (*). @@ -82,6 +82,7 @@ 'CURRENT_MAJOR_VERSION': current_major_version, 'GITHUB_PATH': f'https://github.com/odoo/odoo/blob/{version}', 'GITHUB_ENT_PATH': f'https://github.com/odoo/enterprise/blob/{version}', + 'GITHUB_TUTO_PATH': f'https://github.com/odoo/tutorials/blob/{current_major_branch}', 'OWL_PATH': f'https://github.com/odoo/owl/blob/master', } @@ -211,9 +212,9 @@ todo_include_todos = False intersphinx_mapping = { - 'pillow': ('https://pillow.readthedocs.io/en/stable/', None), - 'python': ('https://docs.python.org/3/', None), - 'werkzeug': ('https://werkzeug.palletsprojects.com/en/2.3.x/', None), + 'python': ('https://docs.python.org/3/', '../invs/python.inv'), + # apparently local inventories are relative to the source dir? + 'werkzeug': ('https://werkzeug.palletsprojects.com/', '../invs/werkzeug.inv'), } github_user = 'odoo' @@ -231,10 +232,11 @@ # option. If a provided version has no label, the version string is used as label. versions_names = { 'master': "Master", + '19.0': "Odoo 19", + 'saas-18.4': "Odoo 18.4", + 'saas-18.3': "Odoo 18.3", 'saas-18.2': "Odoo 18.2", - 'saas-18.1': "Odoo 18.1", '18.0': "Odoo 18", - 'saas-17.4': "Odoo 17.4", '17.0': "Odoo 17", '16.0': "Odoo 16", } @@ -329,29 +331,31 @@ 'terms_of_sale.tex', 'Odoo Terms of Sale', '', 'howto'), ('legal/terms/i18n/enterprise_tex_fr', 'odoo_enterprise_agreement_fr.tex', - 'Odoo Enterprise Subscription Agreement (FR)', '', 'howto'), + "Contrat d'Abonnement Odoo Enterprise", '', 'howto'), ('legal/terms/i18n/partnership_tex_fr', - 'odoo_partnership_agreement_fr.tex', 'Odoo Partnership Agreement (FR)', '', 'howto'), + 'odoo_partnership_agreement_fr.tex', 'Contrat de Partenariat Odoo', '', 'howto'), ('legal/terms/i18n/terms_of_sale_fr', 'terms_of_sale_fr.tex', 'Conditions Générales de Vente Odoo', '', 'howto'), ('legal/terms/i18n/enterprise_tex_nl', 'odoo_enterprise_agreement_nl.tex', - 'Odoo Enterprise Subscription Agreement (NL)', '', 'howto'), + 'Odoo Enterprise Abonnementsovereenkomst', '', 'howto'), ('legal/terms/i18n/enterprise_tex_de', 'odoo_enterprise_agreement_de.tex', - 'Odoo Enterprise Subscription Agreement (DE)', '', 'howto'), + 'Odoo Enterprise Abonnementsvertrag', '', 'howto'), ('legal/terms/i18n/terms_of_sale_de', 'terms_of_sale_de.tex', 'Allgemeine Verkaufsbedingungen Odoo', '', 'howto'), ('legal/terms/i18n/enterprise_tex_es', 'odoo_enterprise_agreement_es.tex', - 'Odoo Enterprise Subscription Agreement (ES)', '', 'howto'), + 'Acuerdo de suscripción de Odoo Enterprise', '', 'howto'), ('legal/terms/i18n/partnership_tex_es', - 'odoo_partnership_agreement_es.tex', 'Odoo Partnership Agreement (ES)', '', 'howto'), + 'odoo_partnership_agreement_es.tex', 'Acuerdo de Colaboración de Odoo', '', 'howto'), ('legal/terms/i18n/terms_of_sale_es', 'terms_of_sale_es.tex', 'Términos Generales de Venta Odoo', '', 'howto'), ('legal/terms/i18n/enterprise_tex_pt_BR', 'odoo_enterprise_agreement_pt_BR.tex', - 'Odoo Enterprise Subscription Agreement (PT)', '', 'howto'), + 'Contrato de Assinatura do Odoo Enterprise', '', 'howto'), + ('legal/terms/i18n/terms_of_sale_pt_BR', 'terms_of_sale_pt_BR.tex', + 'Termos Gerais de Venda Odoo', '', 'howto'), ] # List of languages that have legal translations (excluding EN). The keys must be in @@ -382,6 +386,16 @@ def source_read_replace(app, docname, source): result = result.replace(f"{{{key}}}", app.config.source_read_replace_vals[key]) source[0] = result +def upgrade_util_signature_rewrite(app, domain, objtype, contentnode): + # Same as add_module_names=False but **only** for odoo.upgrade.util functions or classes + signature = contentnode.parent[0] + if objtype == 'function' and signature.astext().startswith('odoo.upgrade.util.'): + # , , <(cr, *modules)> + signature.pop(0) + if objtype == 'class' and signature.astext().startswith('class odoo.upgrade.util.'): + # , , + signature.pop(1) + def setup(app): # Generate all alternate URLs for each document app.add_config_value('project_root', None, 'env') @@ -391,6 +405,7 @@ def setup(app): app.add_config_value('is_remote_build', None, 'env') # Whether the build is remotely deployed app.add_config_value('source_read_replace_vals', {}, 'env') app.connect('source-read', source_read_replace) + app.connect('object-description-transform', upgrade_util_signature_rewrite) # TODO uncomment after moving to >= v7.2.5 to also substitute placeholders in included files. # See https://github.com/sphinx-doc/sphinx/commit/ff1831 # app.connect('include-read', source_read_replace) diff --git a/content/administration/mobile.rst b/content/administration/mobile.rst index 5a0ba4660a..b78d67bf7d 100644 --- a/content/administration/mobile.rst +++ b/content/administration/mobile.rst @@ -62,6 +62,6 @@ The Odoo mobile apps are available for download on the `Google Play Store `_. .. important:: - The iOS app cannot be updated and will be deprecated at some point in the future. + The iOS app might not be updated and might be deprecated at some point in the future. While the store apps support multi-accounts, they are not compatible with SSO authentication. diff --git a/content/administration/odoo_online.rst b/content/administration/odoo_online.rst index 6ed7e5728f..cb5c3ce012 100644 --- a/content/administration/odoo_online.rst +++ b/content/administration/odoo_online.rst @@ -14,6 +14,8 @@ Odoo Online databases are accessed using any web browser and do not require a lo To quickly try out Odoo, shared `demo `_ instances are available. No registration is required, but each instance only lives for a few hours. +.. _odoo_online/database-management: + Database management =================== @@ -79,8 +81,11 @@ Download Download a ZIP file containing a backup of the database. .. note:: - Databases are backed up daily as per the `Odoo Cloud Hosting SLA - `_. + - Databases are backed up daily as per the `Odoo Cloud Hosting SLA + `_. + - If the :guilabel:`Download` option is disabled, it means your database is too large to be + downloaded through this method. In this case, please contact `Odoo Support + `_ to request an alternative download solution. .. _odoo_online/domains: diff --git a/content/administration/on_premise/deploy.rst b/content/administration/on_premise/deploy.rst index 3103f957d2..e096b55eb8 100644 --- a/content/administration/on_premise/deploy.rst +++ b/content/administration/on_premise/deploy.rst @@ -881,23 +881,13 @@ now appears in the configuration file. Supported Browsers ================== -Odoo supports all the major desktop and mobile browsers available on the market, -as long as they are supported by their publishers. - -Here are the supported browsers: +Odoo supports the latest version of the following browsers. - Google Chrome - Mozilla Firefox - Microsoft Edge - Apple Safari -.. warning:: Please make sure your browser is up-to-date and still supported by - its publisher before filing a bug report. - -.. note:: - - Since Odoo 13.0, ES6 is supported. Therefore, IE support is dropped. - .. [#different-machines] to have multiple Odoo installations use the same PostgreSQL database, or to provide more computing resources to both software. diff --git a/content/administration/on_premise/packages.rst b/content/administration/on_premise/packages.rst index b01ac1d59f..0d420b4c98 100644 --- a/content/administration/on_premise/packages.rst +++ b/content/administration/on_premise/packages.rst @@ -100,9 +100,9 @@ be downloaded from the `Odoo download page ` .. group-tab:: Debian/Ubuntu .. note:: - Odoo {CURRENT_MAJOR_VERSION} 'deb' package currently supports `Debian Buster - `_ and `Ubuntu 18.04 - `_ or above. + Odoo {CURRENT_MAJOR_VERSION} 'deb' package currently supports `Debian Bookworm (12) + `_ and `Ubuntu Jammy (22.04LTS) + `_ or above. Once downloaded, execute the following commands **as root** to install Odoo as a service, create the necessary PostgreSQL user, and automatically start the server: diff --git a/content/administration/supported_versions.rst b/content/administration/supported_versions.rst index 56b463cbce..2ff7f19731 100644 --- a/content/administration/supported_versions.rst +++ b/content/administration/supported_versions.rst @@ -31,48 +31,48 @@ This matrix shows the support status of every version. - On-Premise - Release date - End of support - * - Odoo SaaS 18.2 + * - **Odoo 19.0** + - |green| - |green| - - N/A - - N/A - - March 2025 - - - * - Odoo SaaS 18.1 - |green| + - September 2025 + - September 2028 (planned) + * - Odoo SaaS 18.4 + - |red| - N/A - N/A - - January 2025 + - July 2025 - - * - **Odoo 18.0** - - |green| - - |green| - - |green| - - October 2024 - - October 2027 (planned) - * - Odoo SaaS 17.4 + * - Odoo SaaS 18.3 - |red| - N/A - N/A - - July 2024 - - October 2024 - * - Odoo SaaS 17.2 + - May 2025 + - + * - Odoo SaaS 18.2 - |red| - N/A - N/A - - April 2024 + - March 2025 + - + * - **Odoo 18.0** + - |green| + - |green| + - |green| - October 2024 + - September 2027 (planned) * - **Odoo 17.0** - |green| - |green| - |green| - November 2023 - - October 2026 (planned) + - September 2026 (planned) * - **Odoo 16.0** - - |green| - - |green| - - |green| + - |red| + - |red| + - |red| - October 2022 - - October 2025 (planned) + - September 2025 * - **Odoo 15.0** - |red| - |red| diff --git a/content/applications/essentials.rst b/content/applications/essentials.rst index 3c4ec1015a..10341d9f7f 100644 --- a/content/applications/essentials.rst +++ b/content/applications/essentials.rst @@ -12,3 +12,4 @@ Odoo essentials essentials/export_import_data essentials/in_app_purchase essentials/keyboard_shortcuts + essentials/property_fields diff --git a/content/applications/essentials/activities.rst b/content/applications/essentials/activities.rst index 3ea7957253..71a022f6e8 100644 --- a/content/applications/essentials/activities.rst +++ b/content/applications/essentials/activities.rst @@ -15,7 +15,7 @@ The icon used to display activities varies, depending on the :ref:`activity type - :icon:`fa-phone` :guilabel:`(phone)` icon: a phone call is scheduled. - :icon:`fa-envelope` :guilabel:`(envelope)` icon: an email is scheduled. - :icon:`fa-check` :guilabel:`(check)` icon: a "to-do" is scheduled. -- :icon:`fa-users` :guilabel:`(people)` icon: a meeting is scheduled. +- :icon:`fa-users` :guilabel:`(users)` icon: a meeting is scheduled. - :icon:`fa-upload` :guilabel:`(upload)` icon: a document is scheduled to be uploaded. - :icon:`fa-pencil-square-o` :guilabel:`(request signature)` icon: a signature request is scheduled. @@ -33,13 +33,12 @@ Chatter Activities can be created from the chatter on any record. -To schedule a new activity, click the :guilabel:`Activities` button, located at the top of the +To schedule a new activity, click the :guilabel:`Activity` button, located at the top of the chatter. In the :guilabel:`Schedule Activity` pop-up window that appears, :ref:`fill out the Schedule Activity form `. .. image:: activities/chatter.png - :align: center - :alt: New activity type form. + :alt: Activity button in chatter field. .. _activities/kanban: @@ -54,7 +53,6 @@ Click :guilabel:`+ Schedule An Activity`, then proceed to :ref:`fill out the Sch `. .. image:: activities/schedule-kanban-activity.png - :align: center :alt: Kanban view of the CRM pipeline and the option to schedule an activity. .. note:: @@ -80,7 +78,6 @@ appears. the existing scheduled activity. Click on the activity type's icon to schedule another activity. .. image:: activities/schedule-list-activity.png - :align: center :alt: List view of the CRM pipeline and the option to schedule an activity. .. _activities/activity: @@ -94,7 +91,6 @@ the top-right corner of the main menu bar, amongst the other view option icons. To open the activity view, click the |clock|. .. image:: activities/activities.png - :align: center :alt: Top-right menu with the Activities icon called out. In this view, all the available activities are listed in the columns, while the horizontal entries @@ -103,7 +99,7 @@ represent all the individual records. Activities that appear green have a due date in the future, activities that appear orange are due today, while activities appearing red are overdue. -Color bars in each column represent records for specific activity types, and display a number +Colored bars in each column represent records for specific activity types, and display a number indicating how many activities are scheduled for that type. If multiple activity types are scheduled for a record, a number appears in the box, indicating the @@ -114,11 +110,10 @@ total number of scheduled activities. regardless of the activity type, or the view. To schedule an activity for a record, hover over the corresponding field. Click the :icon:`fa-plus` -:guilabel:`(plus)` icon that appears, and then :ref:`fill out the Schedule Activity form +:guilabel:`(plus)` icon, and then :ref:`fill out the Schedule Activity form `. .. image:: activities/activity-view.png - :align: center :alt: Activity view of the CRM pipeline and the option to schedule an activity. .. _activities/form: @@ -131,46 +126,46 @@ Activities can be scheduled from many different places, such as from the :ref:`c the :ref:`Kanban view `, :ref:`list view `, or :ref:`activity view `. -Enter the following information on the form: +First, select an activity type: -- :guilabel:`Activity Type`: select the type of activity from the drop-down menu. The default - options are: :guilabel:`Email`, :guilabel:`Call`, :guilabel:`Meeting`, or :guilabel:`To-Do`. - Depending on what other applications are installed, additional options may be available. -- :guilabel:`Summary`: enter a short title for the activity, such as `Discuss Proposal`. +- :icon:`fa-check` :guilabel:`To-Do` +- :icon:`fa-envelope` :guilabel:`Email` +- :icon:`fa-phone` :guilabel:`Call` +- :icon:`fa-users` :guilabel:`Meeting` +- :guilabel:`Do Stuff` +- :icon:`fa-upload` :guilabel:`Document` +- :icon:`fa-pencil-square-o` :guilabel:`Signature` +- :icon:`fa-check` :guilabel:`Grant Approval` + +Then, enter the following information: + +- **Summary**: enter a short title for the activity, such as `Discuss Proposal`. - :guilabel:`Due Date`: using the calendar popover, select the activity's deadline. - :guilabel:`Assigned to`: by default, the current user populates this field. To assign a different user to the activity, select them from the drop-down menu. -- :guilabel:`Notes`: add any additional information for the activity in this field. +- :guilabel:`Log a note`: add any additional information for the activity in this field. -When the :guilabel:`Schedule Activity` pop-up window is completed, click one of the following -buttons: - -- :guilabel:`Open Calendar`: opens the user's calendar to add and schedule the activity. +.. image:: activities/schedule-pop-up.png + :alt: View of CRM leads and the option to schedule an activity. - Click on the desired date and time for the activity, and a :guilabel:`New Event` pop-up window - appears. The summary from the *Schedule Activity* pop-up window populates the :guilabel:`Title` - field. +Click :guilabel:`Save` to schedule the activity, and add the activity to the chatter under +:guilabel:`Planned Activities`. Click :guilabel:`Mark Done` to add the details of the activity to +the chatter under :guilabel:`Today`. - Enter the information in the :guilabel:`New Event` pop-up window, then click :guilabel:`Save & - Close` to schedule it. Once scheduled, the activity is added to the chatter under the - :guilabel:`Planned Activities` section. +Schedule a meeting +~~~~~~~~~~~~~~~~~~ - .. important:: - The :guilabel:`Open Calendar` button **only** appears if the :guilabel:`Activity Type` is set - to either :guilabel:`Call` or :guilabel:`Meeting`. +If :icon:`fa-users` :guilabel:`Meeting` is selected as the activity type, enter the information as +instructed above, then click :guilabel:`Schedule`. This opens the user's calendar to add and +schedule the activity. -- :guilabel:`Schedule`: schedules the activity, and adds the activity to the chatter under - :guilabel:`Planned Activities`. -- :guilabel:`Schedule & Mark as Done`: adds the details of the activity to the chatter under - :guilabel:`Today`. The activity is not scheduled, and is automatically marked as done. -- :guilabel:`Done & Schedule Next`: adds the details of the activity to the chatter under - :guilabel:`Today`. The activity is not scheduled, is automatically marked as done, and a new - :guilabel:`Schedule Activity` pop-up window appears. -- :guilabel:`Cancel`: discards any changes made on the :guilabel:`Schedule Activity` pop-up window. +Click on the desired date and time for the activity, and a :guilabel:`New Event` pop-up window +appears. The summary from the *Schedule Activity* pop-up window populates the :guilabel:`Title` +field. -.. image:: activities/schedule-pop-up.png - :align: center - :alt: View of CRM leads and the option to schedule an activity. +Enter the information in the :guilabel:`New Event` pop-up window, then click :guilabel:`Save & +Close` to schedule it. Once scheduled, the activity is added to the chatter under the +:guilabel:`Planned Activities` section. .. _activities/all: @@ -180,7 +175,7 @@ All scheduled activities To view a consolidated list of activities, organized by application, click the |clock| in the header menu, located in the top-right corner. -If any activities are scheduled, the number of activities appear in a red bubble on the +If any activities are scheduled, the number of activities appears in a red bubble on the |clock|. All activities for each application are further divided into subsections, indicating where in the @@ -189,16 +184,14 @@ activities that are :guilabel:`Late`, due :guilabel:`Today`, and scheduled in th :guilabel:`Future`. .. example:: - In the *Time Off* application, one activity is scheduled to be done in the *All Time Off* + In the **Time Off** application, one activity is scheduled to be done in the *All Time Off* requests dashboard, and six activities are scheduled to be done in the *Allocations* dashboard. These requests appear in two separate lists in the all activities drop-down menu: one labeled `Time Off` and one labeled `Time Off Allocation`. .. image:: activities/activities-menu.png - :align: center - :alt: The list of activities that is accessed from the main menu bar. Two entries for the Time - Off application are highlighted. + :alt: The list of activities that is accessed from the main menu bar. .. tip:: The option to :ref:`Request a Document ` is available at the bottom of the @@ -213,18 +206,16 @@ To view the currently configured types of activities in the database, navigate t :menuselection:`Settings app --> Discuss section --> Activities setting --> Activity Types`. .. image:: activities/settings-activities-types.png - :align: center :alt: Activity Types button in the Settings application under the Discuss section. Doing so reveals the :guilabel:`Activity Types` page, where the existing activity types are found. .. tip:: Individual applications have a list of *Activity Types* dedicated to that application. For - example, to view and edit the activities available for the *CRM* application, go to + example, to view and edit the activities available for the **CRM** application, go to :menuselection:`CRM app --> Configuration --> Activity Types`. .. image:: activities/activity-list.png - :align: center :alt: The list of activity types already configured and available. Edit activity types @@ -241,10 +232,8 @@ Create new activity types ------------------------- To create a new :ref:`activity type `, click :guilabel:`New` from the -:guilabel:`Activity Types` page, and a blank activity type form loads. - -Enter a :guilabel:`Name` for the activity type at the top of the form, then enter the following -information on the form. +:guilabel:`Activity Types` page, and a blank activity type form loads. Enter a :guilabel:`Name` for +the activity type at the top of the form, then enter the following information on the form. Activity Settings section ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -257,7 +246,7 @@ Activity Settings section - :guilabel:`Call` or :guilabel:`Meeting`: If selected, users have the option to open their calendar to select a date and time for the activity. - :guilabel:`Request Signature`: If selected, a link to open a signature request pop-up window is - automatically added to the planned activity in the chatter. This requires the Odoo *Sign* + automatically added to the planned activity in the chatter. This requires the Odoo **Sign** application to be installed. .. note:: @@ -309,7 +298,6 @@ It is possible to have another activity either suggested or triggered. To do so, :guilabel:`after previous activity deadline` or :guilabel:`after completion date`. .. image:: activities/new-activity.png - :align: center :alt: A new Activity form with all the fields filled out. .. seealso:: diff --git a/content/applications/essentials/activities/activities-menu.png b/content/applications/essentials/activities/activities-menu.png index 6a0f7fc7d4..9bd0f6f293 100644 Binary files a/content/applications/essentials/activities/activities-menu.png and b/content/applications/essentials/activities/activities-menu.png differ diff --git a/content/applications/essentials/activities/activities.png b/content/applications/essentials/activities/activities.png index e73c420ab2..07d6225868 100644 Binary files a/content/applications/essentials/activities/activities.png and b/content/applications/essentials/activities/activities.png differ diff --git a/content/applications/essentials/activities/activity-view.png b/content/applications/essentials/activities/activity-view.png index 2ea04829d3..625fa1149b 100644 Binary files a/content/applications/essentials/activities/activity-view.png and b/content/applications/essentials/activities/activity-view.png differ diff --git a/content/applications/essentials/activities/chatter.png b/content/applications/essentials/activities/chatter.png index 53d791845b..e9f73d3f84 100644 Binary files a/content/applications/essentials/activities/chatter.png and b/content/applications/essentials/activities/chatter.png differ diff --git a/content/applications/essentials/activities/schedule-kanban-activity.png b/content/applications/essentials/activities/schedule-kanban-activity.png index 2b607de14b..9d1bd82513 100644 Binary files a/content/applications/essentials/activities/schedule-kanban-activity.png and b/content/applications/essentials/activities/schedule-kanban-activity.png differ diff --git a/content/applications/essentials/activities/schedule-list-activity.png b/content/applications/essentials/activities/schedule-list-activity.png index a37879ebef..21758f4a92 100644 Binary files a/content/applications/essentials/activities/schedule-list-activity.png and b/content/applications/essentials/activities/schedule-list-activity.png differ diff --git a/content/applications/essentials/activities/schedule-pop-up.png b/content/applications/essentials/activities/schedule-pop-up.png index efea36d3de..f20bd99d6c 100644 Binary files a/content/applications/essentials/activities/schedule-pop-up.png and b/content/applications/essentials/activities/schedule-pop-up.png differ diff --git a/content/applications/essentials/activities/settings-activities-types.png b/content/applications/essentials/activities/settings-activities-types.png index c146d3c3e3..1cf4113049 100644 Binary files a/content/applications/essentials/activities/settings-activities-types.png and b/content/applications/essentials/activities/settings-activities-types.png differ diff --git a/content/applications/essentials/html_editor.rst b/content/applications/essentials/html_editor.rst index 425c779132..5afdffb102 100644 --- a/content/applications/essentials/html_editor.rst +++ b/content/applications/essentials/html_editor.rst @@ -5,8 +5,8 @@ Odoo rich-text editor ===================== The Odoo rich-text editor allows creating and editing rich-text content in HTML fields, such as the -:guilabel:`Internal Notes` and :guilabel:`Description` fields, as well as in :doc:`Knowledge -articles ` and the :ref:`Studio report +:guilabel:`Internal Notes` and :guilabel:`Description` fields, as well as in the :ref:`Knowledge +articles ` and the :ref:`Studio report editor `, among others. Start typing or use the :ref:`toolbar ` or :ref:`powerbox ` for formatting and structuring text. diff --git a/content/applications/essentials/in_app_purchase.rst b/content/applications/essentials/in_app_purchase.rst index 7513d200c8..078ec20f72 100644 --- a/content/applications/essentials/in_app_purchase.rst +++ b/content/applications/essentials/in_app_purchase.rst @@ -176,12 +176,6 @@ Services`. The available |IAP| accounts appear in a list view on the :guilabel:`IAP Account` page. From here, click on the desired |IAP| account to view that service's :guilabel:`Account Information` page. -On the :guilabel:`Account Information` page, tick the :guilabel:`Warn Me` checkbox. Doing so reveals -two fields on the form: :guilabel:`Threshold` and :guilabel:`Warning Email`. - -In the :guilabel:`Threshold` field, enter an amount of credits Odoo should use as the -minimum threshold for this service. In the :guilabel:`Warning Email` field, enter the email address -that receives the notification. - -Odoo sends a low-credit alert to the :guilabel:`Warning Email` when the balance of credits falls -below the amount listed as the :guilabel:`Threshold`. +Set the :guilabel:`Email Alert Threshold` to the credit amount that should trigger a low-credit +alert when the balance falls below it. Next, select which user(s) should receive the email +notification using the :guilabel:`Email Alert Recipients` field. diff --git a/content/applications/essentials/property_fields.rst b/content/applications/essentials/property_fields.rst new file mode 100644 index 0000000000..9ebb0c883e --- /dev/null +++ b/content/applications/essentials/property_fields.rst @@ -0,0 +1,193 @@ +=============== +Property fields +=============== + +Property fields, or properties, enable the customization of a :ref:`form +` view by adding various :ref:`field types `. These +fields allow information storage and management by adding values. + +.. admonition:: Property vs. regular fields + + Properties act as pseudo-fields; they behave like regular fields but are not saved as columns in + the database. They also rely on a defined :ref:`parent record `. + + .. example:: + Adding a property to a *task* inserts a field in *all tasks* within the *same + project* while other projects' tasks remain unaffected. + +.. _property_field/add: + +Add property fields +------------------- + +To add a first property field to a :ref:`form view `, click the +:icon:`fa-cog` (:guilabel:`Actions`) icon, then select :icon:`fa-cogs` :guilabel:`Add Properties`. + +In the popover, enter the property's :guilabel:`Label`, choose a :guilabel:`Field Type`, and then +configure the field based on the selected type: + +.. list-table:: + :header-rows: 1 + :widths: 15 30 55 + + * - Field type + - Use + - Options + * - :ref:`Text ` + - Short text on a single line + - Enter a :guilabel:`Default Value` if desired. + * - :ref:`Checkbox ` + - Checked or unchecked status + - Choose the :guilabel:`Default State`. + * - :ref:`Integer ` + - Integer numbers (:dfn:`positive, negative, or zero, without a decimal`) + - Enter a :guilabel:`Default Value` if desired. + * - :ref:`Decimal ` + - Decimal numbers (:dfn:`positive, negative, or zero, with a decimal`) + - Enter a :guilabel:`Default Value` if desired. + * - :ref:`Date ` + - Selection of a date on a calendar + - Select a :guilabel:`Default Value` if desired. + * - :ref:`Date & Time ` + - Selection of a date on a calendar and a time on a clock + - Select a :guilabel:`Default Value` if desired. + * - :ref:`Selection ` + - Selection of a value from a group of predefined values + - Add a selectable option by clicking :icon:`fa-plus` :guilabel:`Add a Value` and entering the + :guilabel:`Option Name`. + + If desired, set an option as default by clicking the :icon:`fa-star-o` + (:guilabel:`Select Default`) button. + + Reorder the options by dragging and dropping them using the :icon:`oi-draggable` + (:guilabel:`drag handle`) button. + + Delete an option by clicking the :icon:`fa-trash-o` (:guilabel:`Remove Property`) button. + * - :ref:`Tags ` + - Selection of multiple values in the form of tags + - Enter a :guilabel:`Tag` name and press `Enter` to save it. + + Change a tag's color by clicking it and selecting another one. + * - :ref:`Many2one ` + - Selection of a single record from another model + - Enter the :guilabel:`Model` name. Configure its :ref:`Domain ` to + filter records if needed. + + Select a :guilabel:`Default Value` if desired. + * - :ref:`Many2many ` + - Selection of multiple records from another model + - Enter the :guilabel:`Model` name. Configure its :ref:`Domain ` to + filter records if needed. + + Select a :guilabel:`Default Value` if desired. + * - :guilabel:`Separator` + - Group several properties under a foldable label + - + +Click outside the popover to save the added property. + +.. note:: + - Select whether to display the property in the Kanban, List, or Calendar views cards for every + field with the :guilabel:`Display in Cards` option. + - To add another property, click :icon:`fa-plus` :guilabel:`Add a Property` at the bottom of the + form while in :icon:`fa-cogs` :guilabel:`Add Properties` mode. + +.. tip:: + To edit an existing property, hover the cursor over the property: + + - Click the :icon:`fa-pencil` (:guilabel:`pencil`) button to open a popover and modify the + property. In the popover, click the :icon:`fa-chevron-up` (up) or :icon:`fa-chevron-down` + (down) chevron to move a property upwards or downwards. + - Click :icon:`fa-trash` :guilabel:`Delete`, then :guilabel:`Delete` to delete it. Deleting + a property is permanent. + - Use the :icon:`oi-draggable` (:guilabel:`drag handle`) icon to drag and drop the property to + reorder or regroup. + +.. _property-fields/properties-apps: + +Properties across apps +---------------------- + +Property fields can be defined in the :ref:`form view ` of multiple +models. Once set, the property is shared by all records that are linked to the same *parent*. + + .. list-table:: + :widths: 20 40 40 + :header-rows: 1 + :stub-columns: 1 + + * - App + - Model + - Parent + * - :guilabel:`Accounting` + - :ref:`Asset/Revenue Recognition ` + + :doc:`Loan ` + - :ref:`Asset model ` + + :ref:`Journal ` + * - :guilabel:`Appraisals` + - :ref:`Employee Appraisal ` + - :ref:`Department ` + * - :guilabel:`CRM` + - :doc:`Lead/Opportunity ` + - :ref:`Sales team ` + * - :guilabel:`Employees` + - :ref:`Employee ` + - :ref:`Company ` + * - :guilabel:`Events` + - :doc:`Event Registration ` + - :ref:`Event ` + * - :guilabel:`Fleet` + - :doc:`Vehicle ` + - :ref:`Vehicle model ` + * - :guilabel:`Frontdesk` + - :ref:`Frontdesk Visitors ` + - :ref:`Station ` + * - :guilabel:`Helpdesk` + - :ref:`Ticket ` + - :ref:`Helpdesk team ` + * - :guilabel:`Inventory` + - :ref:`Lot/Serial ` + + :doc:`Transfer + ` + + :ref:`Batch Transfer ` + - :ref:`Product variant ` + + :ref:`Operation type ` + + :ref:`Operation type ` + * - :guilabel:`Knowledge` + - :ref:`Knowledge Article ` + - :ref:`Parent article ` + * - :guilabel:`Maintenance` + - :ref:`Maintenance Equipment ` + - :ref:`Equipment category ` + * - :guilabel:`Meeting Rooms` + - Room + - Office + * - :guilabel:`Planning` + - :ref:`Shift ` + - :ref:`Role ` + * - :guilabel:`Project` / :guilabel:`Field Service` + - :ref:`Task ` + - :ref:`Project ` + * - :guilabel:`Recruitment` + - :ref:`Applicant ` + + :ref:`Job Position ` + + Candidate + - :ref:`Job position ` + + :ref:`Company ` + + :ref:`Company ` + * - :guilabel:`Repairs` + - :ref:`Repair order ` + - :ref:`Company ` + * - :guilabel:`Sales` / etc. + - Product + - Category diff --git a/content/applications/essentials/search.rst b/content/applications/essentials/search.rst index f8b1793fbd..0abd8e9470 100644 --- a/content/applications/essentials/search.rst +++ b/content/applications/essentials/search.rst @@ -197,8 +197,8 @@ Previous Period` and :guilabel:`(Time Filter): Previous Year`. .. important:: For some reports, the :guilabel:`Comparison` section **only** appears in the search bar drop-down - menu if one (or more) time periods have been selected in the :guilabel:`Filters` column. This is - because there is nothing to compare if no time period is specified. + menu if one (or more) time periods have been selected in the :guilabel:`Filters` column. This is + because there is nothing to compare if no time period is specified. Additionally, some reports only allow use of the :guilabel:`Comparison` feature when the :icon:`fa-pie-chart` :guilabel:`(Pie Chart)` graph type or the :icon:`oi-view-pivot` @@ -260,19 +260,47 @@ following options: - :guilabel:`Filter name`: Name of the favorited search. - :guilabel:`Default filter`: Sets the favorited search as the default filter for the view. -- :guilabel:`Shared`: Makes the favorited search available to all users. Otherwise, by default, the - favorited search is only available to the user who created it. Once the options are set, click :guilabel:`Save` to save the favorited search. .. image:: search/favorites.png :alt: Saving a favorite search on the Sales Analysis report. + :scale: 80% -Saved favorites can be accessed by clicking the :icon:`fa-trash` :guilabel:`(delete)` icon in the -search bar, then selecting the saved filter in the :guilabel:`Favorites` drop-down menu. To remove a -saved favorite, click the :icon:`fa-trash` :guilabel:`(delete)` icon next to the favorited search. +Favorited searches are accessed by clicking the :icon:`fa-caret-down` :guilabel:`(dropdown)` icon +in the search bar, and are shown under :icon:`fa-star` :guilabel:`Favorites`. Searches that are only +visible to the current user, i.e., that are not shared, are shown first, while any :ref:`shared +favorites `, whether created by the current user or another user, are shown +in a second section. + +To edit, archive, or delete a favorited search, hover over the search name in the list of favorites +and click :icon:`fa-pencil` :guilabel:`(Edit favorite)`. The following fields can be modified: +:guilabel:`Filter Name`, :ref:`Shared with `, :guilabel:`Default Filter`, +:guilabel:`Domain`. To archive or delete the favorite, click :icon:`fa-cog` :guilabel:`(Actions)` +then :icon:`oi-archive` :guilabel:`Archive` or :icon:`fa-trash` :guilabel:`Delete`, as appropriate. .. tip:: - To view *all* favorited searches, first activate :ref:`developer-mode`, and navigate to - :menuselection:`Settings app --> Technical --> User Interface: User-defined Filters`. From here, - all favorited searches can be viewed, edited, archived, or deleted. + - When a favorited search is in use, additional filters or groups can be used to further refine + the search. The conditions applied by the favorited search can also be modified by hovering + over the :icon:`fa-star` :guilabel:`(star)` beside the search name then clicking the + :icon:`fa-cog` :guilabel:`(cog)` icon. These changes only affect the current search. + - To edit the grouping or sorting of a favorited search, :ref:`activate developer mode + ` when editing the search, then modify the :guilabel:`Context` or + :guilabel:`Sort` fields as needed. + - To view *all* favorited searches, with developer mode activated, navigate to + :menuselection:`Settings app --> Technical --> User-defined Filters`. From here, all favorited + searches can be viewed, edited, archived, or deleted. + +.. _search/favorites-share: + +Share a favorited search +------------------------ + +By default, a favorited search is only available to the user who created it. To share a favorited +search with other users, click :guilabel:`Edit` when creating the favorite, or, for an existing +favorite, click :icon:`fa-pencil` :guilabel:`(Edit favorite)` after hovering over the search name in +the list of favorites. + +In the :guilabel:`Shared with` field, select the relevant users from the drop-down menu, then click +:icon:`fa-cloud-upload` :guilabel:`(Save manually)`. The favorite is now visible for all selected +users under :icon:`fa-star` :guilabel:`Favorites`. diff --git a/content/applications/essentials/search/favorites.png b/content/applications/essentials/search/favorites.png index e9a73b526e..d72ea0890c 100644 Binary files a/content/applications/essentials/search/favorites.png and b/content/applications/essentials/search/favorites.png differ diff --git a/content/applications/finance.rst b/content/applications/finance.rst index afe4b763c4..636189bd59 100644 --- a/content/applications/finance.rst +++ b/content/applications/finance.rst @@ -6,7 +6,8 @@ Finance .. toctree:: - finance/accounting - finance/expenses - finance/payment_providers - finance/fiscal_localizations + finance/accounting + finance/expenses + finance/payment_providers + finance/fiscal_localizations + finance/esg diff --git a/content/applications/finance/accounting.rst b/content/applications/finance/accounting.rst index 80a7a5d437..7a5388595b 100644 --- a/content/applications/finance/accounting.rst +++ b/content/applications/finance/accounting.rst @@ -4,12 +4,10 @@ Accounting and Invoicing ======================== -**Odoo Invoicing** is a standalone invoicing app to create invoices, send them to your customers, -and manage payments. - -**Odoo Accounting** is a full featured accounting app. Accountant productivity is at the core of its -development with features such as AI-powered invoice recognition, synchronization with your bank -accounts, smart matching suggestions, etc. +Odoo Invoicing is a standalone app designed to create invoices, send them to customers, and manage +payments. It also handles flows involving vendor bills. On the other hand, the Accounting app is a +comprehensive accounting solution that allows the same actions and includes additional features such +as standard financial reports, bank reconciliation, budgets, asset management, and more. .. seealso:: `Odoo Tutorials: Accounting `_ @@ -52,6 +50,8 @@ accounts, smart matching suggestions, etc. Reporting, declarations, and analytic accounting +.. _accounting/double-entry-booking: + Double-entry bookkeeping ======================== @@ -66,6 +66,8 @@ always balance. .. seealso:: :doc:`Accounting Cheat Sheet ` +.. _accounting/accrual-cash: + Accrual and cash basis ====================== @@ -81,14 +83,18 @@ expense either when the transaction occurs (accrual basis) or when the payment i Multi-company ============= -Several companies can be managed within the same database. Each company has its :doc:`chart of -accounts `, but it is possible to share accounts -between them for scenarios in which such a configuration would be required. Users can then -access several companies but only work on a single company's accounting at a time. +:doc:`Multiple companies <../general/companies/multi_company>` can be managed within the same +database. Each company has its own :doc:`chart of accounts +`, but :ref:`accounts can be shared +`, which is useful when viewing consolidation reports. Users can view +records and reports from multiple companies simultaneously but can only work on a single company's +accounting at a time. .. seealso:: - - :ref:`Shared Accounts Feature ` - - :doc:`Consolidation ` + - :doc:`Multi-company ` + - :ref:`Inter-company transactions ` + +.. _accounting/multi-currency: Multi-currency environment ========================== @@ -102,32 +108,80 @@ gains and losses after reconciling the journal items. .. seealso:: :doc:`Manage a bank in a foreign currency ` -Branch management -================= +.. _accounting/branches: + +Branches +======== + +Parent :doc:`companies ` and their :ref:`branches +` can be managed within a single database, operating under shared +accounting and reporting rules, including the following: + +- The parent company’s :doc:`chart of accounts `, + :doc:`main currency `, and :doc:`taxes ` + apply to all branches. +- Branches can manage their own dedicated journals and related records. +- The parent company manages a common :ref:`fiscal period `, so its + :ref:`lock and closing dates ` apply across all branches. However, + branches may set earlier lock dates if needed. +- The parent company can access all :doc:`reports `, :doc:`invoices + `, :doc:`bills `, etc., from its branches, + while each branch can only view its own data. + +.. note:: + The :doc:`Fiscal localization ` package is set on the parent company. + +.. warning:: + Adding a branch to a company enables :doc:`multi-company functions + <../general/companies/multi_company>`. + + For more information, refer to `Odoo's pricing page `_ or + contact your Odoo account manager. + +.. _accounting/branch/reporting: + +Reporting +--------- + +The parent company consolidates accounting operations from all branches, providing a centralized +view of :doc:`financial reports `, such as profit and loss or balance sheets. + +.. _accounting/branch/vat: + +VAT +--- + +Each company and branch must be configured with its own legal information, including a VAT number +when applicable. Depending on the structure, branches may share the parent company's VAT number or +have their own, resulting in a common or separate :doc:`VAT return +`. + +This flexible setup allows users to generate individual reports and tax returns for each entity if +needed. -Multiple branches can be managed thanks to multi-company hierarchies. This allows to post journal -entries on each branch as well as setting up a common lock date managed by the main company. +.. _accounting/international-standards: International standards ======================= -Odoo Accounting supports more than 70 countries. It provides the central standards and mechanisms -common to all nations, and thanks to country-specific modules, local requirements are fulfilled. -Fiscal positions exist to address regional specificities like the chart of accounts, taxes, or any -other requirements. +Odoo Accounting supports over 100 countries and provides standardized features and mechanisms +applicable across all regions. Country-specific modules are included to comply with local accounting +regulations. :doc:`Fiscal localizations ` handle regional requirements, such +as charts of accounts, taxes, or any other legal obligations. -.. seealso:: - :doc:`Fiscal localization packages ` +.. _accounting/accounts-receivable-payable: Accounts receivable and payable =============================== -By default, there is a single account for the account receivable entries and one for the account -payable entries. As transactions are linked to your **contacts**, you can run a report per customer, -vendor, or supplier. +By default, one account is designated for accounts receivable entries and another for accounts +payable entries. As transactions are linked to **contacts**, it is possible to run a report per +customer, vendor, or supplier. + +The **Partner Ledger** report displays the balance of customers and suppliers. To access it, go to +:menuselection:`Accounting --> Reporting --> Partner Ledger`. -The **Partner Ledger** report displays the balance of your customers and suppliers. It is available -by going to :menuselection:`Accounting --> Reporting --> Partner Ledger`. +.. _accounting/reporting: Reporting ========= @@ -144,15 +198,17 @@ real-time: | +----------------------------------+ | | Cash flow statement | | +----------------------------------+ -| | Tax report | +| | Executive summary | +| +----------------------------------+ +| | Tax return | | +----------------------------------+ -| | ES sales list | +| | EC sales list | +------------+----------------------------------+ | Audit | General ledger | | +----------------------------------+ | | Trial balance | | +----------------------------------+ -| | Journal report | +| | Journal audit | | +----------------------------------+ | | Intrastat report | | +----------------------------------+ @@ -166,13 +222,23 @@ real-time: +------------+----------------------------------+ | Management | Invoice analysis | | +----------------------------------+ +| | Analytic report | +| +----------------------------------+ +| | Audit trail | +| +----------------------------------+ +| | Budget report | +| +----------------------------------+ | | Unrealized currency gains/losses | | +----------------------------------+ +| | Deferred revenue | +| +----------------------------------+ +| | Deferred expense | +| +----------------------------------+ | | Depreciation schedule | | +----------------------------------+ | | Disallowed expenses | | +----------------------------------+ -| | Budget analysis | +| | Loans analysis | | +----------------------------------+ | | Product margins | | +----------------------------------+ @@ -182,31 +248,32 @@ real-time: .. tip:: :doc:`Create and customize reports ` with Odoo's report engine. -Tax report ----------- +.. _accounting/tax-report: -Odoo computes all accounting transactions for the specific tax period and uses these totals to -calculate the tax obligation. +Tax return +---------- -.. important:: - Once the tax report has been generated for a period, Odoo locks it and prevents the creation of - new journal entries involving VAT. Any correction to customer invoices or vendor bills has to - be recorded in the next period. +In the :ref:`Tax return `, Odoo computes all accounting transactions for the +specific tax period and uses these totals to calculate the tax obligation. .. note:: Depending on the country's localization, an XML version of the tax report can be generated to be uploaded to the VAT platform of the relevant taxation authority. +.. _accounting/bank-synchronization: + Bank synchronization ==================== -The bank synchronization system directly connects with your bank institution to automatically -import all transactions into your database. It gives an overview of your cash flow without logging +The bank synchronization system directly connects with banking institutions to automatically +import all transactions into the database. It gives an overview of the cash flow without logging into an online banking system or waiting for paper bank statements. .. seealso:: :doc:`Bank synchronization ` +.. _accounting/inventory-valuation: + Inventory valuation =================== @@ -217,6 +284,8 @@ available methods are standard price, average price, :abbr:`LIFO (Last-In, First .. seealso:: :doc:`../inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config` +.. _accounting/retained-earnings: + Retained earnings ================= @@ -227,13 +296,13 @@ and loss balance is automatically reported on the balance sheet report. .. seealso:: :doc:`Accounting Cheat Sheet ` -.. _fiduciaries: +.. _accounting/fiduciaries: Fiduciaries =========== The :guilabel:`Accounting Firms` mode can be activated by going to :menuselection:`Accounting --> -Configuration --> Settings --> Accounting Firms mode`. When enabled: +Configuration --> Settings`. When enabled: - The document's sequence becomes editable on all documents; - The :guilabel:`Total (tax incl.)` field appears to speed up and control the encoding by automating @@ -241,6 +310,29 @@ Configuration --> Settings --> Accounting Firms mode`. When enabled: - :guilabel:`Invoice Date` and :guilabel:`Bill Date` are pre-filled when encoding a transaction. - A :guilabel:`Quick encoding` option is available for customer invoices and vendor bills. +.. _accounting/accountant-access-rights: + +Accountant access rights +======================== + +To grant access to the company's accountant, :ref:`add the accountant as a new user +` and configure the appropriate :doc:`access rights +<../general/users/access_rights>` in the :guilabel:`Accounting` section to enable access to the +company's financial data: + +- :guilabel:`Accounting`: Select :guilabel:`Accountant`. +- :guilabel:`Bank`: Allow bank account validation. + +.. Note:: + Adding an accountant as a new user in :doc:`Odoo Online <../../administration/odoo_online>` is + free if the accountant has an Odoo account registered with the same email address as the one + listed for the company user. However, :doc:`Odoo.sh <../../administration/odoo_sh>` and + :doc:`Odoo On-premise <../../administration/on_premise>` may involve extra charges for each + additional user. For more pricing information, see + `Odoo's pricing `_. + +For a multi-company environment, set the appropriate :ref:`access `. + .. toctree:: :titlesonly: diff --git a/content/applications/finance/accounting/bank.rst b/content/applications/finance/accounting/bank.rst index 1513d09c6d..a9a5f8dde8 100644 --- a/content/applications/finance/accounting/bank.rst +++ b/content/applications/finance/accounting/bank.rst @@ -13,7 +13,7 @@ account. Both the journal and the account are automatically created and configur a bank account. .. note:: - Cash journals and accounts must be configured manually. + :ref:`Cash journals ` and accounts must be configured manually. Bank journals are displayed by default on the :guilabel:`Accounting Dashboard` in the form of cards which include action buttons. @@ -29,9 +29,9 @@ Manage bank and cash accounts Connect a bank for automatic synchronization -------------------------------------------- -To connect your bank account to your database, go to :menuselection:`Accounting --> Configuration ---> Add a Bank Account`, select your bank in the list, click on :guilabel:`Connect`, and follow the -instructions. +To connect your bank account to your database, go to the :guilabel:`Accounting Dashboard` and on the +kanban card of an unconnected bank, click :guilabel:`Search over 26000 banks`. Select your bank from +the list, click on :guilabel:`Connect`, and follow the instructions. .. seealso:: :doc:`bank/bank_synchronization` @@ -44,153 +44,18 @@ Create a bank account If your banking institution is not available in Odoo, or if you don't want to connect your bank account to your database, you can configure your bank account manually. -To manually add a bank account, go to :menuselection:`Accounting --> Configuration --> Add a Bank -Account`, click on :guilabel:`Record transactions manually` (at the bottom right), fill out the bank -information, and click :guilabel:`Create`. +To manually add a bank account, go to the :guilabel:`Accounting Dashboard` and on the kanban card of +an unconnected bank, click :guilabel:`Search over 26000 banks`. Then, click on :guilabel:`Record +transactions manually` (at the bottom right), fill out the bank information, and click +:guilabel:`Create`. .. note:: - Odoo automatically detects the bank account type (e.g., IBAN) and enables some features accordingly. - - A default bank journal is available and can be used to configure your bank account by going to - :menuselection:`Accounting --> Configuration --> Accounting: Journals --> Bank`. Open it and - edit the different fields to match your bank account information. - -Create a cash journal ---------------------- - -To create a new cash journal, go to :menuselection:`Accounting --> Configuration --> Accounting: -Journals`, click on :guilabel:`Create` and select :guilabel:`Cash` in the :guilabel:`Type` field. - -For more information on the accounting information fields, read the -:ref:`accounting/bank/configuration` section of this page. - -.. note:: - A default cash journal is available and can be used straight away. You can review it by going to - :menuselection:`Accounting --> Configuration --> Accounting: Journals --> Cash`. - -Edit an existing bank or cash journal -------------------------------------- - -To edit an existing bank journal, go to :menuselection:`Accounting --> Configuration --> Accounting: -Journals` and select the journal you want to modify. - -.. _accounting/bank/configuration: - -Configuration -============= - -You can edit the accounting information and bank account number according to your needs. - -.. image:: bank/bank-journal-config.png - :alt: Manually configure your bank information - -.. seealso:: - - :doc:`get_started/multi_currency` - - :doc:`bank/transactions` - - `Bank configuration `_ - -.. _accounting/bank/suspense: - -Suspense account ----------------- - -Bank statement transactions are posted on the suspense account until they are reconciled. At any -moment, the suspense account's balance in the general ledger shows the balance of transactions that -have not yet been reconciled. - -.. note:: - When a bank transaction is reconciled, the journal entry is modified to replace the bank suspense - account with the account of the journal item it is reconciled with. This account is usually the - :ref:`outstanding receipts or payments account ` if - reconciling with a registered payment or the account receivable or payable if reconciling with - an invoice or bill directly. - -Profit and loss accounts ------------------------- - -The :guilabel:`Profit Account` is used to register a profit when the ending balance of a cash -register differs from what the system computes, while the :guilabel:`Loss Account` is used to -register a loss when the ending balance of a cash register differs from what the system computes. - -Currency --------- - -You can edit the currency used to enter the transactions. - -.. seealso:: - :doc:`get_started/multi_currency` - -.. _accounting/bank/account-number: - -Account number --------------- - -If you need to **edit your bank account details**, click on the external link arrow next to your -:guilabel:`Account Number`. On the account page, click on the external link arrow next to your -:guilabel:`Bank` and update your bank information accordingly. These details are used when -registering payments. - -.. image:: bank/bank-account-number.png - :alt: Edit your bank information - -Bank feeds ----------- - -:guilabel:`Bank Feeds` defines how the bank transactions are registered. Three options are -available: - -- :guilabel:`Undefined yet`, which should be selected when you don’t know yet if you will - synchronize your bank account with your database or not. -- :guilabel:`Import (CAMT, CODA, CSV, OFX, QIF)`, which should be selected if you want to import - your bank statements and transactions using a different format. -- :guilabel:`Automated Bank Synchronization`, which should be selected if your bank is synchronized - with your database. - -.. seealso:: - - :doc:`bank/bank_synchronization` - - :doc:`bank/transactions` - -.. _accounting/bank/outstanding-accounts: - -Outstanding accounts -==================== - -By default, payments in Odoo do not create journal entries, but they can easily be configured to -create journal entries using **outstanding accounts**. - -- An **outstanding receipts account** is where incoming payments are posted until they are linked - with incoming bank transactions. -- An **outstanding payments account** is where outgoing payments are posted until they are linked - with outgoing bank transactions. - -These accounts are usually of :ref:`type ` :guilabel:`Current Assets` and -:guilabel:`Current Liabilities`. - -Payments that are registered in Odoo are posted to the outstanding receipts and outstanding accounts -until they are reconciled. At any moment, the outstanding receipts account's balance in the general -ledger shows the balance of registered incoming payments that have not yet been reconciled, and the -outstanding payments account's balance in the general ledger shows the balance of registered -outgoing payments that have not yet been reconciled. - -Bank and cash journal configuration ------------------------------------ - -To configure payments to create journal entries, set outstanding accounts for the journal's payment -methods. This can be done for any journal with the :ref:`type ` -:guilabel:`Bank` or :guilabel:`Cash`. - -To configure the outstanding accounts for a journal's payment methods, first go to -:menuselection:`Accounting --> Configuration --> Journals` and select a bank or cash journal. In the -:guilabel:`Incoming Payments` and :guilabel:`Outgoing Payments` tabs, set :guilabel:`Outstanding -Receipts accounts` and :guilabel:`Outstanding Payments accounts` for each payment method that you -want to create journal entries. - -.. note:: - - If the main bank account of the journal is added as an outstanding receipts account or - outstanding payments account, when a payment is registered, the invoice or bill's status is - directly set to :guilabel:`Paid`. - - If the outstanding receipts or outstanding payments account for a payment method is left blank, - registering a payment with that payment method will not create any journal entry. + - A default :ref:`bank journal ` is available and can be used to + configure your bank account by going to :menuselection:`Accounting --> Configuration --> + Accounting: Journals --> Bank`. Open it and edit the different fields to match your bank + account information. .. toctree:: :titlesonly: diff --git a/content/applications/finance/accounting/bank/bank-journal-config.png b/content/applications/finance/accounting/bank/bank-journal-config.png deleted file mode 100644 index e60972fc1d..0000000000 Binary files a/content/applications/finance/accounting/bank/bank-journal-config.png and /dev/null differ diff --git a/content/applications/finance/accounting/bank/bank_synchronization.rst b/content/applications/finance/accounting/bank/bank_synchronization.rst index 47ffe7e435..318599f626 100644 --- a/content/applications/finance/accounting/bank/bank_synchronization.rst +++ b/content/applications/finance/accounting/bank/bank_synchronization.rst @@ -131,7 +131,7 @@ Finally, make sure all your users refresh their Odoo page by pressing CTRL+F5. - All previous synchronizations are disconnected during the installation and will not work anymore. To view them, activate the :ref:`developer mode ` and go to - :menuselection:`Accounting --> Configuration --> Online Synchronization`). It is not possible + :menuselection:`Accounting --> Configuration --> Online Synchronization`. It is not possible to resynchronize these connections; you have to make new ones. - Do not uninstall the `account_online_sync` module, which is the previous module for online synchronization. The new one overrides it. diff --git a/content/applications/finance/accounting/bank/internal_transfers.rst b/content/applications/finance/accounting/bank/internal_transfers.rst index a331bc259e..17cf584e42 100644 --- a/content/applications/finance/accounting/bank/internal_transfers.rst +++ b/content/applications/finance/accounting/bank/internal_transfers.rst @@ -26,7 +26,7 @@ select the :guilabel:`Internal Transfers` :doc:`reconciliation model ` with -your business records, such as :doc:`customer invoices <../customer_invoices>`, :doc:`vendor bills -<../vendor_bills>`, and :doc:`payments <../payments>`. Not only is this compulsory for most -businesses, but it also offers several benefits, such as reduced risk of errors in financial -reports, detection of fraudulent activities, and improved cash flow management. - -Thanks to the bank :doc:`reconciliation models `, Odoo pre-selects the -matching entries automatically. +**Bank reconciliation** is the process of validating :doc:`bank transactions `. Many +of these transactions are matched with counterpart items related to business records such as +:doc:`customer invoices <../customer_invoices>`, :doc:`vendor bills <../vendor_bills>`, and +:doc:`payments <../payments>`, while others that may not have a matching counterpart item (such as +bank fees) can be written off :ref:`manually ` or with +:ref:`reconciliation models `. Not only is bank reconciliation +compulsory for most businesses, but it also offers several benefits, such as reduced risk of errors +in financial reports, detection of fraudulent activities, and improved cash flow management. + +Thanks to the :ref:`default matching rules ` and customizable +bank :doc:`reconciliation models `, Odoo selects the matching items +automatically when possible. .. seealso:: - `Odoo Tutorials: Bank reconciliation - `_ + `_ - :doc:`bank_synchronization` - :doc:`transactions` @@ -22,123 +26,272 @@ matching entries automatically. Bank reconciliation view ======================== -To access a bank journal's **reconciliation view**, go to your :guilabel:`Accounting Dashboard` and +To access a journal's :guilabel:`Bank Matching` view, go to the :guilabel:`Accounting Dashboard` and either: -- click the journal name (e.g., :guilabel:`Bank`) to display all transactions, including those - previously reconciled or -- click the :guilabel:`Reconcile items` button to display all transactions Odoo pre-selected for - reconciliation. You can remove the :guilabel:`Not Matched` filter from the search bar to include - previously reconciled transactions. +- click the journal name (e.g., :guilabel:`Bank`) or its :guilabel:`Transactions` button to display + all transactions, including those previously reconciled, or +- click the :guilabel:`x to reconcile` button to display only unreconciled transactions. To include + previously reconciled transactions, remove the :guilabel:`Not Matched` filter from the search bar. .. image:: reconciliation/bank-card.png - :alt: Reaching the bank reconciliation tool from your accounting dashboard + :alt: Reaching the bank reconciliation tool from the accounting dashboard -The bank reconciliation view is structured into three distinct sections: transactions, counterpart -entries, and resulting entry. +The :guilabel:`Bank Matching` view is composed of lines for each transaction of the journal with the +newest displayed first. Each transaction has a date, a label, a partner (if set), :ref:`action +buttons `, and the transaction amount. Each line can be +expanded to show additional information and buttons. .. image:: reconciliation/user-interface.png - :alt: The user interface of the reconciliation view of a bank journal. + :alt: The user interface of the bank matching view of a bank journal. + +.. note:: + Once a :doc:`transaction ` is reconciled, the suggested action button(s) is + replaced with the counterpart entry/entries it was matched with or the account(s) it was written + off to. + +.. _accounting/reconciliation/transactions: Transactions - The transactions section on the left shows all bank transactions, with the newest displayed - first. Click a transaction to select it. - -Counterpart entries - The counterpart entries section on the bottom right displays the options to match the selected - bank transaction. Multiple tabs are available, including - :ref:`reconciliation/existing-entries`, :ref:`reconciliation/batch-payments`, - :ref:`reconciliation/manual-operations`, and :guilabel:`Discuss`, which contains the chatter for - the selected bank transaction. - -Resulting entry - The resulting entry section on the top right displays the selected bank transaction matched with - the counterpart entries and includes any remaining debits or credits. In this section, you can - validate the reconciliation or mark it as :guilabel:`To Check`. Any :ref:`reconciliation model - buttons ` are also available in the resulting entry section. +------------ + +Every :doc:`transaction ` is linked to a journal entry that debits/credits the +journal's main account and its suspense account until it is fully reconciled. At that point, the +suspense account is replaced with the account of the counterpart item or, in the case of +:ref:`manual matching `, the selected account. + +.. _accounting/reconciliation/action-buttons: + +Possible action buttons +~~~~~~~~~~~~~~~~~~~~~~~ + +Up to two suggested action buttons are available as primary buttons, but all available action +buttons are displayed when the transaction is expanded. The following action buttons are available +depending on the details of the transaction: + +- :guilabel:`Set Partner`: Open a search view to add a partner to the transaction. +- :guilabel:`Set Account`: Open a search view to manually select an account to write off the full + amount of the transaction with this account. If necessary, :ref:`edit the line + ` to change the amount. +- :guilabel:`Receivable`: Write off the transaction to the receivable account of the partner. +- :guilabel:`Sales`: Open a list view of sales orders belonging to the transaction's + :guilabel:`Partner` (or proceed directly to the form view if only one relevant sales order + exists). Select the relevant sales order(s) and click :guilabel:`Create Invoices`, then return to + the :guilabel:`Bank Matching` view and match the invoice(s) using the :guilabel:`Reconcile` action + button. +- :guilabel:`Payable`: Write off the transaction to the payable account of the partner. +- :guilabel:`Reconcile`: Open a search view of existing items from records such as customer + invoices, vendor bills, and payments. Select one or multiple items to add counterpart items with + the corresponding accounts of those items. +- :guilabel:`Batches`: Open a short list of :doc:`batch payments <../payments/batch>`. To view all + batch payments, click :guilabel:`Search More ...`. Select a batch payment to add a counterpart + item for each payment of the batch with the corresponding account of each payment. +- :doc:`reconciliation_models`: Each manual reconciliation model that could apply to the transaction + is displayed. Click the reconciliation model's action button to generate the counterpart items + defined on the reconciliation model. + +.. note:: + To remove the partner from a transaction, click the :icon:`fa-times` :guilabel:`(close)` icon + next to the partner's name. + +Click the :icon:`fa-chevron-down` :guilabel:`(chevron down)` button next to the possible action +buttons of an expanded line to display any of the above action buttons that are hidden due to space +limitations, as well as the following: + +- :guilabel:`Upload bills`: Upload one or more bills to be :doc:`digitized + <../vendor_bills/invoice_digitization>`. After digitization, the bills are available for matching + via the :guilabel:`Reconcile` action button. +- :guilabel:`Manage Models`: Open the list view of :doc:`reconciliation_models`. +- :guilabel:`Open Journal Entry`: Open the journal entry of this transaction. +- :guilabel:`Delete Transaction`: Delete this transaction. + +.. note:: + Uploading bills from the :guilabel:`Bank Matching` view does not automatically reconcile them + with the active transaction. + +.. seealso:: + :doc:`../../../essentials/in_app_purchase` .. _accounting/reconciliation/reconcile: Reconcile transactions ====================== -Transactions can be matched automatically with the use of :doc:`reconciliation models -`, or they can be matched with :ref:`existing entries -`, :ref:`batch payments `, -:ref:`manual operations `, and :ref:`reconciliation model buttons -`. +When possible, Odoo automatically reconciles transactions based on their fields. -#. Select a transaction among unmatched bank transactions. +If no partner is set on the transaction, the transaction's :guilabel:`Label` is compared with the +:guilabel:`Number`, :guilabel:`Customer Reference`, :guilabel:`Bill Reference`, and +:guilabel:`Payment Reference` of existing invoices, bills, and payments. + +If a partner is set on the transaction, the transaction is instead matched with invoices, bills, and +payments of the partner based on the :guilabel:`Amount`. The following rules are used in a +sequential order to identify and apply a match: + +- Exact match +- Discounted match: for payment terms with discounts for early payments +- Tolerance match: within 3% to account for merchant fees, rounding differences, and user errors +- Currency match: when the transaction is in a different currency than the invoice, bill, or + payment (with a 3% tolerance for exchange rate differences) +- Amount in label: if the invoice :guilabel:`Amount` is found in the transaction's + :guilabel:`Label` + +In addition to using these fixed matching rules, transactions can be matched automatically with the +use of :doc:`reconciliation models `. Otherwise, reconcile transactions +manually by following these steps: + +#. Expand the desired line among unmatched bank transactions to display all available action + buttons. #. Define the counterpart. There are several options for defining a counterpart, including - :ref:`matching existing entries `, :ref:`manual operations - `, :ref:`batch payments `, and - :ref:`reconciliation model buttons `. -#. If the resulting entry is not fully balanced, balance it by adding another existing counterpart - entry or writing it off with a :ref:`manual operation `. -#. Click the :guilabel:`Validate` button to confirm the reconciliation and move to the next - transaction. + :ref:`matching existing items `, :ref:`manually setting + the account `, matching with :doc:`batch payments + <../payments/batch>`, and using :ref:`reconciliation model buttons + `. +#. If the resulting entry is not fully balanced, add another existing counterpart item or write it + off by :ref:`setting the account ` of the remaining + amount. + +.. _accounting/reconciliation/existing-items: + +Existing items +-------------- + +To reconcile transactions with existing items related to records such as customer invoices, vendor +bills, and payments, click the :guilabel:`Reconcile` action button, select the matching journal +item(s) in the list, and click :guilabel:`Select`. + +.. note:: + If the :guilabel:`Partner` is set, this list is automatically filtered to only include items + related to that partner. .. tip:: - If you are not sure how to reconcile a particular transaction and would like to deal with it - later, use the :guilabel:`To Check` button instead. All transactions marked as :guilabel:`To - Check` can be displayed using the :guilabel:`To Check` filter. + Use the search bar within the :guilabel:`Search: Journal Items to Match` window to search for + specific journal items. + +If a transaction amount is lower than the invoice or bill it is reconciled with, the transaction is +fully reconciled, but the difference remains open on the counterpart item. The remaining amount can +be left open to be reconciled later or the invoice or bill can be marked as fully paid. To mark the +invoice or bill as fully paid, :ref:`edit ` the line, click +:guilabel:`fully paid`, and :guilabel:`Save`. To reverse this, :ref:`edit +` the line again, click :guilabel:`partial payment`, and +:guilabel:`Save`. + +If a transaction amount is greater than the invoice or bill it is reconciled with, the transaction +is only partially reconciled. The remaining balance can be reconciled as any other transaction +amount. .. note:: - Bank transactions are posted on the **journal's suspense account** until reconciliation. At this - point, reconciliation modifies the transaction journal entry by replacing the bank suspense - account with the corresponding receivable, payable, or outstanding account. + Existing items of draft entries can be matched. Eventual automatic moves (like currency exchange + or cash basis moves) are created in draft simultaneously with the reconciliation. Posting the + original entry also posts the automatic move. -.. _reconciliation/existing-entries: +.. _accounting/reconciliation/set-account: -Match existing entries ----------------------- +Set account +----------- -This tab contains matching entries Odoo automatically pre-selects according to the reconciliation -models. The entry order is based on :doc:`reconciliation models `, with -suggested entries appearing first. +If no existing item matches the selected transaction, you can still write off the transaction +manually: Click :guilabel:`Set Account`, then choose the appropriate account. To write off only part +of the transaction, :ref:`edit the line ` to reflect the correct +value and reconcile the remaining amount as desired. .. tip:: - The search bar within the :guilabel:`Match Existing Entries` tab allows you to search for - specific journal items. + If the partner is set, write the amount off to their receivable or payable account directly by + clicking the :guilabel:`Receivable` or :guilabel:`Payable` :ref:`action button + `. -.. _reconciliation/batch-payments: +.. _accounting/reconciliation/model: -Batch payments --------------- +Reconciliation models +--------------------- -:doc:`Batch payments <../payments/batch>` allow you to group different payments to ease -reconciliation. Use the :guilabel:`Batch Payments` tab to find batch payments for customers and -vendors. Similarly to the :guilabel:`Match Existing Entries` tab, the :guilabel:`Batch Payments` tab -has a search bar that allows you to search for specific batch payments. +Use :doc:`reconciliation models ` to create custom rules that can be applied +automatically or manually via custom buttons for operations that are frequently repeated. These +custom buttons allow you to quickly reconcile bank transactions manually and can also be combined +with other reconciliation models and with counterpart items when reconciling transactions. -.. _reconciliation/manual-operations: +.. example:: + An outgoing bank transaction for $103 is partially matched with a vendor bill for $100, leaving + $3 of the transaction still unreconciled. Use the :guilabel:`Bank Fees` reconciliation model to + create a new counterpart item for $3 and reconcile it with the remaining $3 of the bank + transaction. -Manual operations ------------------ +.. _accounting/reconciliation/edit: -If there is not an existing entry to match the selected transaction, you may instead wish to -reconcile the transaction manually by choosing the correct account and amount. Then, complete any -of the relevant optional fields. +Edit lines and unreconcile transactions +======================================= -.. tip:: - You can use the :guilabel:`fully paid` option to reconcile a payment, even in cases where only a - partial payment is received. A new line appears in the resulting entry section to reflect the - open balance registered on the Account Receivable by default. You can choose another - account by clicking on the new line in the resulting entry section and selecting the - :guilabel:`Account` to record the open balance. +To edit a counterpart item, expand the line, click the :icon:`fa-pencil` :guilabel:`(pencil)` icon, +and edit the necessary fields in :guilabel:`Edit Line` window. .. note:: - Lines are silently reconciled unless a write-off entry is required, which launches a - reconciliation wizard. + When the counterpart item is an existing journal item, some fields are read-only. + +If a transaction is partially matched with a counterpart item, use the link to mark the invoice as +:guilabel:`fully paid` or to switch back to a :guilabel:`partial payment`. + +To unreconcile a transaction, delete all counterpart items associated with the transaction by +clicking on the :icon:`fa-trash` :guilabel:`(trash)` icon. + +.. _accounting/reconciliation/netting: + +Netting +======= - .. image:: reconciliation/fully-paid.png - :alt: Click on fully paid to manually set an invoice as entirely paid. +Netting (also known as AP/AR offsetting) is the process of balancing incoming debts from and +outgoing debts to the same partner. Reconciling the incoming and outgoing debts creates a new +journal entry that balances the debts. Two main scenarios exist: -.. _reconciliation/button: +- :ref:`A bank transaction balances ` (either fully or + partially) the incoming and outgoing debts. +- :ref:`No bank transaction balances ` the incoming + and outgoing debts. This situation can occur either when the debts balance each other completely + or when the debts remain unbalanced. -Reconciliation model buttons ----------------------------- +.. _accounting/reconciliation/net-transaction: -Use a :doc:`reconciliation model ` button for manual operations that are -frequently used. These custom buttons allow you to quickly reconcile bank transactions manually and -can also be used in combination with existing entries. +Netting with bank transactions +------------------------------ + +When a bank transaction balances (either fully or partially) the incoming and outgoing debts, +reconcile the bank transaction from the :guilabel:`Bank Matching` view like any other :ref:`existing +items `: + +#. Click :guilabel:`Reconcile` on the transaction. +#. Select all the relevant counterpart items on both the payable and receivable side. +#. Click :guilabel:`Select`. +#. If a balance remains, depending on the details, the following situations are possible: + + - An invoice, bill, or other item is not fully reconciled, and the remaining balance can be + :ref:`reconciled ` with other bank transactions. + - The bank transaction itself is not fully reconciled, and the remaining balance can be + :ref:`reconciled ` as in any other situation. + +.. _accounting/reconciliation/net-no-transaction: + +Netting without bank transactions +--------------------------------- + +When no bank transaction balances the incoming and outgoing debts, there is nothing to reconcile +from the :guilabel:`Bank Matching` view. However, the debt amount is visible in both the account +receivable and the account payable. To balance these debts so that they no longer appear on the +partner ledger, follow these steps: + +#. Go to :menuselection:`Accounting --> Accounting --> Reconcile`. +#. Select the journal items that debit or credit the account receivable and account payable and + represent the debts to be netted. +#. Click :guilabel:`Reconcile`. +#. If the debts don't balance each other perfectly, a :guilabel:`Write-Off Entry` popup window + appears, allowing you to decide how to resolve the remaining balance: + + - Select :guilabel:`Allow partials` to only partially reconcile the account receivable and + account payable and leave the remaining balance open. + - Use a :doc:`reconciliation model button ` to write off the balance. + - Manually choose an :guilabel:`Account`, and optionally adjust the :guilabel:`Tax`, + :guilabel:`Journal`, :guilabel:`Label`, :guilabel:`Date`, and :guilabel:`To Check` fields. + +The items are then matched, and their balance is removed from the partner ledger, representing that +no payment is due for these debts. + +.. note:: + The workflow is the same whether there are only two equal debts in the receivable and payable + accounts or multiple debts in each account. diff --git a/content/applications/finance/accounting/bank/reconciliation/bank-card.png b/content/applications/finance/accounting/bank/reconciliation/bank-card.png index 4121744aeb..906505249d 100644 Binary files a/content/applications/finance/accounting/bank/reconciliation/bank-card.png and b/content/applications/finance/accounting/bank/reconciliation/bank-card.png differ diff --git a/content/applications/finance/accounting/bank/reconciliation/fully-paid.png b/content/applications/finance/accounting/bank/reconciliation/fully-paid.png deleted file mode 100644 index bcb2ed3273..0000000000 Binary files a/content/applications/finance/accounting/bank/reconciliation/fully-paid.png and /dev/null differ diff --git a/content/applications/finance/accounting/bank/reconciliation/user-interface.png b/content/applications/finance/accounting/bank/reconciliation/user-interface.png index b0ac519963..5058e8af73 100644 Binary files a/content/applications/finance/accounting/bank/reconciliation/user-interface.png and b/content/applications/finance/accounting/bank/reconciliation/user-interface.png differ diff --git a/content/applications/finance/accounting/bank/reconciliation_models.rst b/content/applications/finance/accounting/bank/reconciliation_models.rst index 0a588ad865..558c396fa3 100644 --- a/content/applications/finance/accounting/bank/reconciliation_models.rst +++ b/content/applications/finance/accounting/bank/reconciliation_models.rst @@ -2,111 +2,158 @@ Reconciliation models ===================== -Reconciliation models are used to automate the :doc:`bank reconciliation ` process, -which is especially handy when dealing with recurring entries like bank fees. Reconciliation models -can also be helpful in handling :doc:`cash discounts <../customer_invoices/cash_discounts>`. - -Each model is created based on a :ref:`model type ` and :guilabel:`bank transaction -conditions`. +Reconciliation models are custom rules that complement the :ref:`default set of matching rules +` and enable more advanced automation of the :doc:`bank +reconciliation ` process. These models are especially useful when dealing with +recurring flows like writing off bank fees or :doc:`cash discounts +<../customer_invoices/cash_discounts>`. .. seealso:: - - :doc:`bank_synchronization` - - `Odoo Tutorials: Reconciliation models `_ - -.. _models/type: - -Reconciliation model types -========================== - -To access reconciliation models, go to the :guilabel:`Accounting Dashboard`, click on the -:icon:`fa-ellipsis-v` :guilabel:`(vertical ellipsis)` menu on the bank journal and select -:guilabel:`Models` under the :guilabel:`Reconciliation` section. For each reconciliation model, a -:guilabel:`Type` must be set. Three types of models exist: - -- :guilabel:`Button to generate counterpart entry`: a button is created in the resulting entry - section of the bank reconciliation view. If clicked, this button generates a counterpart entry to - reconcile with the active transaction based on the rules set in the model. The rules specified in - the model determine the counterpart entry's account(s), amount(s), label(s), and analytic - distribution; -- :guilabel:`Rule to suggest counterpart entry`: used for recurring transactions to match the - transaction to a new entry based on conditions that must match the information on the transaction; -- :guilabel:`Rule to match invoices/bills`: used for recurring transactions to match the transaction - to existing invoices, bills, or payments based on conditions that must match the information on - the transaction. + `Odoo Tutorials: Reconciliation models `_ -Default reconciliation models -============================= +.. _accounting/rec-models/config: + +Configuration +============= + +To access reconciliation models, go to the :guilabel:`Accounting Dashboard`, click the +:icon:`fa-ellipsis-v` :guilabel:`(dropdown menu)` menu on the bank journal, and select +:guilabel:`Models` under the :guilabel:`Reconciliation` section. + +To create a new reconciliation model, click :guilabel:`New`. + +Reconciliation models can be either :guilabel:`Manual` or :guilabel:`Automated`. Manual +reconciliation models appear as :ref:`possible action buttons +` when :doc:`reconciling `. Automatic +reconciliation models apply automatically to transactions that meet the reconciliation model's +:ref:`matching conditions `. + +Each reconciliation model is configured with :ref:`matching conditions +` to identify the relevant bank transactions and :ref:`Counterpart +Items ` to be generated during reconciliation. -In Odoo, different models are available by default depending on the company's fiscal localization. -These can be updated if needed. Users can also create their own reconciliation models by clicking -:guilabel:`New`. +.. tip:: + To create an activity on the transaction, select which type of activity to create in the + :guilabel:`Next Activity` field. .. important:: If a record matches with several reconciliation models, the first one in the *sequence* of models - is applied. You can rearrange the order by dragging and dropping the handle next to the name. + is applied. Rearrange the order by dragging and dropping the handle next to the name. .. image:: reconciliation_models/list-view.png :alt: Rearrange the sequence of models in the list view. -Invoices/Bills perfect match ----------------------------- +.. _accounting/rec-models/conditions: + +Matching conditions +------------------- + +A reconciliation model's matching conditions determine to which transactions it applies. + +The following fields can be used to restrict the reconciliation model's availability to transactions +that meet the conditions: + +- :guilabel:`Journals` +- :guilabel:`Partners` +- :guilabel:`Amount`: Select :guilabel:`Is lower than or equal to`, :guilabel:`Is greater than or + equal to`, or :guilabel:`Is between` and enter the amount(s). +- :guilabel:`Label`: Select :guilabel:`Contains`, :guilabel:`Not Contains`, or :guilabel:`Match + Regex` and enter the transaction label's matching condition. + +.. tip:: + `Regular expressions `_, often abbreviated as **regex**, can be used in + Odoo in various ways to search, validate, and manipulate data. Regex can be powerful but also + complex, so it's essential to use it judiciously. + + To use regular expressions in a reconciliation model, set the :guilabel:`Label` to + :guilabel:`Match Regex` and add an expression. Odoo automatically retrieves the transactions + that match the regex expression and the conditions specified in the reconciliation model. -This model should be at the top of the *sequence* of models, as it enables Odoo to suggest matching -existing invoices or bills with a bank transaction based on set conditions. +.. note:: + A transaction must meet all conditions for the reconciliation model to be available for it. If no + condition is defined (i.e., if all fields are left blank), the reconciliation model will be + available for all transactions. -.. image:: reconciliation_models/invoices-bills-perfect-match.png - :alt: Set rules to trigger the reconciliation. +.. _accounting/rec-models/counterpart: -Odoo automatically reconciles the payment when the :guilabel:`Auto-validate` option is selected, and -the model conditions are perfectly met. In this case, it expects to find on the bank statement's -line the invoice/payment's reference (as :guilabel:`Label` is selected) and the partner's name -(as :guilabel:`Partner is set` is selected) to suggest the correct counterpart entry and reconcile -the payment automatically. +Counterpart items +----------------- -Invoices/Bills partial match if underpaid ------------------------------------------ +Each line in the :guilabel:`Counterpart items` tab creates a journal item with the specified +details: -This model suggests a customer invoice or vendor bill that partially matches the payment when the -amount received is slightly lower than the invoice amount, for example in the case of -**cash discounts**. The difference is reconciled with the account indicated in the -:guilabel:`counterpart entries` tab. +- :guilabel:`Partner`: Select the partner, if any, to set on the journal item. +- :guilabel:`Account`: Select the account, if any, to set on the journal item. +- :guilabel:`Amount Type`: Select how the amount of the journal item should be calculated: -The reconciliation model :guilabel:`Type` is :guilabel:`Rule to match invoices/bills`, and the -:guilabel:`Payment tolerance` should be set. + - :guilabel:`Fixed`: Use a fixed amount. + - :guilabel:`Percentage of balance`: Use a percentage of the remaining balance of the + transaction, regardless of the transaction total. + - :guilabel:`Percentage of statement line`: Use a percentage of the transaction total, regardless + of the remaining balance of the transaction. + - :guilabel:`From label`: Use a percentage from the transaction's label using regex. -.. image:: reconciliation_models/partial-match.png - :alt: Set rules to trigger the reconciliation. +- :guilabel:`Amount`: Enter the amount to be used on the journal item. This field will be either a + fixed amount, percentage amount, or regex depending on the :guilabel:`Account Type`. +- :guilabel:`Taxes`: Select a tax, if any, to set on the journal item. This field is hidden behind + the :icon:`oi-settings-adjust` :guilabel:`(settings adjust)` icon by default. +- :guilabel:`Analytic`: Select an analytic distribution, if any, to set on the journal item. +- :guilabel:`Label`: Enter a label, if any, to set on the journal item. .. note:: - The :guilabel:`Payment tolerance` is only applicable to lower payments. It is disregarded when an - overpayment is received. + - While neither the :guilabel:`Partner` nor :guilabel:`Account` fields are mandatory, at least + one of the two must be set for the reconciliation model to work correctly. + - The reconciliation model can be used for :ref:`partner mapping ` + if the :guilabel:`Counterpart Items` include a :guilabel:`Partner` but no :guilabel:`Account`. + +.. _accounting/rec-models/defaults: + +Default reconciliation models +============================= + +In Odoo, different models are available by default depending on the company's :doc:`fiscal +localization <../../fiscal_localizations>`. These can be updated if needed. The following +reconciliation models exist across most fiscal localizations. + +Internal Transfers +------------------ + +The :guilabel:`Internal Transfers` reconciliation model is used for making :doc:`internal transfers +` from one bank or cash account to another by moving the entire transaction's +balance to a liquidity or internal transfer account. To fully transfer the amount from one account +to another, this reconciliation model must be used on both the incoming journal's transaction and +the outgoing journal's transaction. .. seealso:: - :doc:`../customer_invoices/cash_discounts` + :doc:`internal_transfers` -Line with bank fees -------------------- +Bank Fees +--------- -This model suggests a counterpart entry according to the rules set in the model. In this case, the -reconciliation model :guilabel:`Type` is :guilabel:`Rule to suggest counterpart entry`, and the -:guilabel:`Label` can be used for example, to identify the information referring to the -:guilabel:`Bank fees` in the label of the transaction. +The :guilabel:`Bank Fees` reconciliation model generates a counterpart item that moves the remaining +balance of a transaction to a bank fees account (that varies by :doc:`fiscal localization +<../../fiscal_localizations>`) and includes "Bank Fees" in the :guilabel:`Label` of the new item +that it creates. This reconciliation model is only applicable to transactions whose label contains +"Bank Fees" due to its :ref:`matching conditions `. -.. image:: reconciliation_models/bank-fees.png - :alt: Set rules to trigger the reconciliation. +.. example:: + An outgoing bank transaction for $103 is partially matched with a vendor bill for $100, leaving + $3 of the transaction still unreconciled. Use the :guilabel:`Bank Fees` reconciliation model to + create a new counterpart item for $3 and reconcile it with the remaining $3 of the bank + transaction. -.. note:: - `Regular expressions `_, often abbreviated as **Regex**, can be used in - Odoo in various ways to search, validate, and manipulate data within the system. Regex can be - powerful but also complex, so it's essential to use it judiciously and with a good understanding - of the patterns you're working with. +Cash Discount +------------- - To use regular expressions in your reconciliation models, set the :guilabel:`Transaction Type` - to :guilabel:`Match Regex` and add your expression. Odoo automatically retrieves the - transactions that match your Regex expression and the conditions specified in your model. +The :guilabel:`Cash Discount` reconciliation model generates a counterpart item that moves the +remaining balance of a transaction to a cash discount account (that varies by :doc:`fiscal +localization <../../fiscal_localizations>`) and includes "Cash Discount" in the :guilabel:`Label` of +the new item that it creates. - .. image:: reconciliation_models/regex.png - :alt: Using Regex in Odoo +.. seealso:: + :doc:`../customer_invoices/cash_discounts` + +.. _accounting/rec-models/partner: Partner mapping =============== @@ -117,8 +164,8 @@ reconciliation. For example, you can create a partner mapping rule for incoming specific reference numbers or keywords in the transaction description. When an incoming payment meets these criteria, Odoo automatically maps it to the corresponding customer's account. -To create a partner mapping rule, go to the :guilabel:`Partner Mapping` tab and enter the -:guilabel:`Find Text in Label`, :guilabel:`Find Text in Notes`, and :guilabel:`Partner`. - -.. image:: reconciliation_models/partner-mapping.png - :alt: defining partner mapping +To create a partner mapping rule, configure any :ref:`matching conditions +`, such as a specific transaction label, and then configure the +:guilabel:`Partner` and any other relevant fields in the :ref:`Counterpart Items +` tab. Setting an :guilabel:`Account` is not mandatory for +partner mapping. diff --git a/content/applications/finance/accounting/bank/reconciliation_models/bank-fees.png b/content/applications/finance/accounting/bank/reconciliation_models/bank-fees.png deleted file mode 100644 index d373879bbe..0000000000 Binary files a/content/applications/finance/accounting/bank/reconciliation_models/bank-fees.png and /dev/null differ diff --git a/content/applications/finance/accounting/bank/reconciliation_models/invoices-bills-perfect-match.png b/content/applications/finance/accounting/bank/reconciliation_models/invoices-bills-perfect-match.png deleted file mode 100644 index 865d14bb57..0000000000 Binary files a/content/applications/finance/accounting/bank/reconciliation_models/invoices-bills-perfect-match.png and /dev/null differ diff --git a/content/applications/finance/accounting/bank/reconciliation_models/list-view.png b/content/applications/finance/accounting/bank/reconciliation_models/list-view.png index a06772b815..f4d44acf04 100644 Binary files a/content/applications/finance/accounting/bank/reconciliation_models/list-view.png and b/content/applications/finance/accounting/bank/reconciliation_models/list-view.png differ diff --git a/content/applications/finance/accounting/bank/reconciliation_models/partial-match.png b/content/applications/finance/accounting/bank/reconciliation_models/partial-match.png deleted file mode 100644 index a9a5ed71e7..0000000000 Binary files a/content/applications/finance/accounting/bank/reconciliation_models/partial-match.png and /dev/null differ diff --git a/content/applications/finance/accounting/bank/reconciliation_models/partner-mapping.png b/content/applications/finance/accounting/bank/reconciliation_models/partner-mapping.png deleted file mode 100644 index 0c01df0c0a..0000000000 Binary files a/content/applications/finance/accounting/bank/reconciliation_models/partner-mapping.png and /dev/null differ diff --git a/content/applications/finance/accounting/bank/reconciliation_models/regex.png b/content/applications/finance/accounting/bank/reconciliation_models/regex.png deleted file mode 100644 index 1237b6b580..0000000000 Binary files a/content/applications/finance/accounting/bank/reconciliation_models/regex.png and /dev/null differ diff --git a/content/applications/finance/accounting/bank/transactions.rst b/content/applications/finance/accounting/bank/transactions.rst index e6263b04eb..717cdeb27a 100644 --- a/content/applications/finance/accounting/bank/transactions.rst +++ b/content/applications/finance/accounting/bank/transactions.rst @@ -8,13 +8,76 @@ and reconciling them with the ones recorded in your accounting. :doc:`Bank synchronization ` automates the process. However, if you do not want to use it or if your bank is not yet supported, other options exist: -- :ref:`Import bank transactions ` delivered by your bank; -- :ref:`Register bank transactions ` manually. +- :ref:`Import bank transactions ` delivered by your bank; +- :ref:`Register bank transactions ` manually. .. note:: - :ref:`Grouping transactions by statement ` is optional. + :ref:`Grouping transactions by statement ` is optional. -.. _transactions/import: +.. _accounting/transactions/view: + +Transaction view +================ + +The list of transactions for the bank journal is displayed in the :guilabel:`Bank Matching` view. To +access it, go to the :guilabel:`Accounting Dashboard`, then either: + +- click the journal name (e.g., :guilabel:`Bank`) or its :guilabel:`Transactions` button to display + all transactions, including those previously reconciled, or +- click the :guilabel:`x to reconcile` button to display only unreconciled transactions. To include + previously reconciled transactions, remove the :guilabel:`Not Matched` filter from the search bar. + +Unreconciled transactions display the following information while collapsed: + +- The date of the transaction +- A button linked to the chatter. The icon of this button can vary: + + - The :icon:`fa-comments-o` :guilabel:`(comments)` icon displays only on hover and indicates that + there are no attachments or activities for the transaction. + - The :icon:`fa-paperclip` :guilabel:`(attachments)` icon indicates that there is an attachment on + the journal entry. + - The :icon:`fa-clock-o` :guilabel:`(activities)` icon indicates that there is an activity + scheduled on the journal entry. + +- The label of the transaction +- The partner of the transaction (if one is set) +- Up to two :ref:`action buttons `, depending on the + details of the transaction +- The balance of the transaction + +.. note:: + - When the chatter of a transaction is open, a blue tag highlights the related transaction. + - The chatter can be opened and closed by clicking the :icon:`fa-comments-o` + :guilabel:`(comments)` icon and the :icon:`fa-times` :guilabel:`(close)` icon in the top right + of the view. + - Once a transaction is :doc:`reconciled `, its action buttons are replaced with + the labels of the item(s) it was reconciled with or the account if it was reconciled with the + :guilabel:`Set Account` action button. + +.. _accounting/transactions/duplicate: + +Duplicate transactions +====================== + +Duplicate transactions occur when either by human error or :doc:`bank sync ` +error, the same transaction is created multiple times. The duplicate transaction view identifies +potential duplicate transactions so they can be selected and deleted. To access the duplicate +transaction view, first access the :guilabel:`Bank Matching` view by going to the +:guilabel:`Accounting Dashboard` and clicking the bank journal's name, then open the :icon:`fa-cog` +:guilabel:`Actions` menu and click :guilabel:`Find Duplicate Transactions`. + +Potential duplicate transactions are identified based on their amount, date, and account number, or +(if the transaction is created via :doc:`bank sync `) the transaction ID. + +Select a :guilabel:`Starting Date` to view the corresponding potential duplicate transactions, then +select the transactions to delete and click :icon:`fa-trash` :guilabel:`Delete Selected`. + +.. note:: + Any transactions created by :doc:`bank sync ` that the bank sync provider + determines to be potential duplicates are displayed in the :guilabel:`Provider Duplicates` tab. + This tab is only visible if there are any potential duplicates according to the provider. + +.. _accounting/transactions/import: Import transactions =================== @@ -23,40 +86,39 @@ Odoo supports multiple file formats to import transactions: - SEPA recommended Cash Management format (CAMT.053) - Comma-separated values (CSV) +- Excel (XLSX) - Open Financial Exchange (OFX) - Quicken Interchange Format (QIF) - Belgium: Coded Statement of Account (CODA) -To import a file, go to the :guilabel:`Accounting Dashboard`, and in the :guilabel:`Bank` journal, -click on :guilabel:`Import File`. +To import a file, go to the :guilabel:`Accounting Dashboard`, click the :icon:`fa-ellipsis-v` +:guilabel:`(ellipsis)` icon on the :guilabel:`Bank` journal, and select :guilabel:`Import file`. +Next, select the file and upload it. .. tip:: - Alternatively, you can also: - - - click the :icon:`fa-ellipsis-v` :guilabel:`(ellipsis)` icon on the :guilabel:`Bank` - journal and select :guilabel:`Import file`; - - or access the transaction list by clicking the :icon:`fa-ellipsis-v` :guilabel:`(ellipsis)` - icon on the :guilabel:`Bank` journal and selecting :guilabel:`Transactions`, then click - the :icon:`fa-cog` :guilabel:`(gear)` icon and select :guilabel:`Import records`. - -Next, select the file and upload it. + Alternatively, access the transaction list by: + - clicking on the :guilabel:`Bank` journal's name, then clicking :guilabel:`Upload` + - dragging and dropping a file on the bank journal on the :guilabel:`Accounting Dashboard` + - dragging and dropping a file on the :guilabel:`Bank Matching` view -After setting the necessary formatting options and mapping the file columns with their related Odoo -fields, you can run a :guilabel:`Test` and :guilabel:`Import` your bank transactions. +Certain file types such as CSV and XLSX, then require setting the necessary formatting options and +mapping the file columns with their related Odoo fields, after which you can run a :guilabel:`Test` +and :guilabel:`Import` your bank transactions. Other file types are mapped automatically. .. seealso:: :doc:`/applications/essentials/export_import_data` -.. _transactions/register: +.. _accounting/transactions/register: Register bank transactions manually =================================== -You can also record your bank transactions manually. To do so, go to :guilabel:`Accounting -Dashboard`, click on the :guilabel:`Bank` journal, and then on :guilabel:`New`. Make sure to fill -out the :guilabel:`Partner` and :guilabel:`Label` fields to ease the reconciliation process. +You can also record your bank transactions manually. To do so, go to the :guilabel:`Accounting +Dashboard`, click the :guilabel:`Bank` journal's name, and then on :guilabel:`New`. The +:guilabel:`Partner` field is optional to ease the reconciliation process, but the :guilabel:`Label` +and :guilabel:`Date` fields are mandatory. -.. _transactions/statements: +.. _accounting/transactions/statements: Statements ========== @@ -65,74 +127,71 @@ A **bank statement** is a document provided by a bank or financial institution t transactions that have occurred in a particular bank account over a specified period of time. In Odoo Accounting, it is optional to group transactions by their related statement, but depending -on your business flow, you may want to record them for control purposes. +on your business flow, you may want to record them for record-keeping and organizational purposes. + +To access a list of existing statements, go to the :guilabel:`Accounting Dashboard`, click the +:icon:`fa-ellipsis-v` :guilabel:`(dropdown menu)` icon next to the bank or cash journal you want to +check, then click :guilabel:`Statements`. .. important:: - If you want to compare the ending balances of your bank statements with the ending balances of - your financial records, *don't forget to create an opening transaction* to record the bank + To ensure the ending balances of your bank statements in Odoo align with the ending balances of + the statements that are provided by your bank, create an opening transaction to record the bank account balance as of the date you begin synchronizing or importing transactions. This is necessary to ensure the accuracy of your accounting. -To access a list of existing statements, go to the :guilabel:`Accounting Dashboard`, click the -:icon:`fa-ellipsis-v` :guilabel:`(ellipsis)` icon next to the bank or cash journal you want to -check, then click :guilabel:`Statements`. +.. tip:: + To access a statement's transactions, click :guilabel:`Transactions` directly from the + :guilabel:`Bank Statements` list view or open a statement and click the :guilabel:`Statement + lines` smart button. -.. _transactions/statement-kanban: +.. _accounting/transactions/statement-kanban: -Statement creation from the kanban view ---------------------------------------- +Statement creation +------------------ -Open the bank reconciliation (kanban) view from the :guilabel:`Accounting Dashboard` by clicking on -the name of the bank journal and identify the transaction corresponding to the last (most recent) -transaction of your bank statement. Click on the :guilabel:`Statement` button when hovering on the -upper separator line to create a statement from that transaction down to the oldest transaction that -is not yet part of a statement. +The :guilabel:`Bank Matching` view displays transactions from most recent to oldest and groups them +by statement, with any recent transactions that do not belong to a statement at the top. To add +transactions to a statement, hover on the most recent transaction that should be included in the +statement, and click the :guilabel:`Statement` button that appears on the upper separator line. +Doing so creates a statement from that transaction down to the oldest transaction that is not yet +part of a statement. .. image:: transactions/statements-kanban.png - :alt: A "Statement" button is visible when hovering on the line separating two transactions. + :alt: A "Statement" button is visible when hovering on a transaction. In the :guilabel:`Create Statement` window, fill out the statement's :guilabel:`Reference`, verify -its :guilabel:`Starting Balance` and :guilabel:`Ending Balance`, and click :guilabel:`Save`. - -.. _transactions/statement-list: - -Statement creation from the list view -------------------------------------- +its :guilabel:`Starting Balance` and :guilabel:`Ending Balance`, add an attachment such as a PDF +of the statement if desired, and click :guilabel:`Save`. -Open the list of transactions by clicking on the name of the bank journal and switching to the list -view. Select all the transactions corresponding to the bank statement, and, in the -:guilabel:`Statement` column, select an existing statement or create a new one by typing its -reference, clicking on :guilabel:`Create and edit...`, filling out the statement's details, and -saving. +.. tip:: + Transactions can also be added to statements from the list view. Select all the transactions + corresponding to the bank statement, and, in the :guilabel:`Statement` column, select an existing + statement or create a new one by typing its reference, clicking on :guilabel:`Create and + edit...`, filling out the statement's details, and saving. -.. _transactions/view-edit-print: +.. _accounting/transactions/view-edit-print: Statement viewing, editing, and printing ---------------------------------------- -To view an existing statement, click on the statement amount in the reconciliation (kanban) view or -click on the statement name in the bank transaction list view. From here, you can edit the -:guilabel:`Reference`, :guilabel:`Starting Balance`, or :guilabel:`Ending Balance`. +To view an existing statement, click the statement amount in the :guilabel:`Bank Matching` view +or click the statement name and then the :icon:`fa-arrow-right` :guilabel:`(Internal link)` icon in +the :guilabel:`Bank Matching` list view. From here, you can edit the :guilabel:`Reference`, +:guilabel:`Starting Balance`, :guilabel:`Ending Balance`, and :guilabel:`Attachments`. .. note:: - Manually updating the :guilabel:`Starting Balance` automatically updates the :guilabel:`Ending - Balance` based on the new value of the :guilabel:`Starting Balance` and the value of the - statement's transactions. - -.. warning:: - If the :guilabel:`Starting Balance` doesn't equal the previous statement's :guilabel:`Ending - Balance`, or if the :guilabel:`Ending Balance` doesn't equal the running balance - (:guilabel:`Starting Balance` plus the statement's transactions), a warning appears explaining - the issue. To maintain flexibility, it is still possible to save without first resolving the - issue. - -To attach a digital copy (i.e., JPEG, PNG, or PDF) of the bank statement for enhanced recordkeeping, -click the :icon:`fa-paperclip` :guilabel:`Attachments` button and select the file to attach. - -To generate and print a PDF of the bank statement, click the :guilabel:`Print` button (if accessed -via the reconciliation view) or click on the :icon:`fa-cog`:guilabel:`(gear)` icon and click -:icon:`fa-print`:guilabel:`Statement` (if accessed via the list view). + - Manually updating the :guilabel:`Starting Balance` automatically updates the :guilabel:`Ending + Balance` based on the new value of the :guilabel:`Starting Balance` and the value of the + statement's transactions. + - If the :guilabel:`Starting Balance` doesn't equal the previous statement's :guilabel:`Ending + Balance`, or if the :guilabel:`Ending Balance` doesn't equal the running balance + (:guilabel:`Starting Balance` plus the statement's transactions), a warning appears explaining + the issue. To maintain flexibility, it is still possible to save without first resolving the + issue. + +To generate and print a PDF of the bank statement, click the :icon:`fa-cog` :guilabel:`(gear)` icon +and click :icon:`fa-print` :guilabel:`Statement`. .. note:: When a bank statement is generated to be printed, it is automatically added to the - :guilabel:`Attachments`. + :guilabel:`Attachments` if no file was attached when creating the statement. diff --git a/content/applications/finance/accounting/bank/transactions/statements-kanban.png b/content/applications/finance/accounting/bank/transactions/statements-kanban.png index 050a4f40f5..94ffdf4686 100644 Binary files a/content/applications/finance/accounting/bank/transactions/statements-kanban.png and b/content/applications/finance/accounting/bank/transactions/statements-kanban.png differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing.rst b/content/applications/finance/accounting/customer_invoices/electronic_invoicing.rst index b27385e21f..b8a0644910 100644 --- a/content/applications/finance/accounting/customer_invoices/electronic_invoicing.rst +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing.rst @@ -4,296 +4,261 @@ Electronic invoicing (:abbr:`EDI (electronic data interchange)`) EDI, or electronic data interchange, is the inter-company communication of business documents, such as purchase orders and invoices, in a standard format. Sending documents according to an EDI -standard ensures that the machine receiving the message can interpret the information correctly. -Various EDI file formats exist and are available depending on your company's country. +standard ensures that the system receiving the message can interpret the information correctly. +Various EDI file formats are available depending on your company's country. -EDI feature enables automating the administration between companies and might also be required by -some governments for fiscal control or to facilitate the administration. +The EDI feature allows companies to automate administrative processes. It may also be required by +some governments for fiscal control or to support administrative procedures. Electronic sending of +documents such as customer invoices, credit notes, or vendor bills is one application of EDI. -Electronic invoicing of your documents such as customer invoices, credit notes or vendor bills is -one of the application of EDI. - -Odoo supports e-invoicing in many countries. Refer to the country's page for more details: - -- :doc:`Argentina ` -- :doc:`Austria ` -- :doc:`Belgium ` -- :doc:`Brazil ` -- :doc:`Chile ` -- :doc:`Colombia ` -- :doc:`Croatia ` -- :doc:`Denmark ` -- :doc:`Ecuador ` -- :doc:`Estonia ` -- :doc:`Finland ` -- :doc:`France ` -- :doc:`Germany ` -- :doc:`Hungary ` -- :doc:`Ireland ` -- :doc:`Italy ` -- :doc:`Latvia ` -- :doc:`Lithuania ` -- :doc:`Luxembourg ` -- :doc:`Mexico ` -- :doc:`Netherlands ` -- :doc:`Norway ` -- :doc:`Peru ` -- :doc:`Poland ` -- :doc:`Portugal ` -- :doc:`Romania ` -- :doc:`Slovenia ` -- :doc:`Spain ` -- :doc:`Spain - Basque Country ` -- :doc:`Uruguay ` +Odoo supports e-invoicing in many countries. Refer to the :ref:`country's page +` for more details. .. seealso:: :doc:`Fiscal localizations documentation <../../fiscal_localizations>` -.. _e-invoicing/configuration: +.. _accounting/e-invoicing/configuration: Configuration ============= -By default, the format available in the :ref:`send window ` depends on your -customer's country. - -You can define a specific e-invoicing format for each customer. To do so, go to -:menuselection:`Accounting --> Customers --> Customers`, open the customer form, go to the -:guilabel:`Accounting` tab and select the appropriate format. - -.. image:: electronic_invoicing/customer-form.png - :alt: Select an EDI format for a specific customer +By default, the format available in the :ref:`send window ` +depends on the customer's country. -National electronic invoicing ------------------------------ +To define a specific e-invoicing format for a customer, go to :menuselection:`Accounting --> +Customers --> Customers`, access the customer form, go to the :guilabel:`Accounting` tab, and select +the appropriate :guilabel:`Format` in the :guilabel:`Customer invoices` section. -Depending on your company's country (e.g., :doc:`Italy <../../fiscal_localizations/italy>`, -:doc:`Spain <../../fiscal_localizations/spain>`, :doc:`Mexico -<../../fiscal_localizations/mexico>`, etc.), you may be required to issue e-invoicing documents in -a specific format for all your invoices. In this case, you can define a default e-invoicing format -for your sales journal. +.. _accounting/e-invoicing/generation: -To do so, go to :menuselection:`Accounting --> Configuration --> Journals`, open your sales journal, -go to the :guilabel:`Advanced Settings` tab, and enable the formats you need for this journal. +E-invoice generation +==================== -.. _e-invoicing/generation: +From a confirmed invoice, click :guilabel:`Send`. In the :guilabel:`Print & Send` window, enable the +relevant e-invoicing format option (e.g., :guilabel:`by Peppol`), then click :guilabel:`Send` to +generate and attach the corresponding e-invoicing XML file. -E-invoices generation -===================== - -From a confirmed invoice, click :guilabel:`Send & Print` to open the send window. Check the -e-invoicing option to generate and attach the e-invoice file. - -.. image:: electronic_invoicing/send-window.png - :alt: The Peppol option is checked and an e-invoicing XML file is attached to the email. +.. _accounting/e-invoicing/peppol: Peppol ====== The `Peppol `_ network ensures the exchange of documents and information -between enterprises and governmental authorities. It is primarily used for electronic invoicing, and -its access points (connectors to the Peppol network) allow enterprises to exchange electronic -documents. - -Odoo is an **access point** and an :abbr:`SMP (Service Metadata Publisher)`, enabling electronic -invoicing transactions without the need to send invoices and bills by email or post. +between companies and governmental authorities. It is primarily used for electronic invoicing, and +its access points (connectors to the Peppol network) allow companies to send electronic documents +such as customer invoices and credit notes and receive documents like vendor bills and refunds. -If not done yet, :ref:`install ` the :guilabel:`Peppol` module (`account_peppol`). +In this case, Odoo acts as both an **access point** and an :abbr:`SMP (Service Metadata Publisher)` +and enables electronic invoicing transactions without the need to send invoices or bills by email or +post. -.. important:: - - Peppol registration is **free** and available in Odoo Community - - You can send **Customer Invoices** and **Credit Notes** and receive **Vendor Bills** and - **Refunds** via Peppol. - - You can send and receive in one of the following supported document formats: - **BIS Billing 3.0, XRechnung CIUS, NLCIUS**. +.. note:: + - Peppol registration is **free** and available in Odoo Community. + - Supported formats for sending documents include **BIS Billing 3.0, XRechnung CIUS, and + NLCIUS**. - | The following **countries** are eligible for **Peppol registration in Odoo**: | Andorra, Albania, Austria, Bosnia and Herzegovina, Belgium, Bulgaria, Switzerland, Cyprus, Czech Republic, Germany, Denmark, Estonia, Spain, Finland, France, United Kingdom, Greece, Croatia, Hungary, Ireland, Iceland, Italy, Liechtenstein, Lithuania, Luxembourg, Latvia, Monaco, Montenegro, North Macedonia, Malta, Netherlands, Norway, Poland, Portugal, Romania, - Serbia, Sweden, Slovenia, Slovakia, San Marino, Turkey, Holy See (Vatican City State) + Serbia, Sweden, Slovenia, Slovakia, San Marino, Turkey, Holy See (Vatican City State). + +.. _accounting/e-invoicing/peppol-registration: Registration ------------ -Go to :menuselection:`Accounting --> Configuration --> Settings`. If you do not have the -Peppol module installed, first tick the :guilabel:`Enable PEPPOL` checkbox and then **manually -save**. Click :guilabel:`Start sending via Peppol` to open the registration form. - -.. note:: - This registration form also pops up if you choose to :guilabel:`Send & Print` an - invoice via Peppol without completing the registration process. +To register on Peppol, go to :menuselection:`Accounting --> Configuration --> Settings` and scroll +to the :guilabel:`PEPPOL Electronic Invoicing` section. Then, follow these steps: -.. image:: electronic_invoicing/peppol-registration-settings.png - :alt: Peppol registration button +#. Click :guilabel:`Activate Electronic Invoicing` and fill in the following fields: -You can register either as a sender or a receiver. A sender can only send invoices and credit notes -on Odoo via Peppol, without ever registering as a Peppol participant on Odoo SMP. If you have an -existing Peppol registration elsewhere that you want to keep, but want to send invoices from your -Odoo database and receive other documents in another software, register as a **sender**. + - Using the :icon:`fa-caret-down` :guilabel:`(down arrow)` icon, make sure the relevant + country-specific Peppol endpoint identifier is selected in the dropdown list, then enter your + Peppol endpoint (usually a Company Registry or VAT number). + - :guilabel:`Email` + - :guilabel:`Phone`, including the country code (e.g., `+32` in Belgium) -.. tip:: - - You can always register as a sender first and register to receive documents later. - - When registering, you can specify if you would also like to receive documents. +#. Click :guilabel:`Activate Peppol`. The registration is then pending activation and should be + automatically activated within a day. -.. image:: electronic_invoicing/peppol-registration-wizard.png - :alt: Peppol registration form + .. seealso:: + `Peppol endpoint - OpenPeppol eDEC Code Lists `_ + (open the "Participant Identifier Schemes" as HTML page) -Fill in the following information: +#. Define where documents should be received: -- Check the receiver box if you want to register on Odoo SMP. If you are migrating from another - service provider, insert the :guilabel:`Migration key` from the previous provider (the field - becomes visible after you tick the checkbox). -- :guilabel:`E-Address Scheme`: the Peppol Electronic Address Scheme usually depends on your - company's country. Odoo often prefills this with the most commonly used EAS code in your country. - For example, the preferred EAS code for most companies in Belgium is `0208`. -- :guilabel:`Endpoint`: this is usually a Company Registry number or a VAT number. -- :guilabel:`Phone`: phone number including the country code (e.g., `+32` in Belgium). -- :guilabel:`Email`: this is the email Odoo can use to contact you regarding your Peppol - registration. + - :guilabel:`Receive in Journal`: If necessary, select another purchase journal in the + :guilabel:`Incoming Invoices Journal` field. + - :doc:`Receive in Documents <../../../productivity/documents>`: Select a folder in the + :guilabel:`Document Workspace` field if multiple purchase journals are used. -If you want to explore or demo Peppol, you can choose to register in :guilabel:`Demo` mode. -Otherwise, select :guilabel:`Live`. +#. Click :guilabel:`Save`. -.. tip:: - - Selecting :guilabel:`Demo` simulates everything in Odoo. There is no sending, receiving, or - partner verification. - - For **advanced users only**, it is possible to run tests on Peppol's test network. The server - allows to register on Peppol and send/receive test invoices to/from other participants. - To do so, enable the :ref:`developer-mode`, open the **Settings** app, go to - :menuselection:`Technical --> System Parameters`, and search for `account_peppol.edi.mode`. - Click the parameter and change the :guilabel:`Value` to `test`. Go back to the Peppol setup - menu in the **Settings** app. The option :guilabel:`Test` is now available. - - .. image:: electronic_invoicing/peppol-system-parameter.png - :alt: Peppol test mode parameter +All invoices and vendor bills can then be sent/received directly using Peppol. -.. seealso:: - - `Peppol EAS - European Commision `_ - - `Peppol Endpoint - OpenPeppol eDEC Code Lists `_ - (open the "Participant Identifier Schemes" as HTML page) +.. note:: + - To update the :guilabel:`Primary contact email`, click :icon:`oi-arrow-right` + :guilabel:`Advanced Configuration`, modify it, and click :guilabel:`Save`. + - If you are using an access point from a previous provider, make sure to deregister from it + first, then register with your new access point, unless it's Hermes (BOSA). If using Hermes + (BOSA), no action is needed; the migration is handled automatically. -When set up, request a verification code to be sent to you by clicking :guilabel:`Send a -registration code by SMS`. A text message containing a code is sent to the phone number provided to -finalize the verification process. +.. tip:: + - To manually trigger the scheduled action used to check the Peppol registration status, enable + :ref:`developer mode `, open the Settings app, go to :menuselection:`Settings + --> Technical --> Scheduled actions`, and search for :guilabel:`Peppol: update participant + status`. Open the scheduled action, then click :guilabel:`Run Manually`. + - To try Peppol without sending real data, enable demo mode by selecting :guilabel:`Odoo Demo + ID` as the Peppol endpoint identifier. To switch back to production mode, change the + :guilabel:`account_peppol.edi.mode` system parameter to `prod` mode before activating Peppol in + production. + - For advanced testing on Peppol's dedicated test network, use the test mode by setting the + :guilabel:`account_peppol.edi.mode` system parameter to `test`. This option is intended for + experienced users only. + +.. _accounting/e-invoicing/contact-verification: -.. image:: electronic_invoicing/peppol-phone-verification.png - :alt: phone validation +Contact verification +-------------------- -Once you enter the code and click :guilabel:`Register`, your Peppol participant status is updated. -If you chose to only send documents, then the status changes to :guilabel:`Can send but -not receive`. -If you opted to receive documents as well, the status changes to :guilabel:`Can send, pending -registration to receive`. In that case, it should be automatically activated within a day. +Before sending an invoice to a contact using Peppol, make sure the contact is registered as a Peppol +participant. To do so, follow these steps: -Then, set the default journal for receiving vendor bills in the :guilabel:`Incoming Invoices -Journal`. +#. Go to :menuselection:`Accounting --> Customers --> Customers` and access the customer's form. +#. In the :guilabel:`Accounting tab`, check the following information in the :guilabel:`Customer + invoices` section: -.. tip:: - To manually trigger the cron that checks the registration status, enable the - :ref:`developer-mode`, then go to :menuselection:`Settings --> Technical --> Scheduled Actions`, - and search for the :guilabel:`PEPPOL: update participant status` action. + - :guilabel:`eInvoice format`: Select the relevant format. + - Using the :icon:`fa-caret-down` :guilabel:`(down arrow)` icon, make sure the relevant + country-specific Peppol endpoint identifier is selected in the dropdown list, then enter the + customer's endpoint identifier, usually a Company Registry or VAT number. -Your receiver application status should be updated soon after you are registered on the Peppol -network. +#. To verify the contact, enable :ref:`developer mode ` and click + :guilabel:`Verify`. Its :guilabel:`Peppol endpoint verification` is marked as :guilabel:`Valid` + if the contact is found on the Peppol network. -.. image:: electronic_invoicing/peppol-receiver.png - :alt: receiver application - -All invoices and vendor bills can now be sent directly using the Peppol network. +.. image:: electronic_invoicing/customer-form.png + :alt: verify contact registration .. important:: - To update the email that Odoo can use to contact you, modify the email and click - :guilabel:`Update contact details`. + While Odoo prefills the endpoint number based on the information available for a contact, + verifying these details with the contact is recommended. -Configure Peppol services -------------------------- +.. _accounting/e-invoicing/send-invoices: -Once you are registered on Odoo SMP, the :guilabel:`Configure Peppol Services` button -becomes visible to allow you to enable or disable document formats that other participants -can send you via Peppol. By default, all document formats supported by Odoo are enabled (depending -on the installed modules). +Send invoices +------------- -Contact verification --------------------- +All posted invoices that are ready to be sent via Peppol can be viewed in the :guilabel:`Invoices` +list view in the following ways: -Before sending an invoice to a contact using the Peppol network, it is necessary to verify that they -are also registered as a Peppol participant. +- Use the :icon:`oi-settings-adjust` (:guilabel:`adjust settings`) button to add the + :guilabel:`Peppol status` column. +- Apply the :guilabel:`Peppol Ready` filter in the search bar. -To do so, go to :menuselection:`Accounting --> Customers --> Customers` and open the customer's -form. Then go to :menuselection:`Accounting tab --> Electronic Invoicing`, select the correct -format, and make sure their :guilabel:`Peppol EAS code` and the :guilabel:`Endpoint` are filled in. -Then, click :guilabel:`Verify`. If the contact exists on the network, their Peppol endpoint validity -is set to Valid. +To send the invoice to the customer via Peppol, click :guilabel:`Send` on the confirmed invoice +form. In the :guilabel:`Send` window, enable the :guilabel:`by Peppol` option and click +:guilabel:`Send`. -.. image:: electronic_invoicing/peppol-contact-verify.png - :alt: verify contact registration +.. tip:: + - :ref:`Multiple invoices ` can also be sent in + batches via Peppol. + - Set the preferred :ref:`Invoice sending ` method for a customer to + :guilabel:`by Peppol` in the :guilabel:`Customer Invoices` section of the customer form's + :guilabel:`Accounting` tab. -.. important:: - While Odoo prefills both the EAS code and the Endpoint number based on the information available - for a contact, it is better to confirm these details directly with the contact. +The status is updated to :guilabel:`Done` once the invoices have been successfully delivered to the +contact's access point. + +.. _accounting/e-invoicing/receive-vendor-bills: -It is possible to verify the Peppol participant status of several customers at once. -To do so, go to :menuselection:`Accounting --> Customers --> Customers` and switch to the list view. -Select the customers you want to verify and then click :menuselection:`Actions --> Verify Peppol`. +Receive vendor bills +-------------------- -If the participant is registered on the Peppol network but cannot receive the format you selected -for them, the :guilabel:`Peppol endpoint validity` label changes to :guilabel:`Cannot -receive this format`. +New documents received via Peppol are checked multiple times a day. Depending on the +:ref:`registration settings `, received documents +are automatically: -.. image:: electronic_invoicing/peppol-participant-format.png - :alt: verify contact ubl format +- either imported into the purchase journal set in the :guilabel:`PEPPOL Electronic Invoicing` + section, and corresponding vendor bills are created as drafts; +- or received via the :ref:`Documents app + `. -Send invoices -------------- +.. tip:: + To manually trigger the scheduled action used to retrieve incoming Peppol documents, enable + :ref:`developer mode `, open the Settings app, go to :menuselection:`Settings --> + Technical --> Scheduled actions`, and search for :guilabel:`Peppol: retrieve new documents`. Open + the scheduled action, then click :guilabel:`Run Manually`. -Once ready to send an invoice via the Peppol network, simply click :guilabel:`Send & Print` on the -invoice form. To queue multiple invoices, select them in the list view and click -:menuselection:`Actions --> Send & Print`; they will be sent in a batch later on. Both -:guilabel:`BIS Billing 3.0` and :guilabel:`Send via PEPPOL` checkboxes need to be ticked. +.. _accounting/e-invoicing/receive-vendor-bills-documents-app: -.. image:: electronic_invoicing/peppol-send-print.png - :alt: Send peppol invoice +Vendor bills reception in Documents +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Posted invoices that can be sent via Peppol are marked as :guilabel:`Peppol Ready`. -To display them, use the :guilabel:`Peppol Ready` filter or access the Accounting dashboard and -click :guilabel:`Peppol ready invoices` on the corresponding sales journal. +.. note:: + Make sure the :guilabel:`Documents - Import from Peppol` (`documents_account_peppol`) module is + :ref:`installed `. -.. image:: electronic_invoicing/peppol-ready-invoices.png - :alt: Filter Peppol ready invoices +To receive vendor bills via the :doc:`Documents app <../../../productivity/documents>`, follow these +steps: -Once the invoices are sent via Peppol, the status is changed to :guilabel:`Processing`. The -status is changed to `Done` after they have been successfully delivered to the contact's Access -Point. +#. In the Documents app, create a specific :ref:`folder ` or enable :ref:`file + centralization ` for :guilabel:`Accounting` documents. +#. Open the Accounting app, go to :menuselection:`Accounting --> Configuration --> Settings`, and + scroll to the :guilabel:`PEPPOL Electronic Invoicing` section. +#. In the :guilabel:`Document Workspace` field, choose the relevant folder. +#. Use the :guilabel:`Document Tags` field to add tags to incoming Peppol documents for easy + identification. +#. Click :guilabel:`Save`. -.. image:: electronic_invoicing/peppol-message-processing.png - :alt: Peppol message status +Then, open the Document app, navigate to the appropriate folder, select the relevant vendor bills, +and click :guilabel:`Create Vendor Bill`. The corresponding vendor bill is then created. -.. tip:: - By default, the Peppol status column is hidden on the Invoices list view. You can choose to have - it displayed by selecting it from the optional columns, accessible from the top right corner of - the Invoices list view. +.. _accounting/e-invoicing/peppol-deregister: -A cron runs regularly to check the status of these invoices. It is possible to check the status -before the cron runs by clicking :guilabel:`Fetch Peppol invoice status` in the corresponding -sales journal on the Accounting dashboard. +Peppol deregistration from Odoo +------------------------------- -.. image:: electronic_invoicing/peppol-fetch-message-status.png - :alt: Fetch invoice Peppol status +Only one Peppol receiver registration can be active for each Peppol endpoint identifier at a time. +To stop using Odoo as the Peppol access point, e.g., to switch to another provider or reconfigure +the registration for a new database, you must first deregister from Peppol. To do so, go to +:menuselection:`Accounting --> Configuration --> Settings`, scroll down to the :guilabel:`PEPPOL +Electronic Invoicing` section, and click :icon:`oi-arrow-right` :guilabel:`Advanced Configuration`. +Then click :guilabel:`Remove from Peppol` and confirm. -Receive vendor bills --------------------- +Once removed, the Peppol registration is deleted from the database, and documents can no longer be +sent or received via Peppol in Odoo. -Once a day, a cron checks whether any new documents have been sent to you via the Peppol network. -These documents are imported, and the corresponding vendor bills are created automatically as -drafts. +.. _accounting/e-invoicing/peppol-country-specific: -.. image:: electronic_invoicing/peppol-receive-bills.png - :alt: peppol receive bills +Country-specific e-invoicing details +==================================== -If you want to retrieve incoming Peppol documents before the cron runs, you can do so from the -Accounting dashboard on the main Peppol purchase journal that you set up in the settings. Just click -:guilabel:`Fetch from Peppol`. +Refer to the following pages for detailed, country-specific information: -.. image:: electronic_invoicing/peppol-fetch-bills.png - :alt: Fetch bills from Peppol +- :doc:`Argentina ` +- :doc:`Austria ` +- :doc:`Belgium ` +- :doc:`Brazil ` +- :doc:`Chile ` +- :doc:`Colombia ` +- :doc:`Croatia ` +- :doc:`Ecuador ` +- :doc:`Estonia ` +- :doc:`Finland ` +- :doc:`Guatemala ` +- :doc:`Hungary ` +- :doc:`Ireland ` +- :doc:`Italy ` +- :doc:`Latvia ` +- :doc:`Lithuania ` +- :doc:`Luxembourg ` +- :doc:`Mexico ` +- :doc:`Netherlands ` +- :doc:`Norway ` +- :doc:`Peru ` +- :doc:`Romania ` +- :doc:`Spain ` +- :doc:`Spain - Basque Country ` +- :doc:`Uruguay ` diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/customer-form.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/customer-form.png index bdd7ed5fa2..735087ba46 100644 Binary files a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/customer-form.png and b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/customer-form.png differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/denmark.rst b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/denmark.rst deleted file mode 100644 index 15c502a522..0000000000 --- a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/denmark.rst +++ /dev/null @@ -1,47 +0,0 @@ -:orphan: - -==================================== -Odoo electronic invoicing in Denmark -==================================== - -Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing -solutions tailored to Denmark's regulatory standards. - -Legal framework for e-invoicing in Denmark -========================================== - -In Denmark, e-invoicing is governed by `EU Directive 2014/55/EU `_, -mandating the use of e-invoicing for :abbr:`B2G (business-to-government)` transactions. Danish -public sector entities require invoices to be submitted through NemHandel, the national e-invoicing -platform, using the OIOUBL format (a local version of :abbr:`UBL (Universal Business Language)` and -XML). Denmark is also a key member of the Peppol network, enabling streamlined, standardized, and -secure cross-border e-invoicing for transactions within the European Union. While e-invoicing is not -mandatory for B2B transactions, its adoption is growing as businesses seek greater efficiency and -compliance. - -Compliance with Danish e-invoicing regulations -============================================== - -Odoo Invoicing makes it easy for businesses to send, store, and ensure the integrity of their -invoices. Here is how Odoo ensures compliance: - -- **Supported formats**: Odoo supports OIOUBL, which is required for public sector invoicing via - NemHandel. It also supports UBL XML for transactions through the Peppol network, ensuring - compatibility with Denmark’s and Europe’s e-invoicing standards. Odoo enables businesses to send - e-invoices through NemHandel, directly to Danish public entities in the required format. For - international transactions, Odoo ensures compatibility with Peppol Access Points, - facilitating cross-border invoicing. -- **Secure storage and retrieval**: In line with Danish regulations, which require businesses to - store invoices for at least five years, Odoo securely archives all invoices in a tamper-proof - system, ensuring easy access for audits and compliance checks. -- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations and - ensures invoices are formatted to meet Denmark’s legal requirements for B2G and B2B transactions, - helping businesses comply with local tax laws. - -.. admonition:: Disclaimer - - This page provides an overview of Danish e-invoicing laws and how Odoo Invoicing supports - compliance with NemHandel, OIOUBL standards, Peppol standards, and other relevant regulations. It - does not constitute legal advice. We recommend consulting with a tax advisor or legal - professional familiar with Danish e-invoicing regulations to ensure compliance tailored to your - specific business needs. diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/finland.rst b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/finland.rst index 87c97720ea..f355000193 100644 --- a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/finland.rst +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/finland.rst @@ -27,10 +27,10 @@ Compliance with Finnish e-invoicing regulations Odoo invoicing module makes it easy for businesses to adhere to Finland's e-invoicing regulations. Here is how Odoo ensures compliance: -- **Supported formats**: Odoo supports the e-invoicing formats widely used in Finland, including - TEAPPSXML, Finvoice, and the standardized XML in :abbr:`UBL (Universal Business Language)` format - required for Peppol compliance. This ensures compatibility with Finnish platforms such as Handi - for public sector invoicing and eKuitti for enhanced receipt management and e-invoicing. +- **Supported formats**: Odoo supports the standardized XML in :abbr:`UBL (Universal Business + Language)` format required for Peppol compliance. This ensures compatibility with regulations for + sending invoices to the Finnish government, as well as sending invoices to customers and receiving + invoices from vendors. - **Secure storage and retrieval**: In accordance with Finnish regulations requiring businesses to store invoices for a minimum of seven years, Odoo securely archives all invoices in a tamper-proof system, allowing for easy retrieval during audits. diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/france.rst b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/france.rst deleted file mode 100644 index 394e4f9b42..0000000000 --- a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/france.rst +++ /dev/null @@ -1,50 +0,0 @@ -:orphan: - -=================================== -Odoo electronic invoicing in France -=================================== - -Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing -solutions tailored to France's regulatory standards. - -Legal framework for e-invoicing in France -========================================= - -In France, electronic invoicing is regulated by the `Ordonnance n° 2019-359 -`_, which is aligned with `EU Directive -2014/55/EU `_, and requires -mandatory :abbr:`B2G (business-to-government)` e-invoicing through the Chorus Pro platform. Starting -in 2024, B2B e-invoicing will be progressively implemented, becoming mandatory for all businesses by -2026. This reform aims to combat tax fraud, improve VAT collection, and enhance business -transparency. The Factur-X hybrid format (a combination of PDF and XML data) is widely used in -France, ensuring compliance with both local and European e-invoicing standards. - -Compliance with French e-invoicing regulations -============================================== - -Odoo Invoicing makes it easy for businesses to send, store, and ensure the integrity of their -invoices. Here is how Odoo ensures compliance: - -- **Supported formats**: Odoo supports the Factur-X hybrid format (PDF with embedded XML) required - for compliance with French e-invoicing standards. It is also compatible with :abbr:`UBL (Universal - Business Language)` XML for transactions via the Peppol network, facilitating both local and - international invoicing. Odoo enables businesses, through Chorus Pro France’s official e-invoicing - platform, to submit compliant e-invoices directly to public authorities and soon to private sector - recipients as B2B e-invoicing becomes mandatory. -- **Secure storage and retrieval**: In compliance with French regulations, which require invoices to - be stored for a minimum of 10 years, Odoo securely archives all invoices in a tamper-proof system, - ensuring easy access for audits and inspections. -- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations, ensuring - invoices meet French VAT requirements and are formatted correctly for both B2G and B2B - transactions, supporting seamless compliance with evolving standards. - -.. seealso:: - :doc:`France fiscal localization documentation <../../../fiscal_localizations/france>` - -.. admonition:: Disclaimer - - This page provides an overview of French e-invoicing laws and how Odoo Invoicing supports - compliance with the Chorus Pro platform, Factur-X standard, Peppol network, and other relevant - regulations. It does not constitute legal advice. We recommend consulting with a tax advisor or - legal professional familiar with French e-invoicing regulations to ensure compliance tailored to - your specific business needs. diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/germany.rst b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/germany.rst deleted file mode 100644 index b3ee20ff96..0000000000 --- a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/germany.rst +++ /dev/null @@ -1,47 +0,0 @@ -:orphan: - -==================================== -Odoo electronic invoicing in Germany -==================================== - -Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing -solutions tailored to Germany's regulatory standards. - -Legal framework for e-invoicing in Germany -========================================== - -In Germany, e-invoicing is governed by the `E-Rechnungsgesetz `_, -which is aligned with `EU Directive 2014/55/EU `_, -requiring e-invoicing for all :abbr:`B2G (business-to-government)` transactions. Invoices to public -sector entities must comply with the XRechnung format or the Peppol BIS Billing 3.0 standard. -Submission is typically handled through platforms like :abbr:`ZRE (Zentraler Rechnungseingang)` or -:abbr:`OZG-RE (Onlinezugangsgesetz-Rechnungseingang)`. While B2B e-invoicing is not yet mandatory, -its adoption is increasing as businesses seek to enhance compliance, efficiency, and transparency. - -Compliance with German e-invoicing regulations -============================================== - -Odoo Invoicing makes it easy for businesses to send, store, and ensure the integrity of their -invoices. Here is how Odoo ensures compliance: - -- **Supported formats**: Odoo supports both XRechnung (XML), the mandatory format for public sector - e-invoicing, and Peppol BIS Billing 3.0, enabling seamless compliance with Germany’s national and - European standards. -- **Secure storage and retrieval**: In line with German regulations, which require invoices to be - stored for at least ten years, Odoo securely archives all invoices in a tamper-proof system, - ensuring they are easily accessible for audits and compliance checks. -- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations, ensuring - compliance with German VAT requirements and proper formatting for both :abbr:`B2G - (business-to-government)` and B2B transactions, supporting efficient reporting and legal - adherence. - -.. seealso:: - :doc:`Germany fiscal localization documentation <../../../fiscal_localizations/germany>` - -.. admonition:: Disclaimer - - This page provides an overview of German e-invoicing laws and how Odoo Invoicing supports - compliance with E-Rechnungsgesetz, XRechnung, Peppol standards, and other relevant regulations. - It does not constitute legal advice. We recommend consulting with a tax advisor or legal - professional familiar with German e-invoicing regulations to ensure compliance tailored to your - specific business needs. diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/guatemala.rst b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/guatemala.rst new file mode 100644 index 0000000000..268878e0a2 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/guatemala.rst @@ -0,0 +1,56 @@ +:orphan: + +====================================== +Odoo electronic invoicing in Guatemala +====================================== + +The Odoo **Invoicing** and **Accounting** applications offer legally compliant e-invoicing solutions +tailored to meet Guatemala's regulatory requirements, including those established by the +`Superintendencia de Administración Tributaria (SAT) `_. + +Legal framework for e-invoicing in Guatemala +============================================ + +Guatemala has mandated electronic invoicing under the :abbr:`FEL (Factura Electrónica en Línea)` +system, which applies to most businesses to enhance fiscal control and modernize tax administration. +Key elements include: + +- **Factura Electrónica en Línea (FEL)**: A mandatory e-invoicing system required for B2B, B2C, and + :abbr:`B2G (business-to-government)` transactions, regulated by the :abbr:`SAT (Superintendencia + de Administración Tributaria)`. Each authorized document must be digitally signed and contain a + unique certification code. +- **Integration with SAT**: All electronic documents must be issued through a certified certifier + `(Proveedor de Certificación)` and validated by the :abbr:`SAT (Superintendencia de Administración + Tributaria)` before being delivered to the customer. Once validated, the document receives a + certification date and unique UUID. +- **XML Format**: Guatemala mandates the use of XML for electronic documents, following SAT's + official XSD schema to ensure interoperability and traceability. +- **Adoption Timeline**: The transition to FEL has been implemented gradually by economic activity + and taxpayer profile, but it is now mandatory for most business sectors in the country. + +Compliance with Guatemalan e-invoicing regulations +================================================== + +Odoo Invoicing simplifies compliance with Guatemala's e-invoicing requirements by offering native +FEL integration and automation features: + +- **Supported formats**: Odoo supports most mandatory FEL document types in SAT-compliant XML, + including invoices (:abbr:`FACT`), credit notes (:abbr:`NCRE`), and debit notes (:abbr:`NDEB`). + Each document is automatically submitted to a certified certifier (Infile), digitally signed, and + validated by the SAT in real time. +- **Secure storage and retrieval**: In accordance with Guatemalan regulations, Odoo provides + centralized and secure storage of certified documents, including their XML and PDF graphical + representations, with full access for audits and control processes. +- **Automatic tax calculation and reporting**: Odoo automates VAT (IVA) and applicable tax + computations, ensuring compliance with local tax rates, exemption rules, and reporting structures + as defined by the SAT. + +.. seealso:: + :doc:`Guatemalan fiscal localization documentation <../../../fiscal_localizations/guatemala>` + +.. admonition:: Disclaimer + + This page provides a general overview of Guatemalan e-invoicing regulations and how Odoo supports + compliance with SAT requirements. It is not intended as legal or tax advice. We recommend + consulting with a tax advisor or legal professional familiar with Guatemala's e-invoicing + regulations to ensure full compliance tailored to your specific business requirements. diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/lithuania.rst b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/lithuania.rst index ed6ba1fb7f..1fe807c451 100644 --- a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/lithuania.rst +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/lithuania.rst @@ -12,12 +12,9 @@ Legal framework for e-invoicing in Lithuania In Lithuania, e-invoicing is regulated under the `Law on Accounting `_ and aligned with `EU Directive 2014/55/EU `_ -for mandatory :abbr:`B2G (business-to-government)` e-invoicing. Businesses working with public -sector entities must use e-invoicing, and invoices must be submitted through the E.sąskaita -platform, Lithuania’s centralized invoicing system for public procurement. Lithuania also -participates in the Peppol network, enabling seamless cross-border e-invoicing. While B2B -e-invoicing is currently optional, its use is encouraged to enhance tax compliance and operational -efficiency. +for mandatory :abbr:`B2G (business-to-government)` e-invoicing. Lithuania participates in the +Peppol network, enabling seamless cross-border e-invoicing. While B2B e-invoicing is currently +optional, its use is encouraged to enhance tax compliance and operational efficiency. Compliance with Lithuanian e-invoicing regulations ================================================== @@ -25,11 +22,8 @@ Compliance with Lithuanian e-invoicing regulations Odoo invoicing module is fully equipped to meet Lithuania's e-invoicing requirements and ensure compliance with local and EU standards. Here is how Odoo ensures compliance: -- **Supported formats**: Odoo supports Peppol BIS Billing 3.0 and XML formats required for - compliance with E.sąskaita, ensuring e-invoices meet the mandatory standards for public - procurement and cross-border transactions. Odoo enables businesses to send e-invoices directly to - public entities with Lithuania’s E.sąskaita platform. For international invoicing, Odoo supports - the Peppol network. +- **Supported formats**: Odoo supports Peppol BIS Billing 3.0 and XML formats ensuring e-invoices + meet the mandatory standards for public procurement and cross-border transactions. - **Secure storage and retrieval**: In compliance with Lithuanian regulations, which require invoices to be stored for a minimum of ten years, Odoo securely archives all invoices in a tamper-proof system, ensuring they are accessible for audits and tax inspections. @@ -40,7 +34,6 @@ compliance with local and EU standards. Here is how Odoo ensures compliance: .. admonition:: Disclaimer This page provides an overview of Lithuanian e-invoicing laws and how Odoo Invoicing supports - compliance with the Law on Accounting, E.sąskaita platform, Peppol standards, and other relevant - regulations. It does not constitute legal advice. We recommend consulting with a tax advisor or - legal professional familiar with Lithuanian e-invoicing regulations to ensure compliance tailored - to your specific business needs. + compliance with Peppol standards, and other relevant regulations. It does not constitute legal + advice. We recommend consulting with a tax advisor or legal professional familiar with Lithuanian + e-invoicing regulations to ensure compliance tailored to your specific business needs. diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-contact-verify.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-contact-verify.png deleted file mode 100644 index e84a35c554..0000000000 Binary files a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-contact-verify.png and /dev/null differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-fetch-bills.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-fetch-bills.png deleted file mode 100644 index 2a2188d488..0000000000 Binary files a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-fetch-bills.png and /dev/null differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-fetch-message-status.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-fetch-message-status.png deleted file mode 100644 index db0571a428..0000000000 Binary files a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-fetch-message-status.png and /dev/null differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-message-processing.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-message-processing.png deleted file mode 100644 index 16baddc5fe..0000000000 Binary files a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-message-processing.png and /dev/null differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-participant-format.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-participant-format.png deleted file mode 100644 index e5d28c1a73..0000000000 Binary files a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-participant-format.png and /dev/null differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-phone-verification.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-phone-verification.png deleted file mode 100644 index 3d5e65facd..0000000000 Binary files a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-phone-verification.png and /dev/null differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-ready-invoices.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-ready-invoices.png deleted file mode 100644 index 9e1b3b5901..0000000000 Binary files a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-ready-invoices.png and /dev/null differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-receive-bills.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-receive-bills.png deleted file mode 100644 index cc5ac2859a..0000000000 Binary files a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-receive-bills.png and /dev/null differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-receiver.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-receiver.png deleted file mode 100644 index 2a3978234f..0000000000 Binary files a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-receiver.png and /dev/null differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-registration-settings.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-registration-settings.png deleted file mode 100644 index 1f2a74d80d..0000000000 Binary files a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-registration-settings.png and /dev/null differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-registration-wizard.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-registration-wizard.png deleted file mode 100644 index 6d8cead67d..0000000000 Binary files a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-registration-wizard.png and /dev/null differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-send-print.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-send-print.png deleted file mode 100644 index 5a8b1fb0d5..0000000000 Binary files a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-send-print.png and /dev/null differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-system-parameter.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-system-parameter.png deleted file mode 100644 index ae63e31cfa..0000000000 Binary files a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-system-parameter.png and /dev/null differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/poland.rst b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/poland.rst deleted file mode 100644 index 4ed820096a..0000000000 --- a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/poland.rst +++ /dev/null @@ -1,45 +0,0 @@ -:orphan: - -=================================== -Odoo electronic invoicing in Poland -=================================== - -Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing -solutions tailored to Poland's regulatory standards. - -Legal framework for e-invoicing in Poland -========================================= - -In Poland, e-invoicing is governed by the `Polish VAT Act `_ -and the National e-Invoicing System (KSeF – Krajowy System e-Faktur), which became operational in -2022. While :abbr:`B2G (business-to-government)` e-invoicing is mandatory under `EU Directive -2014/55/EU `_, B2B -e-invoicing is mandatory for all businesses starting July 2024, following Poland's adoption of the -e-invoicing scheme. E-invoices must be issued in the FA_VAT (structured XML) format and transmitted -through the KSeF platform, ensuring compliance with tax reporting and transparency goals. - -Compliance with Polish e-invoicing regulations -============================================== - -Odoo Invoicing is fully equipped to help businesses comply with Poland's evolving e-invoicing -requirements. Here is how Odoo ensures compliance: - -- **Supported formats**: Odoo supports the FA_VAT (structured XML) format required for submission to - the KSeF platform. It also supports Peppol BIS Billing 3.0 for cross-border transactions, ensuring - compliance with Polish and European standards. Odoo enables businesses to issue and transmit - structured e-invoices to public authorities and other businesses through the KSeF platform. - Additionally, Odoo facilitates cross-border invoicing through the Peppol network. -- **Secure storage and retrieval**: In accordance with Polish regulations, which require invoices to - be stored for at least five years, Odoo securely archives all invoices in a tamper-proof system, - ensuring easy access for audits and compliance checks. -- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations and ensures - invoices meet Polish VAT requirements for both B2G and B2B transactions, streamlining compliance - and tax reporting processes. - -.. admonition:: Disclaimer - - This page provides an overview of Polish e-invoicing laws and how Odoo Invoicing supports - compliance with the VAT Act, KSeF platform, Peppol standards, and other relevant regulations. It - does not constitute legal advice. We recommend consulting with a tax advisor or legal - professional familiar with Polish e-invoicing regulations to ensure compliance tailored to your - specific business needs. diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/portugal.rst b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/portugal.rst deleted file mode 100644 index d8748661fe..0000000000 --- a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/portugal.rst +++ /dev/null @@ -1,48 +0,0 @@ -:orphan: - -===================================== -Odoo electronic invoicing in Portugal -===================================== - -Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing -solutions tailored to Portugal's regulatory standards. - -Legal framework for e-invoicing in Portugal -=========================================== - -In Portugal, e-invoicing is regulated under the Portuguese VAT Code and in compliance with `EU -Directive 2014/55/EU `_ for -:abbr:`B2G (business-to-government)` transactions. E-invoicing has been mandatory for public sector -suppliers since 2021. Businesses must use structured e-invoices in the :abbr:`CIUS-PT (Customizable -Invoice User Specification for Portugal)` format, which aligns with European standards. While B2B -e-invoicing is not yet mandatory, its adoption is encouraged to improve tax compliance and -efficiency. Additionally, e-invoices must be validated and certified under Portugal's SAF-T (PT) -system, which integrates with the tax authority for reporting. - -Compliance with Portuguese e-invoicing regulations -================================================== - -Odoo Invoicing is fully equipped to meet Portugal's e-invoicing and tax reporting requirements. Here -is how Odoo ensures compliance: - -- **Supported formats**: Odoo supports the :abbr:`CIUS-PT (Customizable Invoice User Specification - for Portugal)` format, ensuring compatibility with Portugal's public procurement e-invoicing - requirements. For cross-border transactions, Odoo also supports the Peppol BIS Billing 3.0 format, - facilitating seamless compliance with EU standards. Integration with SAF-T (PT) and Tax Authority - Systems enables businesses to generate, validate, and report certified e-invoices to the tax - authority in compliance with local regulations. -- **Secure storage and retrieval**: In accordance with Portuguese regulations, which require - invoices to be stored for at least ten years, Odoo securely archives all invoices in a - tamper-proof system, ensuring they are accessible for audits and inspections. -- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations and ensures - that invoices meet Portuguese VAT requirements for both :abbr:`B2G (business-to-government)` and - B2B transactions, supporting efficient and accurate tax reporting. - -.. admonition:: Disclaimer - - This page provides an overview of Portuguese e-invoicing laws and how Odoo Invoicing supports - compliance with the VAT Code, :abbr:`CIUS-PT (Customizable Invoice User Specification for - Portugal)` format, SAF-T (PT) system, Peppol standards, and other relevant regulations. It does - not constitute legal advice. We recommend consulting with a tax advisor or legal professional - familiar with Portuguese e-invoicing regulations to ensure compliance tailored to your specific - business needs. diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/send-window.png b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/send-window.png deleted file mode 100644 index 15186ebfc4..0000000000 Binary files a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/send-window.png and /dev/null differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/slovenia.rst b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/slovenia.rst deleted file mode 100644 index 116df7d785..0000000000 --- a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/slovenia.rst +++ /dev/null @@ -1,45 +0,0 @@ -:orphan: - -===================================== -Odoo electronic invoicing in Slovenia -===================================== - -Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing -solutions tailored to Slovenia's regulatory standards. - -Legal framework for e-invoicing in Slovenia -=========================================== - -In Slovenia, e-invoicing is regulated under the `Slovenian VAT Act `_ -and complies with `EU Directive 2014/55/EU `_, -mandating the use of e-invoices for :abbr:`B2G (business-to-government)` transactions. Suppliers to -public sector entities must submit e-invoices in the e-SLOG XML format, which is the national -standard for e-invoicing. These invoices are transmitted via the UJP (Uradni list Republike -Slovenije - Agency for Public Payments) e-invoicing platform. While B2B e-invoicing remains -optional, its adoption is encouraged to promote transparency and tax compliance. - -Compliance with Slovenian e-invoicing regulations -================================================= - -Odoo Invoicing is fully equipped to support businesses in meeting Slovenia’s e-invoicing -requirements. Here is how Odoo ensures compliance: - -- **Supported formats**: Odoo supports the e-SLOG XML format, enabling businesses to comply with - public procurement requirements in Slovenia. For cross-border transactions, Odoo also supports the - Peppol BIS Billing 3.0 format, ensuring compliance with EU standards. Odoo allows businesses to - send e-invoices directly to public entities in compliance with national e-invoicing regulations - through Slovenia’s UJP platform. -- **Secure storage and retrieval**: In line with Slovenian regulations, which require invoices to be - stored for a minimum of ten years, Odoo securely archives all invoices in a tamper-proof system, - ensuring they are easily accessible for audits and inspections. -- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations and ensures - invoices meet Slovenian VAT requirements for both B2G and B2B transactions, simplifying tax - reporting and ensuring accuracy. - -.. admonition:: Disclaimer - - This page provides an overview of Slovenian e-invoicing laws and how Odoo Invoicing supports - compliance with the VAT Act, e-SLOG XML format, UJP platform, Peppol standards, and other - relevant regulations. It does not constitute legal advice. We recommend consulting with a tax - advisor or legal professional familiar with Slovenian e-invoicing regulations to ensure - compliance tailored to your specific business needs. diff --git a/content/applications/finance/accounting/customer_invoices/epc_qr_code.rst b/content/applications/finance/accounting/customer_invoices/epc_qr_code.rst index 281d857490..0e4eb05f68 100644 --- a/content/applications/finance/accounting/customer_invoices/epc_qr_code.rst +++ b/content/applications/finance/accounting/customer_invoices/epc_qr_code.rst @@ -15,7 +15,6 @@ potentially make for payment issues. .. seealso:: - :doc:`../bank` - - `Odoo Academy: QR Code on Invoices for European Customers `_ Configuration ============= diff --git a/content/applications/finance/accounting/customer_invoices/overview.rst b/content/applications/finance/accounting/customer_invoices/overview.rst index e72d698339..e567b29050 100644 --- a/content/applications/finance/accounting/customer_invoices/overview.rst +++ b/content/applications/finance/accounting/customer_invoices/overview.rst @@ -15,6 +15,8 @@ create draft invoices: Sales ===== +.. _accounting/inv-process/so: + Sales Order ‣ Invoice --------------------- diff --git a/content/applications/finance/accounting/customer_invoices/sequence.rst b/content/applications/finance/accounting/customer_invoices/sequence.rst index ad3816bc9a..8303ca0056 100644 --- a/content/applications/finance/accounting/customer_invoices/sequence.rst +++ b/content/applications/finance/accounting/customer_invoices/sequence.rst @@ -2,9 +2,9 @@ Invoice sequence ================ -When confirming an invoice, Odoo generates a unique invoice reference number. By default, Odoo uses -the following sequence format `INV/year/incrementing-number` (e.g., `INV/2025/00001`), which -restarts from `00001` each year. +When confirming an invoice, Odoo generates a unique invoice reference number. By default, it uses +the sequence format `INV/year/incrementing-number` (e.g., `INV/2025/00001`), which restarts from +`00001` each year. However, it is possible to :ref:`change the sequence format ` and its periodicity, and to :ref:`mass-resequence invoices `. @@ -60,7 +60,26 @@ Follow these steps to resequence invoice numbers: #. Set the :guilabel:`First New Sequence`. #. :guilabel:`Preview Modifications` and click :guilabel:`Confirm`. -The first invoice using the new sequence appears in red in the :guilabel:`Customer Invoices` list. - .. image:: sequence/invoice-sequencing.png :alt: Resequence options window + +.. note:: + - To indicate where the sequence change began, the first invoice in the new sequence is + highlighted in red in the :guilabel:`Customer Invoices` list. This visual marker is permanent + and purely informational. + - If there are any irregularities in the new sequence, such as gaps, cancelled, or deleted + entries within the open period, a :guilabel:`Gaps in the sequence` message appears in the + :guilabel:`Customer Invoices` journal on the Accounting dashboard. To view more details about + the related invoice(s), click :guilabel:`Gaps in the sequence`. This visual marker is temporary + and will disappear once the entry's accounting date is on or after the lock date. + +.. tip:: + Resequencing is not possible: + + - When entries are before a lock date. + - When the sequence leads to a duplicate. + - When the range is invalid. For example, if the :guilabel:`Invoice Date` doesn't align with the + date in the new sequence, such as using a 2024 sequence (INV/2024/XXXXX) for an invoice dated + in 2025. + + In these cases, a :guilabel:`Validation Error` message appears. diff --git a/content/applications/finance/accounting/customer_invoices/sequence/invoice-sequencing.png b/content/applications/finance/accounting/customer_invoices/sequence/invoice-sequencing.png index c4d8445f13..858712e8b0 100644 Binary files a/content/applications/finance/accounting/customer_invoices/sequence/invoice-sequencing.png and b/content/applications/finance/accounting/customer_invoices/sequence/invoice-sequencing.png differ diff --git a/content/applications/finance/accounting/get_started.rst b/content/applications/finance/accounting/get_started.rst index 6055e23927..5b9b5569ad 100644 --- a/content/applications/finance/accounting/get_started.rst +++ b/content/applications/finance/accounting/get_started.rst @@ -183,7 +183,7 @@ Get started with Stripe and enable secure integrated credit and debit card payme * :doc:`bank/bank_synchronization` * :doc:`../fiscal_localizations` * `Odoo Tutorials: Accounting and Invoicing - Getting started [video] - `_ + `_ .. toctree:: :titlesonly: @@ -191,6 +191,7 @@ Get started with Stripe and enable secure integrated credit and debit card payme get_started/cheat_sheet get_started/chart_of_accounts get_started/consolidation + get_started/journals get_started/multi_currency get_started/avg_price_valuation get_started/tax_units diff --git a/content/applications/finance/accounting/get_started/chart_of_accounts.rst b/content/applications/finance/accounting/get_started/chart_of_accounts.rst index 32b00b6bd4..843e37a1a2 100644 --- a/content/applications/finance/accounting/get_started/chart_of_accounts.rst +++ b/content/applications/finance/accounting/get_started/chart_of_accounts.rst @@ -54,45 +54,45 @@ Correctly configuring the **account type** is critical as it serves multiple pur To configure an account type, open the :guilabel:`Type` field's drop-down selector and select the corresponding type from the following list: -+---------------+--------------+-------------------------+ -| Report | Category | Account Types | -+===============+==============+=========================+ -| Balance Sheet | Assets | Receivable | -| | +-------------------------+ -| | | Bank and Cash | -| | +-------------------------+ -| | | Current Assets | -| | +-------------------------+ -| | | Non-current Assets | -| | +-------------------------+ -| | | Prepayments | -| | +-------------------------+ -| | | Fixed Assets | -| +--------------+-------------------------+ -| | Liabilities | Payable | -| | +-------------------------+ -| | | Credit Card | -| | +-------------------------+ -| | | Current Liabilities | -| | +-------------------------+ -| | | Non-current Liabilities | -| +--------------+-------------------------+ -| | Equity | Equity | -| | +-------------------------+ -| | | Current Year Earnings | -+---------------+--------------+-------------------------+ -| Profit & Loss | Income | Income | -| | +-------------------------+ -| | | Other Income | -| +--------------+-------------------------+ -| | Expense | Expense | -| | +-------------------------+ -| | | Depreciation | -| | +-------------------------+ -| | | Cost of Revenue | -+---------------+--------------+-------------------------+ -|Other | Other | Off-Balance Sheet | -+---------------+--------------+-------------------------+ ++---------------+-------------+-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| Report | Category | Account Types | Description | ++===============+=============+=========================+=================================================================================================================+ +| Balance Sheet | Assets | Receivable | Money owed to the company by customers for goods or services delivered | +| | +-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| | | Bank and Cash | Funds held in company bank accounts or on hand as cash | +| | +-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| | | Current Assets | Short-term assets expected to be converted into cash within a year | +| | +-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| | | Non-current Assets | Long-term assets not expected to be converted to cash within a year | +| | +-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| | | Prepayments | Payments made in advance for goods or services to be received in the future | +| | +-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| | | Fixed Assets | Tangible long-term assets like buildings, machinery, and vehicles used in operation and subject to depreciation | +| +-------------+-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| | Liabilities | Payable | Money the company owes to suppliers or vendors | +| | +-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| | | Credit Card | Balances and transactions associated with company credit card usage | +| | +-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| | | Current Liabilities | Obligations due within one year, such as short-term loans or accrued expenses | +| | +-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| | | Non-current Liabilities | Long-term debts and financial obligations due beyond one year | +| +-------------+-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| | Equity | Equity | The owner's residual interest in the company after liabilities are deducted from assets | +| | +-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| | | Current Year Earnings | The company's net profit or loss accumulated in the current fiscal year | ++---------------+-------------+-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| Profit & Loss | Income | Income | Revenue generated from the company's primary business activities | +| | +-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| | | Other Income | Revenue from secondary or non-operational sources, like interest or asset sales | +| +-------------+-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| | Expense | Expense | Costs incurred during operations to generate revenue | +| | +-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| | | Depreciation | The allocation of the cost of tangible assets over their useful life | +| | +-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| | | Cost of Revenue | Direct costs attributable to the production or delivery of goods and services | ++---------------+-------------+-------------------------+-----------------------------------------------------------------------------------------------------------------+ +| Other | Other | Off-Balance Sheet | Transactions not displayed on the balance sheet or profit and loss report | ++---------------+-------------+-------------------------+-----------------------------------------------------------------------------------------------------------------+ Assets ~~~~~~ @@ -156,18 +156,12 @@ and select :guilabel:`Hierarchy and Subtotals`. Allow reconciliation -------------------- -Some accounts, such as accounts made to record the transactions of a payment method, can be used for -the reconciliation of journal entries. +To keep the reconciliation process simple, when reconciling a bank, cash, or credit card transaction +with an existing journal item, only journal items that debit or credit accounts with the +:guilabel:`Allow reconciliation` option enabled are displayed as possible matches. -For example, an invoice paid with a credit card can be marked as :guilabel:`paid` if reconciled with -its payment. Therefore, the account used to record credit card payments needs to be configured as -**allowing reconciliation**. - -To do so, check the :guilabel:`Allow Reconciliation` box in the account's settings, and -:guilabel:`Save`; or enable the button from the chart of accounts view. - -.. image:: chart_of_accounts/chart-of-accounts-reconciliation.png - :alt: Allow reconciliation for accounts in Odoo Accounting +To enable this option on an account, tick the :guilabel:`Allow Reconciliation` checkbox in the +account's settings, and :guilabel:`Save`; or enable the button from the chart of accounts view. .. _coa_shared_accounts: @@ -191,6 +185,6 @@ account's settings, and :guilabel:`Save`. * :doc:`../vendor_bills/deferred_expenses` * :doc:`../customer_invoices/deferred_revenues` * :doc:`../../fiscal_localizations` - * `Odoo Tutorials: Chart of accounts `_ + * `Odoo Tutorials: Chart of accounts `_ * `Odoo Tutorials: Update your chart of accounts - `_ + `_ diff --git a/content/applications/finance/accounting/get_started/chart_of_accounts/chart-of-accounts-reconciliation.png b/content/applications/finance/accounting/get_started/chart_of_accounts/chart-of-accounts-reconciliation.png deleted file mode 100644 index 8e17776bba..0000000000 Binary files a/content/applications/finance/accounting/get_started/chart_of_accounts/chart-of-accounts-reconciliation.png and /dev/null differ diff --git a/content/applications/finance/accounting/get_started/consolidation.rst b/content/applications/finance/accounting/get_started/consolidation.rst index b5808fb8af..2152ae6ef5 100644 --- a/content/applications/finance/accounting/get_started/consolidation.rst +++ b/content/applications/finance/accounting/get_started/consolidation.rst @@ -8,15 +8,16 @@ own books, into a unified view, providing a "fair image" of the entire group's f It helps create a clear, comprehensive view of the group's financial performance by combining data from multiple companies. -.. _consolidation_in_odoo: - -How it Works in Odoo -==================== +.. note:: + Consolidating companies involves **legally separate entities**, whereas :ref:`branches + ` are **subdivisions** of a single legal entity which often share the + head office's resources (journals, taxes, accounts, fiscal positions) and are not consolidated in + the same way. .. _consolidation_tools: -Consolidation Tools -------------------- +Consolidation tools +=================== **Several tools** combined together will contribute to the construction of the financial consolidation: @@ -35,6 +36,36 @@ consolidation: .. note:: :ref:`Import mapping ` or merge existing accounts using the :ref:`merging tool ` can simplify the process. + When multiple accounts from one company are mapped to a single account in another, it is then + possible to group the multiple accounts into a single line in the other company's reporting by + :ref:`grouping by ` the *account code* (`account_code`) rather + than the *account ID* (`account_id`). + + .. note:: + Some reports, such as the :ref:`profit and loss `, split + the lines into different sections by account type. When these reports are grouped by account + code, the section splits are maintained, but within each section, line grouping by account + code is respected. + + .. example:: + Belgian Company is a parent company with a subsidiary, American Company. American Company has + five income accounts: + + - 400000 Product Sales - Domestic + - 400100 Product Sales - International + - 410000 Service Revenue - Consulting + - 420000 Subscription Revenue + - 430000 Freight & Handling Revenue + + All five of the US income accounts correspond to one single income account (700000 Income) in + the Belgian Company. + + For the Belgian Company's profit and loss report to show one line for all of the American + Company's combined income accounts related to the Belgian Company's single income account, all + five income accounts from the American Company must be mapped to The Belgian Company's 700000 + Income account, and the report's lines must be :ref:`grouped by + ` the account code. + .. _consolidation_multi_ledgers: #. **Multi-Ledgers:** Ledgers are fundamental to the process of consolidation. They are either: @@ -101,18 +132,9 @@ consolidation: .. important:: The rates used are those of the company currently selected. -.. _consolidation_companies_vs_branches: - -Consolidating Companies vs. Branch Management ---------------------------------------------- - -Consolidating companies involves **legally separate entities** whereas branches are -**subdivisions** of a single legal entity which often share the head office's resources (journals, -taxes, accounts, fiscal positions) and are not consolidated in the same way. - .. _consolidation_merge_tool: -Account Merging +Account merging =============== Accounts can be merged to reduce the number of accounts and standardize them across companies. This @@ -136,7 +158,7 @@ companies, just as if the account had been directly created to be shared. .. _consolidation_unmerge_tool: -Account Unmerging +Account unmerging ================= Accounts can also be unmerged if needed. @@ -162,7 +184,7 @@ shared account. .. _consolidation_import_account_mapping: -Import a Mapping +Import a mapping ================ To **import an account mapping**, select all the related companies in the company selector at the diff --git a/content/applications/finance/accounting/get_started/journals.rst b/content/applications/finance/accounting/get_started/journals.rst new file mode 100644 index 0000000000..c9492bfd1c --- /dev/null +++ b/content/applications/finance/accounting/get_started/journals.rst @@ -0,0 +1,266 @@ +======== +Journals +======== + +Journal entries are recorded in different **journals** to maintain an organized record of a +company's financial transactions. Odoo uses six different types of journals to organize accounting +records: + +- :ref:`Bank ` +- :ref:`Cash ` +- :ref:`Credit Card ` +- :ref:`Sales ` +- :ref:`Purchase ` +- :ref:`Miscellaneous ` + +.. note:: + It is possible to have multiple journals of the same type, such as two separate bank journals, + each for a unique bank account, or two separate sales journals to track :abbr:`B2B (business to + business)` versus :abbr:`B2C (business to customer)` income. + +.. _accounting/journals/configuration: + +Configuration +============= + +Each card on the :guilabel:`Accounting Dashboard` represents a journal. To edit the configuration of +a journal, click the :icon:`fa-ellipsis-v` :guilabel:`(vertical ellipsis)` on the journal card, then +click :guilabel:`Configuration`. Alternatively, go to :menuselection:`Accounting --> Configuration +--> Journals` to select and edit an existing journal or to create a new one. + +While different journal types have slightly different fields to configure, some fields are +consistent across all the journal types: + +- :guilabel:`Short Code`: Each journal must have a unique code (from 1 to 5 characters long). The + short code is used as the prefix for all journal entries belonging to this journal. +- :guilabel:`Currency`: If desired, set the currency of this journal. For bank and cash journals, + this is the currency of the journal's :doc:`transactions <../bank/transactions>`. This field is + only visible when :doc:`multiple currencies ` are enabled. + +The :guilabel:`Advanced Settings` tab contains more technical options: + +- :guilabel:`Allowed accounts`: Limit which accounts are available when recording journal entries in + this journal. Leave this field blank to allow all accounts. +- :guilabel:`Email Alias`: Set an email address to create journal entries by digitizing PDFs sent + to this address. This is most commonly used to create :ref:`customer invoices and vendor bills + `. +- :guilabel:`Secure Posted Entries with Hash`: Restrict the :doc:`alterability + <../reporting/data_inalterability>` of this journal's entries to comply with tax authorities in + certain countries. + +.. warning:: + The :guilabel:`Secure Posted Entries with Hash` option cannot be removed from a journal once the + journal has a posted journal entry. + +.. note:: + - Bank and cash journals do not have the :guilabel:`Secure Posted Entries with Hash` or + :guilabel:`Email Alias` fields. + - If an :ref:`alias domain ` has not yet been configured, a link to + :icon:`fa-arrow-right` :guilabel:`Configure Alias Domain` is displayed instead of the + :guilabel:`Email Alias` field. + +.. _accounting/journals/bank-cash-cc: + +Bank, cash, and credit card journals +------------------------------------ + +Bank, cash, and credit card journals share the following features: + +- :guilabel:`Suspense Account`: :doc:`../bank/transactions` on this journal are posted on this + account until they are reconciled, at which point this account is replaced with the account the + transaction was reconciled against. At any moment, the suspense account's balance in the general + ledger shows the balance of transactions that have not yet been reconciled. + + .. note:: + When a bank transaction is reconciled, the journal entry is modified to replace the bank + suspense account with the account of the journal item it is reconciled with. This account is + usually either: + + - the :ref:`outstanding receipts or payments account + ` if reconciling with a registered payment; or + - the account receivable or payable if reconciling with an invoice or bill directly. + +- :guilabel:`Dedicated Payment Sequence`: Tick this field to use separate sequences for payments + and transactions posted on this journal. + + .. note:: + If the :guilabel:`Dedicated Payment Sequence` field is ticked, payments that use an + :ref:`outstanding account ` will have references that + add :guilabel:`P` before the journal's short code. Otherwise, the references will begin with + :guilabel:`PAY`. + +The :guilabel:`Incoming Payments` and :guilabel:`Outgoing Payments` tabs contain the :ref:`payment +methods ` of this journal. Different payment methods are +available depending on the journal type. If desired, set :ref:`outstanding accounts +` on the payment methods. + +.. seealso:: + - :doc:`../bank` + - :doc:`multi_currency` + - :doc:`../bank/transactions` + - `Bank configuration `_ + +.. _accounting/journals/outstanding-accounts: + +Outstanding accounts +~~~~~~~~~~~~~~~~~~~~ + +By default, payments in Odoo do not create journal entries, but they can be configured to create +journal entries by using **outstanding accounts** on :ref:`bank ` and +:ref:`cash ` journals. + +- An **outstanding receipts account** is where incoming payments are posted until they are linked + with incoming bank transactions. +- An **outstanding payments account** is where outgoing payments are posted until they are linked + with outgoing bank transactions. + +These accounts are usually of :ref:`type ` :guilabel:`Current Assets` and +:guilabel:`Current Liabilities`. + +Payments that are registered in Odoo are posted to the outstanding receipts and outstanding accounts +until they are reconciled. At any moment, the outstanding receipts account's balance in the general +ledger shows the balance of registered incoming payments that have not yet been reconciled, and the +outstanding payments account's balance in the general ledger shows the balance of registered +outgoing payments that have not yet been reconciled. + +Configuration +************* + +To configure outstanding accounts, go to :menuselection:`Accounting --> Configuration --> Journals` +and select or create a bank or cash journal. In the :guilabel:`Incoming Payments` and +:guilabel:`Outgoing Payments` tabs, set :guilabel:`Outstanding Receipts accounts` and +:guilabel:`Outstanding Payments accounts` for each payment method that you want to create journal +entries. + +.. note:: + - If the main bank account of the journal is added as an outstanding receipts account or + outstanding payments account, when a payment is registered, the invoice or bill's status is + directly set to :guilabel:`Paid`. + - If the outstanding receipts or outstanding payments account for a payment method is left blank, + registering a payment with that payment method will not create any journal entry. + +.. _accounting/journals/bank: + +Bank +~~~~ + +Bank journals are used to record journal entries related to :doc:`bank transactions +<../bank/transactions>` and incoming and outgoing :doc:`payments <../payments>`. The following +fields are specific to bank journals: + +- :guilabel:`Bank Account`: This :guilabel:`Bank and Cash` type account is the default account for + this bank journal. +- :guilabel:`Account Number`: The bank account's number is used when registering payments and is + required for generating outgoing payment files, such as :doc:`SEPA <../payments/pay_sepa>` or + :ref:`NACHA `. To edit the bank account details, click on the + :icon:`oi-arrow-right` :guilabel:`(Internal link)` button next to the :guilabel:`Account Number` + and update the account information accordingly. +- :guilabel:`Bank`: The bank name is used when registering payments and is required for generating + outgoing payment files. To edit the bank account details, click on the :icon:`oi-arrow-right` + :guilabel:`(Internal link)` button next to the :guilabel:`Bank` name and update the account + information accordingly. +- :guilabel:`Bank Feeds`: Define the method of creating bank :doc:`transactions + <../bank/transactions>`, whether :guilabel:`Manual` or via :doc:`Online Synchronization + <../bank/bank_synchronization>`. +- :guilabel:`Split Transactions`: Split collective payments for CODA files. + +Multiple payment methods are available for bank journals, as are configurations for generating +outgoing payment files, such as :doc:`SEPA <../payments/pay_sepa>` or :ref:`NACHA `. + +.. _accounting/journals/cash: + +Cash +~~~~ + +Cash journals are used to record journal entries related to cash :doc:`transactions +<../bank/transactions>`. The following fields are specific to cash journals: + +- :guilabel:`Cash Account`: This :guilabel:`Bank and Cash` type account is the default account for + this cash journal. +- :guilabel:`Profit Account`: This :guilabel:`Income` or :guilabel:`Other Income` type account is + used to register a profit when the ending balance of a cash register is greater than expected. +- :guilabel:`Loss Account`: This :guilabel:`Expenses` type account is used to register a loss when + the ending balance of a cash register is less than expected. + +Only manual payment methods are available for cash journals. + +.. _accounting/journals/credit: + +Credit card +~~~~~~~~~~~ + +Credit card journals are used to record journal entries related to credit cards. The following +fields are specific to credit card journals: + +- :guilabel:`Journal Account`: This :guilabel:`Credit Card` type account is the default account for + this credit card journal. +- :guilabel:`Bank Feeds`: Define the method of creating credit card transactions, whether manual or + via :doc:`Online Synchronization <../bank/bank_synchronization>`. + +Only manual payment methods are available for credit card journals. + +.. _accounting/journals/sales-purchase-misc: + +Sales, purchase, and miscellaneous journals +------------------------------------------- + +.. _accounting/journals/sales: + +Sales +~~~~~ + +Sales journals, also known as income journals, are used to record journal entries related to +:doc:`customer invoices <../customer_invoices>`. The following fields are specific to customer +invoice journals: + +- :guilabel:`Default Income Account`: Invoices in this journal use this :guilabel:`Income` or + :guilabel:`Other Income` type account unless overwritten by another income account set on the + product category, product, or invoice line itself. +- :guilabel:`Dedicated Credit Note Sequence`: Check this box to use a separate sequence for the + reference of credit notes that increments separately from the main invoice sequence and adds an + `R` to the reference before the journal's short code. +- :guilabel:`Dedicated Debit Note Sequence`: Check this box to use a separate sequence for the + reference of credit notes that increments separately from the main invoice sequence and adds a `D` + before the journal's short code. + +Sales journals have additional fields in the :guilabel:`Advanced Settings` tab that allow you to set +the default communication format that will appear on customer invoices so that the customer can +refer to that particular invoice when making a payment: + +- :guilabel:`Communication Type`: Choose if the format of the payment reference communicated to the + customer should be based on the invoice number or the customer's number. +- :guilabel:`Communication Standard`: Choose the format of the payment reference itself that is + communicated to the customer. + +.. _accounting/journals/purchase: + +Purchase +~~~~~~~~ + +Purchase journals are used to record journal entries related to :doc:`vendor bills +<../vendor_bills>`. The following fields are specific to purchase journals: + +- :guilabel:`Default Expense Account`: Vendor bills in this journal use this :guilabel:`Expense` + type account unless overwritten by another expense account set on the product category, product, + or expense. +- :guilabel:`Private Part Account`: Select the account to be used to register the private part of + mixed expenses. +- :guilabel:`Dedicated Credit Note Sequence`: Check this box to use a separate sequence for the + reference of credit notes that increments separately from the main vendor bill sequence and adds + an `R` to the reference before the journal's short code. +- :guilabel:`Dedicated Debit Note Sequence`: Check this box to use a separate sequence for the + reference of credit notes that increments separately from the main invoice sequence and adds a `D` + before the journal's short code. + +.. _accounting/journals/misc: + +Miscellaneous +~~~~~~~~~~~~~ + +Miscellaneous journals are used to record journal entries that are not related to any of the other +journal types such as tax closing journal entries. + +.. seealso:: + - `Tax return eLearning `_ + - :doc:`../reporting/tax_returns` + - :doc:`../taxes` diff --git a/content/applications/general/companies/inter-company-transactions.png b/content/applications/finance/accounting/inter-company-transactions.png similarity index 100% rename from content/applications/general/companies/inter-company-transactions.png rename to content/applications/finance/accounting/inter-company-transactions.png diff --git a/content/applications/finance/accounting/payments.rst b/content/applications/finance/accounting/payments.rst index 8d37619d59..df127e0b32 100644 --- a/content/applications/finance/accounting/payments.rst +++ b/content/applications/finance/accounting/payments.rst @@ -55,6 +55,40 @@ invoice payments or for vendor bill payments in the :guilabel:`Purchase` section view by removing the :guilabel:`Customers` or :guilabel:`Vendors` filter. Alternatively, access the full contact list through the Contacts app. +.. _accounting/payments/checks: + +Checks +------ + +:doc:`Vendor bills can be paid by check ` using a dedicated outgoing payment +method, which allows check numbers to be tracked and checks to be printed directly from Odoo. + +For incoming customer check payments, you can use the default :guilabel:`Manual Payment` payment +method, or you can create a payment method specifically for checks to help identify such payments +quickly. To create a *Check* payment method, follow these steps: + +#. Go to :menuselection:`Accounting --> Configuration --> Journals` and select the :guilabel:`Bank` + journal. +#. In the :guilabel:`Incoming Payments` tab, click :guilabel:`Add a line`. +#. As :guilabel:`Payment Method`, select :guilabel:`Manual`, then enter `Check` as the + :guilabel:`Name`. + +When registering a customer payment :ref:`on an invoice ` or +:ref:`not related to an invoice `, use the new :guilabel:`Check` +payment method. + +.. note:: + Registering a customer payment by check in Odoo does not move funds. Checks must be deposited in + order to make the payment. Once deposited to your bank, the check should appear as a :doc:`bank + transaction `, at which point it can be :doc:`reconciled + ` with the registered payment. + +.. tip:: + - For best practice, enter the check number as the :guilabel:`Memo` when registering a customer + payment by check. + - :doc:`Batch payments ` can simplify reconciling deposits containing multiple + checks. + .. _accounting/payments/from-invoice-bill: Registering payment from an invoice or bill @@ -79,8 +113,8 @@ After the payment is registered, the customer invoice or vendor bill is marked a .. group-tab:: Without outstanding accounts - If no :ref:`outstanding accounts ` are configured, no - journal entry is created. To display more information about the payment, click the + If no :ref:`outstanding accounts ` are configured, + no journal entry is created. To display more information about the payment, click the :guilabel:`Payments` smart button. When the invoice or vendor bill is :doc:`reconciled ` with a bank @@ -96,11 +130,11 @@ After the payment is registered, the customer invoice or vendor bill is marked a By default, payments in Odoo do not create journal entries, but they can easily be configured to create journal entries using :ref:`outstanding accounts - `. + `. Registering a payment on a customer invoice or vendor bill generates a new journal entry and reduces the :guilabel:`Amount Due` based on the payment amount. The counterpart is - reflected in an :ref:`outstanding ` **receipts** or + reflected in an :ref:`outstanding ` **receipts** or **payments** account. At this point, the customer invoice or vendor bill is marked as :guilabel:`In payment`. Then, when the payment is :doc:`reconciled ` with a bank transaction, the invoice or vendor bill status changes to :guilabel:`Paid`. @@ -138,7 +172,7 @@ directly linked to an invoice or bill. .. group-tab:: Without outstanding accounts Payments that are not linked to an invoice or bill should not be registered without using - :ref:`outstanding accounts `, as there is no way to + :ref:`outstanding accounts `, as there is no way to associate the payment with the invoice or bill since no journal entry is created for the payment. The amount paid or received is not reflected in the accounting and the :guilabel:`Amount Due` is not updated based on the payment amount. @@ -285,9 +319,9 @@ Registering a single payment for multiple customers or vendors (batch payments) =============================================================================== Batch payments allow grouping payments from multiple customers to ease :doc:`reconciliation -`. They are also useful when depositing :doc:`checks ` or -cash payments to the bank or for generating bank payment files such as :doc:`SEPA -` or :ref:`NACHA `. +`. They are also useful when depositing :ref:`checks +` or cash payments to the bank or for generating bank payment files such +as :doc:`SEPA ` or :ref:`NACHA `. .. seealso:: :doc:`payments/batch` @@ -366,7 +400,6 @@ Reconciling payments with bank transactions :titlesonly: payments/online - payments/checks payments/batch payments/batch_sdd payments/follow_up diff --git a/content/applications/finance/accounting/payments/batch.rst b/content/applications/finance/accounting/payments/batch.rst index 75de741ef3..71792fa9c0 100644 --- a/content/applications/finance/accounting/payments/batch.rst +++ b/content/applications/finance/accounting/payments/batch.rst @@ -6,8 +6,8 @@ Batch payments allow grouping payments from multiple customers or vendors into a generating a detailed deposit slip or payment file with a batch reference. This reference can be used during :doc:`reconciliation <../bank/reconciliation>` to match bank transactions with the corresponding payments. This feature is particularly useful for submitting :doc:`SEPA Direct Debit -payments `, depositing cash payments or :doc:`checks `, or generating outgoing -payment files, such as :doc:`SEPA ` or :ref:`NACHA `. +payments `, depositing cash payments or :ref:`checks `, or +generating outgoing payment files, such as :doc:`SEPA ` or :ref:`NACHA `. Configuration ============= @@ -49,7 +49,7 @@ Bank reconciliation ------------------- Once the bank transactions :doc:`have been created <../bank/transactions>` in your database, you can -:ref:`reconcile them with the batch payment `. +:ref:`reconcile ` them with the batch payment. .. seealso:: - :doc:`../payments` diff --git a/content/applications/finance/accounting/payments/batch_sdd.rst b/content/applications/finance/accounting/payments/batch_sdd.rst index 771dea3c7e..af89ec89a2 100644 --- a/content/applications/finance/accounting/payments/batch_sdd.rst +++ b/content/applications/finance/accounting/payments/batch_sdd.rst @@ -29,9 +29,9 @@ Creditor identifier ------------------- To enable |sdd| for customer payments, go to :menuselection:`Accounting --> Configuration --> -Settings`, scroll to the :guilabel:`Customer Payments` section, enable :guilabel:`SEPA Direct -Deposit (SDD)`, and click :guilabel:`Save`. Then, scroll to the :guilabel:`Customer Payments` -section again, set the company's :guilabel:`Creditor Identifier`, and click :guilabel:`Save`. +Settings`, scroll to the :guilabel:`Customer Payments` section, enable :guilabel:`SEPA Direct Debit +(SDD)`, and click :guilabel:`Save`. Then, scroll to the :guilabel:`Customer Payments` section again, +set the company's :guilabel:`Creditor Identifier`, and click :guilabel:`Save`. .. tip:: The creditor identifier is provided by your bank or the authority responsible for delivering @@ -89,6 +89,8 @@ Once an |sdd| mandate is active, subsequent |sdd| payments can be generated via active |sdd| mandate can also use this payment method for :doc:`online purchases <../../payment_providers/sdd>`. +.. _accounting/batch_sdd/close-revoke-mandate: + Closing or revoking a mandate ----------------------------- @@ -104,7 +106,8 @@ date. However, payments that have already been registered are still included in XML file `. .. warning:: - Closed or revoked mandates cannot be reactivated. + - Mandates are automatically closed 36 months after the date of the last collection. + - Closed or revoked mandates cannot be reactivated. .. _accounting/batch_sdd/XML: @@ -150,7 +153,7 @@ automatically withdraws the amount of that payment from the recipient's account, transaction for a negative amount is created to reflect the |sdd| rejection. |sdd| rejections are handled differently depending on whether :ref:`outstanding accounts -` are configured or not for the |sdd| payment method. +` are configured or not for the |sdd| payment method. .. note:: The following procedures assume that the incoming |sdd| payment's bank transaction has already @@ -160,8 +163,8 @@ transaction for a negative amount is created to reflect the |sdd| rejection. .. tab:: Without outstanding accounts - If no :ref:`outstanding accounts ` are configured for - the |sdd| payment method, no journal entry is created. In this case, you must cancel and + If no :ref:`outstanding accounts ` are configured + for the |sdd| payment method, no journal entry is created. In this case, you must cancel and unreconcile the payment. #. Access the invoice linked to the rejected |sdd| payment. @@ -177,11 +180,11 @@ transaction for a negative amount is created to reflect the |sdd| rejection. .. tab:: Using outstanding accounts - If an :ref:`outstanding account ` is set on the |sdd| - payment method, |sdd| payments create journal entries. If an |sdd| payment is rejected, you - must reverse the journal entry associated with the rejected payment and reconcile the reversal - of the journal entry with the transaction for the |sdd| rejection. To do so, follow these - steps: + If an :ref:`outstanding account ` is set on the + |sdd| payment method, |sdd| payments create journal entries. If an |sdd| payment is rejected, + you must reverse the journal entry associated with the rejected payment and reconcile the + reversal of the journal entry with the transaction for the |sdd| rejection. To do so, follow + these steps: #. Access the invoice linked to the rejected |sdd| payment. #. Click the :icon:`fa-info-circle` :guilabel:`(information)` icon in the footer of the diff --git a/content/applications/finance/accounting/payments/checks.rst b/content/applications/finance/accounting/payments/checks.rst deleted file mode 100644 index b05f44e3ec..0000000000 --- a/content/applications/finance/accounting/payments/checks.rst +++ /dev/null @@ -1,128 +0,0 @@ -====== -Checks -====== - -There are two ways to handle payments received by checks in Odoo, either by using :ref:`outstanding -accounts ` or by :ref:`bypassing the reconciliation process -`. - -**Using outstanding accounts is recommended**, as your bank account balance stays accurate by taking -into account checks yet to be cashed. - -.. note:: - Both methods produce the same data in your accounting at the end of the process. But if you - have checks that have not been cashed in, the **Outstanding Account** method reports these - checks in the **Outstanding Receipts** account. However, funds appear in your bank account - whether or not they are reconciled, as the bank value is reflected at the moment of the bank - statement. - -.. seealso:: - * :ref:`Outstanding accounts ` - * :ref:`Bank reconciliation ` - -.. _checks/outstanding-account: - -Method 1: Outstanding account -============================= - -When you receive a check, you :doc:`record a payment <../bank/reconciliation>` by check on the -invoice. Then, when your bank account is credited with the check's amount, you reconcile the payment -and statement to move the amount from the **Outstanding Receipt** account to the **Bank** account. - -.. tip:: - You can create a new payment method named *Checks* if you would like to identify such payments - quickly. To do so, go to :menuselection:`Accounting --> Configuration --> Journals --> Bank`, - click the :guilabel:`Incoming Payments` tab, and :guilabel:`Add a line`. As :guilabel:`Payment - Method`, select :guilabel:`Manual`, and enter `Checks` as name. - -.. _checks/reconciliation-bypass: - -Method 2: Reconciliation bypass -=============================== - -When you receive a check, you :doc:`record a payment <../bank/reconciliation>` on the related -invoice. The amount is then moved from the **Account Receivable** to the **Bank** account, bypassing -the reconciliation and creating only **one journal entry**. - -To do so, you *must* follow the following setup. Go to :menuselection:`Accounting --> Configuration ---> Journals --> Bank`. Click the :guilabel:`Incoming Payments` tab and then :guilabel:`Add a line`, -select :guilabel:`Manual` as :guilabel:`Payment Method`, and enter `Checks` as :guilabel:`Name`. -Click the toggle menu button, tick :guilabel:`Outstanding Receipts accounts`, and in the -:guilabel:`Outstanding Receipts accounts` column, and set the :guilabel:`Bank` account for the -**Checks** payment method. - -.. image:: checks/outstanding-payment-accounts.png - :alt: Bypass the Outstanding Receipts account using the Bank account. - -Payment registration -==================== - -.. note:: - By default, there are two ways to register payments made by check: - - - **Manual**: for single checks; - - **Batch**: for multiple checks at once. - - This documentation focuses on **single-check** payments. For **batch deposits**, see :doc:`the - batch payments documentation `. - -Once you receive a customer check, go to the related invoice (:menuselection:`Accounting --> -Customer --> Invoices)`, and click :guilabel:`Register Payment`. Fill in the payment information: - -- :guilabel:`Journal: Bank`; -- :guilabel:`Payment method`: :guilabel:`Manual` (or **Checks** if you have created a specific - payment method); -- :guilabel:`Memo`: enter the check number; -- Click :guilabel:`Create Payment`. - -.. image:: checks/payment-checks.png - :alt: Check payment info - -The generated journal entries are different depending on the payment registration method chosen. - -Journal entries -=============== - -Outstanding account -------------------- - -The invoice is marked as :guilabel:`In Payment` as soon as you record the payment. This operation -produces the following **journal entry**: - -+----------------------+-------------------+----------+----------+ -| Account | Statement Match | Debit | Credit | -+======================+===================+==========+==========+ -| Account Receivable | | | 100.00 | -+----------------------+-------------------+----------+----------+ -| Outstanding Receipts | | 100.00 | | -+----------------------+-------------------+----------+----------+ - -Then, once you receive the bank statements, match this statement with the check of the **Outstanding -Receipts** account. This produces the following **journal entry**: - -+---------------------+-------------------+----------+----------+ -| Account | Statement Match | Debit | Credit | -+=====================+===================+==========+==========+ -| Outstanding Receipts| X | | 100.00 | -+---------------------+-------------------+----------+----------+ -| Bank | | 100.00 | | -+---------------------+-------------------+----------+----------+ - -If you use this approach to manage received checks, you get the list of checks that have not been -cashed in the **Outstanding Receipt** account (accessible, for example, from the general ledger). - -Reconciliation bypass ---------------------- - -The invoice is marked as :guilabel:`Paid` as soon as you record the check. - -With this approach, you bypass the use of **outstanding accounts**, effectively getting only one -journal entry in your books and bypassing the reconciliation: - -+----------------------+-------------------+----------+----------+ -| Account | Statement Match | Debit | Credit | -+======================+===================+==========+==========+ -| Account Receivable | X | | 100.00 | -+----------------------+-------------------+----------+----------+ -| Bank | | 100.00 | | -+----------------------+-------------------+----------+----------+ diff --git a/content/applications/finance/accounting/payments/checks/outstanding-payment-accounts.png b/content/applications/finance/accounting/payments/checks/outstanding-payment-accounts.png deleted file mode 100644 index 05703eba1d..0000000000 Binary files a/content/applications/finance/accounting/payments/checks/outstanding-payment-accounts.png and /dev/null differ diff --git a/content/applications/finance/accounting/payments/checks/payment-checks.png b/content/applications/finance/accounting/payments/checks/payment-checks.png deleted file mode 100644 index 91930cc064..0000000000 Binary files a/content/applications/finance/accounting/payments/checks/payment-checks.png and /dev/null differ diff --git a/content/applications/finance/accounting/payments/forecast.rst b/content/applications/finance/accounting/payments/forecast.rst index bc651f0b90..5a3f1dc980 100644 --- a/content/applications/finance/accounting/payments/forecast.rst +++ b/content/applications/finance/accounting/payments/forecast.rst @@ -18,7 +18,7 @@ click on :guilabel:`Create` to add new terms or click existing ones to modify th .. seealso:: `Odoo Tutorials: Payment Terms - `_ + `_ Once **Payment Terms** are defined, you can assign them to your vendor by default. To do so, go to :menuselection:`Vendors --> Vendors`, select a vendor, click the :guilabel:`Sales & Purchase` tab, diff --git a/content/applications/finance/accounting/payments/online.rst b/content/applications/finance/accounting/payments/online.rst index 3bb734f7e2..fbeadbac1e 100644 --- a/content/applications/finance/accounting/payments/online.rst +++ b/content/applications/finance/accounting/payments/online.rst @@ -4,10 +4,6 @@ Online payments =============== -.. toctree:: - - online/install_portal_patch - To make it more convenient for your customers to pay the invoices you issue, you can activate the **Invoice Online Payment** feature, which adds a *Pay Now* button on their **Customer Portal**. This allows your customers to see their invoices online and pay directly with their favorite payment diff --git a/content/applications/finance/accounting/payments/online/install_portal_patch.rst b/content/applications/finance/accounting/payments/online/install_portal_patch.rst deleted file mode 100644 index f2adbc0054..0000000000 --- a/content/applications/finance/accounting/payments/online/install_portal_patch.rst +++ /dev/null @@ -1,57 +0,0 @@ -=================================================== -Install the patch to disable online invoice payment -=================================================== - -Following recent changes in Odoo 16, you might be warned that disabling the :guilabel:`Invoice -Online Payment` setting will uninstall modules. If you want to disable the feature without -uninstalling modules, follow the steps below to install the module **Payment - Account / Invoice -Online Payment Patch**. - -.. note:: - | If your Odoo database is created after the module **Payment - Account / Invoice Online Payment - Patch** was released, you don't have anything to do. - | To check if the module is already installed, go to :guilabel:`Apps`, remove the `Apps` filter, - and search for `account_payment`. If the module **Payment - Account / Invoice Online Payment - Patch** is present and marked as installed, your Odoo database is already up-to-date and you - are able to disable the feature without side-effect. - -Update Odoo to the latest release -================================= - -The possibility to disable the :guilabel:`Invoice Online Payment` setting without side-effect is -made available through a new Odoo module; to be able to install it, you must make sure that your -Odoo source code is up-to-date. - -If you use Odoo on Odoo.com or Odoo.sh platform, your code is already up-to-date and you can proceed -to the next step. - -If you use Odoo with an on-premise setup or through a partner, you must update your installation as -detailed in :doc:`this documentation page `, or by contacting -your integrating partner. - -Update the list of available modules -==================================== - -New modules must be *discovered* by your Odoo instance to be available in the **Apps** menu. - -To do so, activate the :ref:`developer mode `, and go to :menuselection:`Apps --> -Update Apps List`. A wizard will ask for confirmation. - -Install the module Invoice Online Payment Patch -=============================================== - -.. warning:: - You should never install new modules in your production database without first testing them in a - duplicate or staging environment. For Odoo.com customers, a duplicate database can be created - from the database management page. For Odoo.sh users, you should use a staging or duplicate - database. For on-premise users, you should use a staging environment---contact your integrating - partner for more information regarding how to test a new module in your particular setup. - -The module should now be available in your :guilabel:`Apps` menu. Remove the ``Apps`` filter and -search for ``account_payment``; the module :guilabel:`Payment - Account / Invoice Online Payment Patch` -should be available for installation. If you cannot find the module after having updated the list -of available modules, it means your Odoo source code is not up-to-date; refer to step one of this -page. - -Once the module is installed, disabling the feature will work as intended and will not ask you to -uninstall installed applications or modules. diff --git a/content/applications/finance/accounting/reporting/analytic_accounting.rst b/content/applications/finance/accounting/reporting/analytic_accounting.rst index 392f83813f..d2b6dc99bd 100644 --- a/content/applications/finance/accounting/reporting/analytic_accounting.rst +++ b/content/applications/finance/accounting/reporting/analytic_accounting.rst @@ -2,138 +2,195 @@ Analytic accounting =================== -Analytic accounting helps you track costs and revenues, as well as analyze the profitability of a -project or service. When creating your journal entries, the analytic widget allows the distribution -of costs in one or more analytic accounts. +Analytic accounting helps track costs and revenues and analyze a project's or service's +profitability. When creating journal entries, costs can be :ref:`distributed +` across one or more analytic accounts. -.. _accounting/analytic_accounting/configuration: +To activate this feature, go to :menuselection:`Accounting --> Configuration --> Settings` and +enable :guilabel:`Analytic Accounting` in the :guilabel:`Analytics` section. -Configuration -============= - -Enable the :guilabel:`Analytic Accounting` feature by going to :menuselection:`Accounting --> -Configuration --> Settings --> Analytics`. +.. seealso:: + :doc:`Analytic budget ` .. _accounting/analytic_accounting/analytic_accounts: Analytic accounts ================= -The analytic accounts give an overview of your costs and revenue. +Analytic accounts give an overview of costs and revenue. -Access your existing analytic accounts by going to :menuselection:`Accounting --> Configuration --> -Analytic Accounting: Analytic Accounts`. To create a new analytic account, click :guilabel:`New`, -and fill in the required information: +To access analytic accounts, go to :menuselection:`Accounting --> Configuration --> Analytic +Accounts`. To create a new analytic account, click :guilabel:`New` and fill in the following +information: -- :guilabel:`Analytic Account`: add the name of your analytic account; -- :guilabel:`Customer`: select the customer related to your project; -- :guilabel:`Reference`: add a reference to make it easier to find the account when you are on your - bill; -- :guilabel:`Plan`: add an :ref:`analytic plan `; -- :guilabel:`Company`: if you are managing multiple companies, select the company for which the - analytic account will be used; -- :guilabel:`Currency`: select the currency of the analytic account; +- :guilabel:`Analytic Account`: Assign the name of the analytic account. +- :guilabel:`Customer`: Select the customer linked to the project, if applicable. +- :guilabel:`Reference`: Include a reference to make the account easier to find if needed. +- :guilabel:`Plan`: Link the :guilabel:`Analytic Account` to an :ref:`analytic plan + `. +- :guilabel:`Company`: In a :doc:`multi-company ` + environment, select the company using the analytic account. To make the analytic account + accessible to all companies, leave the field empty. +- :guilabel:`Currency`: Update the currency of the analytic account if needed. -Then, fill in your :doc:`budget ` information. +Then, the :doc:`budget ` information can be filled in. .. _accounting/analytic_accounting/analytic_plans: Analytic plans ============== -The analytic plans allow you to analyze your accounting. For example, to track costs and revenues by -project or department. - -You can access the analytic plans by going to :menuselection:`Accounting --> Configuration --> -Analytic Accounting: Analytic Plans`. Click :guilabel:`New` to create a new plan. - -.. image:: analytic_accounting/analytic_plans.png - :align: center - :alt: create an analytic plan +Analytic plans group :ref:`analytic accounts `, +allowing the company to analyze its accounting, such as tracking costs and revenues by project or +department. -The following information must be completed: +To access analytic plans, go to :menuselection:`Accounting --> Configuration --> Analytic Plans`. +Click :guilabel:`New` to create a new plan, add a name, and fill in the following information: -- :guilabel:`Parent`: link your plan to another :guilabel:`Analytic Plan` to build a hierarchy - between your plans; -- :guilabel:`Default Applicability`: decide how your plan behaves in the widget when creating a new - journal entry: +- :guilabel:`Parent`: Link the plan to another analytic plan if a hierarchy between plans must be + built. +- :guilabel:`Default Applicability`: Define how the plan is applied when creating a new journal + entry: - - :guilabel:`Optional`: if selected, it is not mandatory to add the analytic plan in the widget; - - :guilabel:`Mandatory`: if selected, an orange bullet is visible in the widget next to the plan - until the analytic distribution is done (the bullet then turns to green); it is not possible to - confirm the entry if no analytic account is selected; - - :guilabel:`Unavailable`: if selected, the plan is not available in the widget. + - :guilabel:`Optional`: Adding the analytic plan is not mandatory. + - :guilabel:`Mandatory`: The entry cannot be confirmed if no analytic account is selected. + - :guilabel:`Unavailable`: The plan is not available. -- :guilabel:`Color`: select the color of the tag related to this specific plan; -- :guilabel:`Company`: add the company to which the plan applies; +- :guilabel:`Color`: Set a color for the tag related to this specific plan. -You can also fine-tune your plans' applicability by filling in the :guilabel:`Applicability` tab: +To fine-tune a plan's applicability, create a new line in the :guilabel:`Applicability` tab and set +the following fields: -- :guilabel:`Domain`: choose to which accounting document your plan applies; -- :guilabel:`Financial Accounts Prefix`: select the prefix of the account(s) to which this plan - should be applied; -- :guilabel:`Product Category`: decide to which product category the plan applies; -- :guilabel:`Applicability`: decide how your plan behaves in the widget when creating a new journal - entry. The applicability you set here always overrides the default applicability. +- :guilabel:`Domain`: Choose the accounting documents to which the plan applies. +- :guilabel:`Financial Accounts Prefixes`: Enter the prefix(es) of the account(s) to which the plan + applies. +- :guilabel:`Product Category`: Choose the product category to which the plan applies. +- :guilabel:`Applicability`: Define how the plan is applied when creating a new journal entry. The + applicability set here always overrides the default applicability. +- :guilabel:`Company`: In a :doc:`multi-company ` + environment, select the company using the plan. To make the analytic plan accessible to all + companies, leave the field empty. -Two smart buttons are available in the top-right corner: +Two smart buttons are available: - - :guilabel:`Subplans`: can be created to have a more complex analytic structure. Click the - :guilabel:`Subplans` smart button, and then :guilabel:`New` to add a subplan; - - :guilabel:`Analytic Accounts`: to reach the analytic accounts related to the plan. +- :guilabel:`Subplans`: To have a more complex analytic structure. Click the smart button, then + click :guilabel:`New` to add a subplan. This creates a parent-child relationship between the two + plans, and the :guilabel:`Parent` field of the subplan is automatically populated with the + original plan. +- :guilabel:`Analytic Accounts`: To access the :ref:`analytic accounts + ` linked to the plan. .. note:: - - The analytic widget is prefilled based on the applicability, and the - :ref:`Analytic Distribution Models `; - - Each analytic plan must have at least one analytic account. + Each analytic plan must have at least one analytic account. .. _accounting/analytic_accounting/analytic-distribution: Analytic distribution ===================== -Add a plan in the :guilabel:`Analytic` column when creating an invoice or bill. This field is -mandatory only if you previously linked your analytic plan to at least one analytic account. After -adding the plan, a **widget** opens where you can fill in the different information. You can add -**tags** to reflect the related analytic accounts and decide how to split the costs between the +The distribution of costs in one or more analytic accounts can be set in each :ref:`invoice/bill +` or :ref:`en masse +`. + +.. note:: + The analytic distribution is prefilled based on the applicability and the :ref:`analytic + distribution models `. + +.. _accounting/analytic_accounting/distribution-invoices-bills: + +Analytic distribution on invoices or bills +------------------------------------------ + +To add analytic distribution, click the :guilabel:`Analytic Distribution` column when creating an +:ref:`invoice ` or :ref:`bill `. + +.. note:: + The :guilabel:`Analytic Distribution` field is mandatory only if the :ref:`analytic plan + ` has been set as :guilabel:`Mandatory` in either + the :guilabel:`Default Applicability` field on an analytic plan or the :guilabel:`Applicability` + field on an analytic plan line. + +In the :guilabel:`Analytic` window, select the desired :guilabel:`Analytic Accounts` in the +different :guilabel:`Analytic Plans` displayed in columns. Then, split the costs between the accounts by modifying the percentage. -.. image:: analytic_accounting/analytic_distribution.png - :align: center +.. image:: analytic_accounting/analytic-distribution.png :alt: create a distribution template -.. _analytic_distribution_models: +.. _accounting/analytic_accounting/distribution-mass: + +Analytic distribution en masse +------------------------------ + +To mass-edit analytic accounts in several entries simultaneously, go to :menuselection:`Accounting +--> Accounting --> Journal items`, and select the ones that need to be updated. Click the +:guilabel:`Analytic Distribution` column and add the required distribution in the +:guilabel:`Analytic` column, then click the :icon:`oi-close` :guilabel:`(cross)` and +:guilabel:`Confirm`. The analytic distribution is then added to the selected journal items. -.. _accounting/analytic_accounting/analytic-distribution-models: +.. _accounting/analytic_distribution_models: Analytic distribution models ---------------------------- -The analytic distribution models automatically apply a specific distribution based on defined -criteria. +Analytic distribution models automatically apply a specific distribution based on defined criteria. To create a new analytic distribution model, go to :menuselection:`Accounting --> Configuration --> -Analytic Distribution Models`, click :guilabel:`New` and set the conditions your model has to meet -to automatically apply: - -- :guilabel:`Accounts Prefix`: this analytic distribution will apply to all financial accounts - sharing the prefix specified; -- :guilabel:`Partner`: select a partner for which the analytic distribution will be used; -- :guilabel:`Partner Category`: this field is not visible by default: add it by clicking on the - columns selection button, and tick the :guilabel:`Partner Category` box. Add the partner category - for which the analytic distribution will be used; -- :guilabel:`Product`: select a product for which the analytic distribution will be used; -- :guilabel:`Product Category`: this field is not visible by default: add it by clicking on the - columns selection button, and tick the :guilabel:`Product Category` box. Select a product category - for which the analytic distribution will be used; -- :guilabel:`Analytic`: add the analytic accounts and their distribution; -- :guilabel:`Company`: select a company for which the analytic distribution will be used; -- :guilabel:`Analytic Distribution`: if the above conditions are met, the :guilabel:`Analytic plan` - defined in this field as well as the distribution to be applied between the different analytic - accounts is selected automatically on the entry. +Analytic Distribution Models`, click :guilabel:`New`, and set the conditions the model has to meet +to apply automatically: + +.. note:: + - All specified conditions of an analytic distribution model must be met for the model to be + applied. To apply an analytic distribution model based on individual conditions, create + separate analytic distribution models for each condition. + - Analytic distribution models can be combined and sequenced, allowing distribution across + multiple models if linked to different + :ref:`analytic plans `. To adjust the order, + drag and drop the models using the :icon:`oi-draggable` :guilabel:`(draggable)` icon. + +- :guilabel:`Accounts Prefixes`: Apply the distribution model only to journal items involving + accounts that begin with specific prefixes. +- :guilabel:`Partner`: Apply the distribution model only to journal items involving a specific + partner. +- :guilabel:`Product`: Apply the distribution model only to journal items involving a specific + product. +- :guilabel:`Company`: In a :doc:`multi-company ` + environment, apply the distribution model only to journal items involving a specific company. To + apply it across all companies, leave the field empty. +- :guilabel:`Analytic Distribution`: :ref:`Analytic distribution + ` that will be applied when the above + conditions are met. + +.. example:: + Any time a journal item is posted to the :guilabel:`Utilities (601000)` account, it should be + automatically distributed in the :guilabel:`Departments` analytic plan as follows: + + - 60% to the :guilabel:`Manufacturing` analytic account + - 30% to the :guilabel:`Marketing` analytic account + - 10% to the :guilabel:`Admin` analytic account + + To automate this distribution, the :guilabel:`Accounts Prefix` can be set to `601`, as + :guilabel:`Utilities (601000)` is the only account in the chart of accounts that begins with + `601`. + + If additional accounts such as :guilabel:`Electricity (601100)` or :guilabel:`Gas (601200)` are + available in the chart of accounts, the distribution will also apply to both since they share the + same prefix. + +To define more criteria, use the :icon:`oi-settings-adjust` :guilabel:`(adjust settings)` icon to +reveal more columns or click :guilabel:`View` on an individual analytic distribution model. + +- :guilabel:`Partner Category`: Apply this distribution model only to journal items involving a + partner in a specific category. +- :guilabel:`Product Category`: Apply this distribution model to journal items involving a product + in a specific category. .. tip:: - To **mass edit** several entries simultaneously, go to :menuselection:`Accounting --> Accounting - --> Journal items`, and select the ones that need to be updated. Add the required distribution in - the :guilabel:`Analytic Distribution` column, and click on the :guilabel:`floppy disk` icon to - save. The analytic distribution template pops up, and you can save it for later use. + Alternatively, it is possible to create an analytic distribution model from the + :guilabel:`Analytic` window by clicking :guilabel:`New Model`: + + - either when creating an invoice/bill and filling in the :ref:`analytic distribution + `; + - or when :ref:`mass-editing analytic accounts + ` in several entries simultaneously. + diff --git a/content/applications/finance/accounting/reporting/analytic_accounting/analytic-distribution.png b/content/applications/finance/accounting/reporting/analytic_accounting/analytic-distribution.png new file mode 100644 index 0000000000..fa376a9eb8 Binary files /dev/null and b/content/applications/finance/accounting/reporting/analytic_accounting/analytic-distribution.png differ diff --git a/content/applications/finance/accounting/reporting/analytic_accounting/analytic_distribution.png b/content/applications/finance/accounting/reporting/analytic_accounting/analytic_distribution.png deleted file mode 100644 index f965fc08dc..0000000000 Binary files a/content/applications/finance/accounting/reporting/analytic_accounting/analytic_distribution.png and /dev/null differ diff --git a/content/applications/finance/accounting/reporting/analytic_accounting/analytic_plans.png b/content/applications/finance/accounting/reporting/analytic_accounting/analytic_plans.png deleted file mode 100644 index 53a1bbeec3..0000000000 Binary files a/content/applications/finance/accounting/reporting/analytic_accounting/analytic_plans.png and /dev/null differ diff --git a/content/applications/finance/accounting/reporting/budget.rst b/content/applications/finance/accounting/reporting/budget.rst index 371e176b38..c6e48c8d00 100644 --- a/content/applications/finance/accounting/reporting/budget.rst +++ b/content/applications/finance/accounting/reporting/budget.rst @@ -64,7 +64,7 @@ account(s) selected in the distribution are automatically updated. The :guilabel reflects the current result according to the items of confirmed journal entries for the associated :ref:`analytic account `. In contrast, the :guilabel:`Committed` amount displays the full value of the :guilabel:`Achieved` amount, plus any -confirmed sales or purchase orders that have not yet been invoiced or billed. +confirmed purchase orders that have not yet been billed. .. note:: - When a line in a request for quotation or purchase order includes an analytic distribution, a diff --git a/content/applications/finance/accounting/reporting/customize.rst b/content/applications/finance/accounting/reporting/customize.rst index b5268cacd1..094b624b8b 100644 --- a/content/applications/finance/accounting/reporting/customize.rst +++ b/content/applications/finance/accounting/reporting/customize.rst @@ -3,20 +3,21 @@ Custom reports ============== Odoo comes with a powerful and easy-to-use reporting framework. The engine allows you to create new -reports, such as **tax reports**, or **balance sheets** and **income statements** with **specific -groupings** and **layouts**. +reports, such as tax reports, balance sheets, and income statements with specific groupings and +layouts. .. important:: - Activate the :ref:`developer mode ` to access the accounting report creation - interface. + Activate the :ref:`developer mode ` to access the accounting report + configuration. -To create a new report, go to :menuselection:`Accounting --> Configuration --> Management: -Accounting Reports`. From here, you can either create a :ref:`root report ` -or a :ref:`variant `. +To create a new report, go to :menuselection:`Accounting --> Configuration --> Accounting Reports`. +From here, create either a :ref:`root report ` or a :ref:`variant +`. -.. image:: customize/engine-accounting-reports.png - :align: center - :alt: Accounting reports engine. +.. tip:: + - Consider saving modified reports as report variants to keep their root reports intact. + - To access an existing report's management interface from the report itself, click on the + :icon:`fa-cogs` :guilabel:`(gears)` icon. .. _customize-reports/root: @@ -31,18 +32,14 @@ report itself. A tax report for Belgium and the US would both use the same generic version as a base and adapt it for their domestic regulations. -When creating a new root report, you need to create a **menu item** for it. To do so, open the -report and then, on that same report, click on :menuselection:`Action --> Create Menu Item`. Refresh -the page; the report is now available under :menuselection:`Accounting --> Reporting`. +Creating a menu item is required to access a new root report. To do so, open the report's +configuration, click :guilabel:`Action`, :guilabel:`Create Menu Item`, and refresh the page. The +report is now available under :menuselection:`Accounting --> Reporting`. .. note:: Cases that require creating a new root report are rare, such as when a country's tax authorities require a new and specific type of report. -.. image:: customize/engine-create-menu-item.png - :align: center - :alt: Create Menu Item button. - .. _customize-reports/variants: Variants @@ -52,50 +49,49 @@ Variants are country-specific versions of root reports and, therefore, always re report. To create a variant, select a generic (root) report in the :guilabel:`Root Report` field when creating a new report. -When a root report is opened from one of the accounting app's main menus, all its variants are -displayed in the variant selector in the top right corner of the view. +When a root report is opened from the Accounting app's :guilabel:`Reporting` menu, all of its +variants are displayed in the report variant selector in the top right corner of the view. .. example:: - In the following image, :guilabel:`VAT Report (BE)` is the variant of the root :guilabel:`Generic - Tax report`. + :guilabel:`VAT Report (BE)` is a variant of the root :guilabel:`Generic Tax report`. .. image:: customize/engine-variant.png - :align: center :alt: Report variant selection. +.. _accounting/customize/lines: + Lines ===== -After having created a report (either root or variant), you need to fill it with lines. You can -either create a new one by clicking on :guilabel:`Add a line`, or modify an existing line by -clicking on it. All lines *require* a :guilabel:`Name`, and can have an optional additional -:guilabel:`Code` (of your choice) if you wish to use their value in formulas. +After creating a report (either root or variant), the next step is to fill it with lines. To create +a new line, click on :guilabel:`Add a line`. To modify an existing line, click on the line itself +and edit the popup. All lines require a :guilabel:`Name` and can have an optional :guilabel:`Code` +which allows using the line's value in formulas. .. image:: customize/engine-lines-options.png - :align: center :alt: Engine lines options. Expressions =========== Each line can contain one or multiple **expressions**. Expressions can be seen as **sub-variables** -needed by a report line. To create an expression, click on :guilabel:`Add a line` *within* a line -report. +needed by a report line. To create an expression, click on :guilabel:`Add a line` *within* a line's +popup. -When creating an expression, you must attribute a :guilabel:`label` used to refer to that -expression. Therefore, it has to be **unique** among the expressions of each line. Both a -:guilabel:`Computation Engine` and a :guilabel:`Formula` must also be indicated. The **engine** -defines how your **formula(s)** and **subformula(s)** are interpreted. It is possible to mix -expressions using different computation engines under the same line if you need to. +When creating an expression, you must enter a :guilabel:`Label` used to refer to that expression. +The label must be unique among the expressions of each report line. Both the :guilabel:`Computation +Engine` and the :guilabel:`Formula` fields must also be completed. The **computation engine** +defines how the **formula(s)** and **subformula(s)** are interpreted. It is possible to mix +expressions using different computation engines under the same line if needed. .. note:: Depending on the engine, :guilabel:`subformulas` may also be required. -'Odoo Domain' engine --------------------- +Odoo Domain computation engine +------------------------------ -With this engine, a formula is interpreted as an :ref:`Odoo domain ` -targeting `account.move.line` objects. +When using the :guilabel:`Odoo Domain` computation engine, a formula is interpreted as an :ref:`Odoo +domain ` targeting `account.move.line` objects. The subformula allows you to define how the move lines matching the domain are used to compute the value of the expression: @@ -112,39 +108,39 @@ value of the expression: Otherwise, it is `0`. `count_rows` - The result is the number of sub-lines of this expression. If the parent line has a group-by - value, this will correspond to the number of distinct grouping keys in the matched move lines. - Otherwise, it will be the number of matched move lines. + The result is the number of sub-lines of this expression. If the parent line has a :ref:`group-by + ` value, this will correspond to the number of distinct + grouping keys in the matched move lines. Otherwise, it will be the number of matched move lines. -You can also put a `-` sign at the beginning of the subformula to **reverse** the sign of the -result. +.. tip:: + To **reverse** the sign of the result, put a `-` sign at the beginning of the subformula. .. image:: customize/engine-expressions.png - :align: center :alt: Expression line within a line report -'Tax Tags' engine ------------------ +Tax Tags computation engine +--------------------------- -A formula made for this engine consists of a name used to match tax tags. If such tags do not exist -when creating the expression, they will be created. +When using the :guilabel:`Tax Tags` computation engine, the contents of the :guilabel:`Formula` +field are matched to tax tags. If such tags do not exist when creating the expression, they will be +created. When evaluating the expression, the expression computation can roughly be expressed as: **(amount of the move lines with** `+` **tag)** `-` **(amount of the move lines with** `-` **tag)**. .. example:: - If the formula is `tag_name`, the engine matches tax tags `+tag_name` and `-tag_name`, creating - them if necessary. To exemplify further: two tags are matched by the formula. If the formula - is `A`, it will require (and create, if needed) tags `+A` and `-A`. + If the :guilabel:`Formula` is set to `tag_name`, the engine matches tax tags `+tag_name` and + `-tag_name`, creating them if necessary. To exemplify further: two tags are matched by the + formula. If the formula is `A`, it will require (and create, if needed) tags `+A` and `-A`. -'Aggregate Other Formulas' engine ---------------------------------- +Aggregate Other Formulas computation engine +------------------------------------------- -Use this engine when you need to perform arithmetic operations on the amounts obtained for other -expressions. Formulas here are composed of references to expressions separated by one of the four -basic arithmetic operators (addition `+`, subtraction `-`, division `/`, and multiplication `*`). To -refer to an expression, type in its parent line's **code** followed by a period `.` and the -expression's **label** (ex. **code.label**). +The :guilabel:`Aggregate Other Formulas` computation engine performs arithmetic operations on the +amounts obtained from other expressions. Formulas here are composed of references to expressions +separated by one of the four basic arithmetic operators (addition `+`, subtraction `-`, division +`/`, and multiplication `*`). To refer to an expression, type in its parent line's **code** followed +by a period `.` and the expression's **label** (ex. **code.label**). **Subformulas** can be one of the following: @@ -176,11 +172,11 @@ that currency. `cross_report(xml_id | report_id)` Used to match an expression from another report targeted by the xml_id or the report ID itself. -'Prefix of Account Codes' engine --------------------------------- +Prefix of Account Codes computation engine +------------------------------------------ -This engine is used to match amounts made on accounts using the prefixes of these accounts' codes as -variables in an arithmetic expression. +The :guilabel:`Prefix of Account Codes` computation engine is used to match amounts made on accounts +using the prefixes of these accounts' codes as variables in an arithmetic expression. .. example:: | `21` @@ -227,9 +223,9 @@ accounts, where the same prefix might be used for different purposes across comp .. example:: | `tag(25)` - | This formula matches accounts whose associated tags contain the one with id *25*. + | This formula matches accounts whose associated tags contain the one with ID *25*. -If the tag you reference is defined in a data file, an xmlid can be used instead of the id. +If the tag you reference is defined in a data file, an XMLID can be used instead of the ID. .. example:: | `tag(my_module.my_tag)` @@ -256,14 +252,13 @@ Prefix exclusion also works with tags. | This formula matches accounts with the tag *my_module.my_tag* and a code not starting with `10`. +External Value computation engine +--------------------------------- -'External Value' engine ------------------------ - -The 'external value' engine is used to refer to **manual** and **carryover values**. Those values -are not stored using `account.move.line`, but with `account.report.external.value`. Each of these -objects directly points to the expression it impacts, so very little needs to be done about their -selection here. +The :guilabel:`External Value` computation engine is used to refer to **manual** and **carryover +values**. Those values are not stored using `account.move.line`, but with +`account.report.external.value`. Each of these objects directly points to the expression it impacts, +so very little needs to be done about their selection here. **Formulas** can be one of the following: @@ -289,15 +284,16 @@ Both subformulas can be mixed by separating them with a `;`. .. example:: | `editable;rounding=2` - | is a correct subformula mixing both behaviors. + | This subformula shows the correct way to mix both behaviors. -'Custom Python Function' engine -------------------------------- +Custom Python Function computation engine +----------------------------------------- -This engine is a means for developers to introduce custom computation of expressions on a -case-by-case basis. The formula is the name of a **python function** to call, and the subformula is -a **key** to fetch in the **dictionary** returned by this function. Use it only if you are making a -custom module of your own. +The :guilabel:`Custom Python Function` computation engine is a means for developers to introduce +custom computation of expressions on a case-by-case basis. The :guilabel:`Formula` is the name of a +**python function** to call, and the :guilabel:`Subformula` is a **key** to fetch in the +**dictionary** returned by this function. Use this computation engine only if making a custom +module. Columns ======= @@ -309,8 +305,56 @@ field, then nothing is displayed for it in this column. If multiple columns are use different **expression** labels. .. image:: customize/engine-columns.png - :align: center :alt: Columns of report. When using the **period comparison** feature found under the :guilabel:`Options` tab of an accounting report, all columns are repeated in and for each period. + +.. _customize-reports/lines-group-by: + +Line grouping +============= + +Non-standard grouping is possible by adding or using existing fields on the *Journal Item* model, +provided that the fields are related and non-stored. + +.. note:: + Grouping lines requires the report to have explicit report lines that can be edited. The deferred + reports, for example, do not support grouping lines as they use dynamic lines that are generated. + +Create a new field on journal item +---------------------------------- + +To create a non-stored, related field in the *Journal Item* model, first go to +:menuselection:`Accounting --> Journal Items`, and click the :icon:`fa-bug` :guilabel:`(bug)` icon, +then click :guilabel:`Fields`. Click :guilabel:`New` to create a new field, and complete the +following fields: + +- :guilabel:`Field Name`: a technical name for the field +- :guilabel:`Field Label`: the label to be displayed for the field +- :guilabel:`Field Type`: the type of field that this related field should point to +- :guilabel:`Stored`: Leave this field unchecked as only non-stored fields can be used to group + lines. +- :guilabel:`Related Model`: If the field type is :guilabel:`one2many`, :guilabel:`many2many`, or + :guilabel:`many2one`, select the model of the original field to group by. +- :guilabel:`Related Field Definition`: the technical path to the field you want to group by + + .. example:: + To group by the sales team of the commercial partner, set the related field definition to + `move_id.team_id`. + +Group lines +----------- + +To group lines, go to the :ref:`Lines ` tab of the desired report, click +on the line you want to group, and edit the :guilabel:`Group by` field. Enter the technical name +(:guilabel:`Field Name`) of the field to use as the grouping key. + +.. tip:: + To find a list of all the model's fields and their technical names, go to + :menuselection:`Accounting --> Journal Items`, and click the :icon:`fa-bug` :guilabel:`(bug)` + icon, then click :guilabel:`Fields`. The technical name of each field is listed in the + :guilabel:`Field Name` column. + +.. seealso:: + :ref:`Consolidation via grouping by account code ` diff --git a/content/applications/finance/accounting/reporting/customize/engine-accounting-reports.png b/content/applications/finance/accounting/reporting/customize/engine-accounting-reports.png deleted file mode 100644 index 99f4c30301..0000000000 Binary files a/content/applications/finance/accounting/reporting/customize/engine-accounting-reports.png and /dev/null differ diff --git a/content/applications/finance/accounting/reporting/customize/engine-columns.png b/content/applications/finance/accounting/reporting/customize/engine-columns.png index 7ca640e6b6..10bb63de7c 100644 Binary files a/content/applications/finance/accounting/reporting/customize/engine-columns.png and b/content/applications/finance/accounting/reporting/customize/engine-columns.png differ diff --git a/content/applications/finance/accounting/reporting/customize/engine-create-menu-item.png b/content/applications/finance/accounting/reporting/customize/engine-create-menu-item.png deleted file mode 100644 index fa63dd4853..0000000000 Binary files a/content/applications/finance/accounting/reporting/customize/engine-create-menu-item.png and /dev/null differ diff --git a/content/applications/finance/accounting/reporting/customize/engine-variant.png b/content/applications/finance/accounting/reporting/customize/engine-variant.png index 3c366e16e2..77f462c03a 100644 Binary files a/content/applications/finance/accounting/reporting/customize/engine-variant.png and b/content/applications/finance/accounting/reporting/customize/engine-variant.png differ diff --git a/content/applications/finance/accounting/reporting/tax_returns.rst b/content/applications/finance/accounting/reporting/tax_returns.rst index d3f02cf0db..9f3c02ceba 100644 --- a/content/applications/finance/accounting/reporting/tax_returns.rst +++ b/content/applications/finance/accounting/reporting/tax_returns.rst @@ -110,6 +110,15 @@ paid or refunded. entry. This safety mechanism can prevent some fiscal errors, but it is advised to lock your tax date manually before, as described above. +.. important:: + - Once the tax report for a period has been generated but not yet posted, additional invoices or + bills from that same period can still be posted and included in the closing entry. To do so, + click :icon:`oi-arrow-right` :guilabel:`Refresh` in the :guilabel:`Proposition of tax closing + journal entry`, or click :guilabel:`Closing Entry` again from the tax report. + - After the tax report has been posted for a period, Odoo locks the period and prevents the + creation of new journal entries involving VAT. Any corrections to customer invoices or vendor + bills must then be recorded in the following period. + .. seealso:: * :doc:`../taxes` * :doc:`../get_started` diff --git a/content/applications/finance/accounting/reporting/year_end.rst b/content/applications/finance/accounting/reporting/year_end.rst index c449bdf504..58b95784f4 100644 --- a/content/applications/finance/accounting/reporting/year_end.rst +++ b/content/applications/finance/accounting/reporting/year_end.rst @@ -5,48 +5,54 @@ Year-end closing Year-end closing is vital for maintaining financial accuracy, complying with regulations, making informed decisions, and ensuring transparency in reporting. +.. seealso:: + :doc:`Tax return ` + .. _year-end/fiscal-years: Fiscal years ============ -By default, the fiscal year is set to last 12 months and end on December 31st. However, its duration -and end date can vary due to cultural, administrative, and economic considerations. +By default, the fiscal year is set to last 12 months and ends on December 31st. However, its +duration and end date can vary due to cultural, administrative, and economic considerations. To modify these values, go to :menuselection:`Accounting --> Configuration --> Settings`. Under the :guilabel:`Fiscal Periods` section, change the :guilabel:`Last Day` field if necessary. If the period lasts *more* than or *less* than 12 months, enable :guilabel:`Fiscal Years` and -:guilabel:`Save`. Go back to the :guilabel:`Fiscal Periods` section and click :guilabel:`➜ Fiscal -Years`. From there, click :guilabel:`Create`, give it a :guilabel:`Name`, and both a +:guilabel:`Save`. Go back to the :guilabel:`Fiscal Periods` section and click :icon:`oi-arrow-right` +:guilabel:`Fiscal Years`. Then, click :guilabel:`New`, give it a :guilabel:`Name` and both a :guilabel:`Start Date` and :guilabel:`End Date`. .. note:: - Once the set fiscal period is over, Odoo automatically reverts to the default periodicity, taking - into account the value specified in the :guilabel:`Last Day` field. + Once the set fiscal period is over, Odoo automatically reverts to the default periodicity, + considering the value specified in the :guilabel:`Last Day` field. .. _year-end/checklist: Year-end checklist ================== +.. _year-end/before-closure: + Before closure -------------- -Before closing a fiscal year, ensure first everything is accurate and up-to-date: +Before closing a fiscal year, ensure that everything is accurate and up-to-date: - Make sure all bank accounts are fully :doc:`reconciled <../bank/reconciliation>` up to year-end, and confirm that the ending book balances match the bank statement balances. -- Verify that all :doc:`customer invoices <../customer_invoices>` have been entered and - approved and that there are no draft invoices. -- Confirm that all :doc:`vendor bills <../vendor_bills>` have been entered and agreed upon. -- Validate all :doc:`expenses <../../expenses>`, ensuring their accuracy. -- Corroborate that all :doc:`received payments <../payments>` have been encoded and recorded - accurately. -- Close all :ref:`suspense accounts `. +- Verify that all :doc:`customer invoices <../customer_invoices>` have been created and + confirmed and that there are no draft invoices. +- Confirm that all :doc:`vendor bills <../vendor_bills>` have been created and confirmed. +- Ensure the accuracy of all :doc:`expenses <../../expenses>` and validate them. +- Check that all :doc:`received payments <../payments>` have been encoded and confirmed. +- Close all :ref:`suspense accounts `. - Book all :doc:`depreciation <../vendor_bills/assets>` and :doc:`deferred revenue <../customer_invoices/deferred_revenues>` entries. +.. _year-end/closing-a-fiscal-year: + Closing a fiscal year --------------------- @@ -60,9 +66,9 @@ Then, to close the fiscal year: - Reconcile all transactions in the cash and bank accounts by running the :ref:`aged receivables ` and :ref:`aged payables ` reports. - - Audit all accounts, being sure to fully understand all transactions and their nature, making - sure to include loans and fixed assets. - - Optionally, :ref:`match payments ` to validate any open + - Audit all accounts, fully understanding all transactions and their nature, including :doc:`loans + <../bank/loans>` and :doc:`fixed assets <../vendor_bills/assets>`. + - Optionally, :ref:`match payments ` to validate any open vendor bills and customer invoices with their payments. While this step is optional, it could assist the year-end closing process if all outstanding payments and invoices are reconciled, potentially finding errors or mistakes in the system. @@ -76,40 +82,69 @@ Next, the accountant likely verifies balance sheet items and book entries for: - tax adjustments, - etc. -If the accountant is going through the year-end audit, they may want to have paper copies of all -balance sheet items (such as loans, bank accounts, prepayments, sales tax statements, etc.) to -compare these with the balances in Odoo. +During the year-end audit, the accountant may print paper copies of all balance sheet items (e.g., +loans, bank accounts, prepayments, sales tax statements) to compare them against the balances +recorded in Odoo. + +.. tip:: + As part of this process, setting a :ref:`Lock Everything ` date to + the last day (inclusive) of the preceding fiscal year is good practice. This ensures that journal + entries with an accounting date on or before the lock date cannot be created or modified during + the audit. Users with *administrator* access rights can still create and edit entries if an + exception is configured. + +.. _year-end/lock-everything-date: + +Lock everything date +~~~~~~~~~~~~~~~~~~~~ + +Setting a lock date prevents modifications to any posted journal entries with an accounting date on +or before the lock date. It also prevents posting new entries with an accounting date on or before +the lock date. In such cases, the system automatically sets the accounting date to the day after the +lock date. + +To set a :guilabel:`Lock Everything` date, go to :menuselection:`Accounting --> Accounting --> Lock +Dates`. In the :guilabel:`Lock Journal Entries` window, set the :guilabel:`Lock Everything` date and +:guilabel:`Save`. + +.. note:: + Users with :guilabel:`Administrator` access rights to the Accounting app can create exceptions. + To do so: + + #. After setting the :guilabel:`Lock Everything` date, reopen the :guilabel:`Lock Journal + Entries` window and remove the :guilabel:`Lock Everything` date. + #. In the :guilabel:`Exception` banner, choose if this exception should be set :guilabel:`for me` + (the current user) or :guilabel:`for everyone` and how long it should last. + #. A :guilabel:`Reason` for this exception can be added. + #. All of this information is logged in the chatter of the :doc:`company record + `. .. tip:: - During this process, it is good practice to set a :guilabel:`Journal Entries Lock Date` to the - last day (inclusive) of the preceding fiscal year by going to :menuselection:`Accounting --> - Accounting --> Lock Dates`. This way, the accountant can be confident that nobody changes the - transactions while auditing the books. Users from the *accountant* access group can still create - and modify entries. + To remove the :guilabel:`Lock Everything` date after it has been saved, configure the exception + to apply :guilabel:`for everyone` and set the duration to :guilabel:`forever`. + +.. _year-end/current-year-earnings: Current year's earnings ~~~~~~~~~~~~~~~~~~~~~~~ -Odoo uses a unique account type called **current year's earnings** to display the amount difference -between the **income** and **expenses** accounts. +Odoo uses a unique account type called **current year's earnings** to display the difference +between the **income** and **expense** accounts. .. note:: The chart of accounts can only contain one account of this type. By default, it is a 999999 account named :guilabel:`Undistributed Profits/Losses`. -To allocate the current year's earnings, create a miscellaneous entry to book them to any equity -account. Once done, confirm whether or not the current year's earnings in the **balance sheet** is -correctly reporting a balance of zero. If that is the case, set an :guilabel:`All Users Lock Date` -to the last day of the fiscal year by going to :menuselection:`Accounting --> Accounting --> Lock -Dates`. +To allocate the current year's earnings, create a new miscellaneous entry with a date set to the end +of the fiscal year to book them to any equity account. -.. tip:: - Install the :guilabel:`Irreversible Lock Date` (`account_lock`) module to make the :guilabel:`All - Users Lock Date` *irreversible* once set. +Then, verify whether the current year's earnings on the **balance sheet** correctly show a zero +balance. If so, a :guilabel:`Hard Lock date` can be set to the last day of the fiscal year in +:menuselection:`Accounting --> Accounting --> Lock Dates`. -.. note:: - A specific year-end closing entry is **optional** in order to close out the **profit and loss - statement**. The reports are created in real-time, meaning that the profit and loss statement - corresponds directly with the year-end date specified in Odoo. Therefore, any time the **income - statement** is generated, the beginning date corresponds with the beginning of the **fiscal - year** and all account balances should equal zero. +.. tip:: + The :guilabel:`Hard Lock date` field is irreversible and is intended to ensure data + inalterability required to comply with accounting regulations in certain countries. If such + compliance is not applicable, setting this field may not be necessary. However, if required, the + date should only be set once it is confirmed to be correct, as it **cannot be changed or + overridden**, regardless of access rights. diff --git a/content/applications/finance/accounting/taxes.rst b/content/applications/finance/accounting/taxes.rst index b154d85154..94b2fb70a3 100644 --- a/content/applications/finance/accounting/taxes.rst +++ b/content/applications/finance/accounting/taxes.rst @@ -15,14 +15,14 @@ Default taxes **Default taxes** define which taxes are automatically selected when creating a new product. They are also used to prefill the :guilabel:`Taxes` field when adding a new line on an invoice in -:ref:`Accounting Firms ` mode. +:ref:`Accounting Firms ` mode. .. image:: taxes/default-configuration.png :alt: Odoo fills out the Tax field automatically according to the Default Taxes -To change your **default taxes**, go to :menuselection:`Accounting --> Configuration --> Settings ---> Taxes --> Default Taxes`, select the appropriate taxes for your default sales tax and purchase -tax, and click on :guilabel:`Save`. +To change your **default taxes**, go to :menuselection:`Accounting --> Configuration --> Settings`, +scroll down to the :guilabel:`Taxes` section, select the appropriate default sales and purchase +taxes in the :guilabel:`Default Taxes` field, and click on :guilabel:`Save`. .. image:: taxes/default-taxes.png :alt: Define which taxes to use by default on Odoo @@ -34,8 +34,8 @@ tax, and click on :guilabel:`Save`. .. _taxes/list_activation: -Activate sales taxes from the list view -======================================= +Activate taxes from the list view +================================= As part of your :ref:`fiscal localization package `, most of your country's sales taxes are already preconfigured on your database. However, only a few taxes are @@ -173,6 +173,46 @@ Tax scope The :guilabel:`Tax Scope` restricts the use of taxes to a type of product, either **goods** or **services**. +.. _taxes/tax-mapping: + +Tax mapping +----------- + +Taxes can be combined with :doc:`fiscal positions ` to map taxes to each +other so that the correct tax is applied based on the customer's or vendor's location and business +type. + +When configuring a tax, leave the :guilabel:`Fiscal Position` field blank to apply the tax across +all fiscal positions or select specific fiscal positions where this tax should be used. If one or +multiple fiscal positions are selected, use the :guilabel:`Replaces` field to select all of the +taxes that this tax should replace for the selected fiscal position(s). + +To replace one tax with multiple other taxes, configure each of the replacement taxes to replace the +default product tax. + +.. example:: + As a sales tax, the :guilabel:`0% Exports` tax applies to quotations, sales orders, and invoices + that use the :guilabel:`Foreign Trade` fiscal position. On those records, any time that the + :guilabel:`15%` tax would be used, the :guilabel:`0% Exports` tax is used instead. + +.. note:: + Since the first fiscal position in the sequence is considered the company's default, the taxes + set on products are expected to be used with that fiscal position, so the :guilabel:`Replaces` + field is not displayed on it. + + .. image:: taxes/tax-mapping-example.png + :alt: The **0% Exports** tax record + +.. tip:: + To more easily view which taxes are replaced, use the :icon:`oi-settings-adjust` + :guilabel:`adjust settings` in the taxes list view and display the :guilabel:`Replaces` field. + + .. image:: taxes/tax-mapping-list.png + :alt: The **Replaces** field shown in the list view + +.. note:: + Tax mapping only works with :ref:`taxes/active` taxes. + .. _taxes/definition-tab: Definition tab diff --git a/content/applications/finance/accounting/taxes/B2B_B2C.rst b/content/applications/finance/accounting/taxes/B2B_B2C.rst index 1dfd015484..000e41a691 100644 --- a/content/applications/finance/accounting/taxes/B2B_B2C.rst +++ b/content/applications/finance/accounting/taxes/B2B_B2C.rst @@ -2,59 +2,51 @@ B2B (tax excluded) and B2C (tax included) pricing ================================================= -When working with consumers, prices are usually expressed with taxes -included in the price (e.g., in most eCommerce). But, when you work in a -B2B environment, companies usually negotiate prices with taxes excluded. - -Odoo manages both use cases easily, as long as you register your prices -on the product with taxes excluded or included, but not both together. -If you manage all your prices with tax included (or excluded) only, you -can still easily do sales order with a price having taxes excluded (or -included): that's easy. - -This documentation is only for the specific use case where you need to -have two references for the price (tax included or excluded), for the -same product. The reason of the complexity is that there is not a -symmetrical relationship with prices included and prices excluded, as -shown in this use case, in belgium with a tax of 21%: +When working with consumers, prices are usually expressed with taxes included in the price (e.g., in +most eCommerce). But, when you work in a B2B environment, companies usually negotiate prices with +taxes excluded. + +Odoo manages both use cases easily, as long as you register your prices on the product with taxes +excluded or included, but not both together. If you manage all your prices with tax included (or +excluded) only, you can still easily do sales order with a price having taxes excluded (or included) +: that's easy. + +This documentation is only for the specific use case where you need to have two references for the +price (tax included or excluded), for the same product. The reason of the complexity is that there +is not a symmetrical relationship with prices included and prices excluded, as shown in this use +case, in Belgium with a tax of 21%: - Your eCommerce has a product at **10€ (taxes included)** - This would do **8.26€ (taxes excluded)** and a **tax of 1.74€** -But for the same use case, if you register the price without taxes on -the product form (8.26€), you get a price with tax included at 9.99€, -because: +But for the same use case, if you register the price without taxes on the product form (8.26€), you +get a price with tax included at 9.99€, because: - **8.26€ \* 1.21 = 9.99€** -So, depending on how you register your prices on the product form, you -will have different results for the price including taxes and the price -excluding taxes: +So, depending on how you register your prices on the product form, you will have different results +for the price including taxes and the price excluding taxes: - Taxes Excluded: **8.26€ & 10.00€** - Taxes Included: **8.26€ & 9.99€** .. note:: - If you buy 100 pieces at 10€ taxes included, it gets even more - tricky. You will get: **1000€ (taxes included) = 826.45€ (price) + - 173.55€ (taxes)** Which is very different from a price per piece at - 8.26€ tax excluded. + If you buy 100 pieces at 10€ taxes included, it gets even more tricky. You will get: **1000€ + (taxes included) = 826.45€ (price) + 173.55€ (taxes)** Which is very different from a price per + piece at 8.26€ tax excluded. -This documentation explains how to handle the very specific use case -where you need to handle the two prices (tax excluded and included) on -the product form within the same company. +This documentation explains how to handle the very specific use case where you need to handle the +two prices (tax excluded and included) on the product form within the same company. .. note:: - In terms of finance, you have no more revenues selling your - product at 10€ instead of 9.99€ (for a 21% tax), because your revenue - will be exactly the same at 9.99€, only the tax is 0.01€ higher. So, if - you run an eCommerce in Belgium, make your customer a favor and set your - price at 9.99€ instead of 10€. Please note that this does not apply to - 20€ or 30€, or other tax rates, or a quantity >1. You will also make you - a favor since you can manage everything tax excluded, which is less - error prone and easier for your salespeople. + In terms of finance, you have no more revenues selling your product at 10€ instead of 9.99€ (for a + 21% tax), because your revenue will be exactly the same at 9.99€, only the tax is 0.01€ higher. + So, if you run an eCommerce in Belgium, make your customer a favor and set your price at 9.99€ + instead of 10€. Please note that this does not apply to 20€ or 30€, or other tax rates, or a + quantity >1. You will also make you a favor since you can manage everything tax excluded, which is + less error prone and easier for your salespeople. Configuration ============= @@ -62,36 +54,30 @@ Configuration Introduction ------------ -The best way to avoid this complexity is to choose only one way of -managing your prices and stick to it: price without taxes or price with -taxes included. Define which one is the default stored on the product -form (on the default tax related to the product), and let Odoo compute -the other one automatically, based on the pricelist and fiscal position. -Negotiate your contracts with customers accordingly. This perfectly -works out-of-the-box and you have no specific configuration to do. +The best way to avoid this complexity is to choose only one way of managing your prices and stick to +it: price without taxes or price with taxes included. Define which one is the default stored on the +product form (on the default tax related to the product), and let Odoo compute the other one +automatically, based on the pricelist and fiscal position. Negotiate your contracts with customers +accordingly. This perfectly works out-of-the-box and you have no specific configuration to do. -If you can not do that and if you really negotiate some prices with tax -excluded and, for other customers, others prices with tax included, you -must: +If you can not do that and if you really negotiate some prices with tax excluded and, for other +customers, others prices with tax included, you must: -#. always store the default price **tax excluded** on the product form, and - apply a tax (price excluded on the product form) +#. always store the default price **tax excluded** on the product form, and apply a tax (price + excluded on the product form) -#. create a pricelist with prices in **tax included**, for specific - customers +#. create a pricelist with prices in **tax included**, for specific customers -#. create a fiscal position that switches the tax excluded to a tax - included +#. create a fiscal position that switches the tax excluded to a tax included -#. assign both the pricelist and the fiscal position to customers who - want to benefit to this pricelist and fiscal position +#. assign both the pricelist and the fiscal position to customers who want to benefit to this + pricelist and fiscal position For the purpose of this documentation, we will use the above use case: - your product default sale price is 8.26€ tax excluded -- but we want to sell it at 10€, tax included, in our shops or - eCommerce website +- but we want to sell it at 10€, tax included, in our shops or eCommerce website .. _b2b_b2c/ecommerce: @@ -112,27 +98,23 @@ If you have both B2B and B2C prices on a single website, please follow these ins Setting your products --------------------- -Your company must be configured with tax excluded by default. This is -usually the default configuration, but you can check your **Default Sale -Tax** from the menu :menuselection:`Configuration --> Settings` -of the Accounting application. +Your company must be configured with tax excluded by default. This is usually the default +configuration, but you can check your **Default Sale Tax** from the menu +:menuselection:`Configuration --> Settings` of the Accounting application. .. image:: B2B_B2C/price_B2C_B2B01.png :align: center -Once done, you can create a **B2C** pricelist. You can activate the -pricelist feature per customer from the menu: -:menuselection:`Configuration --> Settings` of the Sale application. -Choose the option **different prices per customer segment**. +Once done, you can create a **B2C** pricelist. You can activate the pricelist feature per customer +from the menu: :menuselection:`Configuration --> Settings` of the Sale application. Choose the +option **different prices per customer segment**. -Once done, create a B2C pricelist from the menu -:menuselection:`Configuration --> Pricelists`. -It's also good to rename the default pricelist into B2B to avoid confusion. +Once done, create a B2C pricelist from the menu :menuselection:`Configuration --> Pricelists`. It's +also good to rename the default pricelist into B2B to avoid confusion. -Then, create a product at 8.26€, with a tax of 21% (defined as tax not -included in price) and set a price on this product for B2C customers at -10€, from the :menuselection:`Sales --> Products` -menu of the Sales application: +Then, create a product at 8.26€, with a tax of 21% (defined as tax not included in price) and set a +price on this product for B2C customers at 10€, from the :menuselection:`Sales --> Products` menu of +the Sales application: .. image:: B2B_B2C/price_B2C_B2B02.png :align: center @@ -140,10 +122,9 @@ menu of the Sales application: Setting the B2C fiscal position ------------------------------- -From the accounting application, create a B2C fiscal position from this -menu: :menuselection:`Configuration --> Fiscal Positions`. -This fiscal position should map the VAT 21% (tax excluded of price) -with a VAT 21% (tax included in price) +From the accounting application, create a B2C fiscal position from this menu: +:menuselection:`Configuration --> Fiscal Positions`. This fiscal position should map the VAT 21% +(tax excluded of price) with a VAT 21% (tax included in price) .. image:: B2B_B2C/price_B2C_B2B03.png :align: center @@ -151,17 +132,15 @@ with a VAT 21% (tax included in price) Test by creating a quotation ============================ -Create a quotation from the Sale application, using the -:menuselection:`Sales --> Quotations` menu. You should have the -following result: 8.26€ + 1.73€ = 9.99€. +Create a quotation from the Sale application, using the :menuselection:`Sales --> Quotations` menu. +You should have the following result: 8.26€ + 1.73€ = 9.99€. .. image:: B2B_B2C/price_B2C_B2B04.png :align: center -Then, create a quotation but **change the pricelist to B2C and the -fiscal position to B2C** on the quotation, before adding your product. -You should have the expected result, which is a total price of 10€ for -the customer: 8.26€ + 1.74€ = 10.00€. +Then, create a quotation but **change the pricelist to B2C and the fiscal position to B2C** on the +quotation, before adding your product. You should have the expected result, which is a total price +of 10€ for the customer: 8.26€ + 1.74€ = 10.00€. .. image:: B2B_B2C/price_B2C_B2B05.png :align: center @@ -171,15 +150,13 @@ This is the expected behavior for a customer of your shop. Avoid changing every sale order =============================== -If you negotiate a contract with a customer, whether you negotiate tax -included or tax excluded, you can set the pricelist and the fiscal -position on the customer form so that it will be applied automatically -at every sale of this customer. +If you negotiate a contract with a customer, whether you negotiate tax included or tax excluded, you +can set the pricelist and the fiscal position on the customer form so that it will be applied +automatically at every sale of this customer. -The pricelist is in the **Sales & Purchases** tab of the customer form, -and the fiscal position is in the accounting tab. +The pricelist is in the **Sales & Purchases** tab of the customer form, and the fiscal position is +in the accounting tab. -Note that this is error prone: if you set a fiscal position with tax -included in prices but use a pricelist that is not included, you might -have wrong prices calculated for you. That's why we usually recommend -companies to only work with one price reference. +Note that this is error prone: if you set a fiscal position with tax included in prices but use a +pricelist that is not included, you might have wrong prices calculated for you. That's why we +usually recommend companies to only work with one price reference. diff --git a/content/applications/finance/accounting/taxes/avatax.rst b/content/applications/finance/accounting/taxes/avatax.rst index f5bbb75799..cf278430d2 100644 --- a/content/applications/finance/accounting/taxes/avatax.rst +++ b/content/applications/finance/accounting/taxes/avatax.rst @@ -13,7 +13,7 @@ transactions. *AvaTax* is only available for integration with databases/companies that have locations in the United States, Canada, and Brazil. This means the fiscal position/country of a database can only be set to the United States, Canada, or Brazil. For more information, reference this - documentation: :ref:`avatax/fiscal_country`. + documentation: :ref:`accounting/avatax/fiscal_country`. *AvaTax* accounts for location-based tax rates for each state, county, and city. It improves remittance accuracy by paying close attention to laws, rules, jurisdiction boundaries, and special @@ -42,7 +42,8 @@ connect with Avalara to purchase a license: `Avalara: Let's Talk .. tip:: Upon account setup, take note of the *AvaTax* :guilabel:`Account ID`. This will be needed in the - :ref:`Odoo setup `. In Odoo, this number is the :guilabel:`API ID`. + :ref:`Odoo setup `. In Odoo, this number is the :guilabel:`API + ID`. Then, `create a basic company profile `_. @@ -65,7 +66,7 @@ Follow the Avalara documentation for creating a basic company profile: #. `Add a marketplace to the company profile `_. -.. _avatax/create_avalara_credentials: +.. _accounting/avatax/create_avalara_credentials: Connect to AvaTax ----------------- @@ -102,6 +103,8 @@ If this is an additional license key, ensure the previous connection can be brok Copy this key to a safe place. It is strongly encouraged to back up the license key for future reference. This key **cannot** be retrieved after leaving this screen. +.. _accounting/avatax/odoo-configuration: + Odoo configuration ================== @@ -111,7 +114,7 @@ are made accurately. Verify that the Odoo database contains necessary data. The country initially set up in the database determines the fiscal position, and aids *AvaTax* in calculating accurate tax rates. -.. _avatax/fiscal_country: +.. _accounting/avatax/fiscal_country: Fiscal country -------------- @@ -210,7 +213,7 @@ and :guilabel:`Amazon/Avatax Bridge`, respectively. - :doc:`../../fiscal_localizations/brazil` - :doc:`../../fiscal_localizations/united_states` -.. _avatax/credentials: +.. _accounting/avatax/credentials: Odoo AvaTax settings -------------------- @@ -228,6 +231,8 @@ Odoo database. :align: center :alt: Configure AvaTax settings +.. _accounting/avatax/prerequisites: + Prerequisites ~~~~~~~~~~~~~ @@ -253,7 +258,7 @@ Key` field. :guilabel:`Account ID` is listed first. To access the :guilabel:`License Key` see this documentation: - :ref:`avatax/create_avalara_credentials`. + :ref:`accounting/avatax/create_avalara_credentials`. For the :guilabel:`Company Code` field, enter the Avalara company code for the company being configured. Avalara interprets this as `DEFAULT`, if it is not set. The :guilabel:`Company Code` can @@ -332,7 +337,7 @@ Sync parameters Upon finishing the configuration and settings of the *AvaTax* section, click the :guilabel:`Sync Parameters` button. This action synchronizes the exemption codes from *AvaTax*. -.. _avatax/fiscal_positions: +.. _accounting/avatax/fiscal_positions: Fiscal position --------------- diff --git a/content/applications/finance/accounting/taxes/avatax/avatax_use.rst b/content/applications/finance/accounting/taxes/avatax/avatax_use.rst index 0812283859..fda71047fb 100644 --- a/content/applications/finance/accounting/taxes/avatax/avatax_use.rst +++ b/content/applications/finance/accounting/taxes/avatax/avatax_use.rst @@ -6,6 +6,8 @@ AvaTax is a tax calculation software that can be integrated with Odoo in the Uni Canada. Once the :doc:`integration setup <../avatax>` is complete, the calculated tax is simple and automatic. +.. _accounting/avatax/tax-calculation: + Tax calculation =============== diff --git a/content/applications/finance/accounting/taxes/fiscal_positions.rst b/content/applications/finance/accounting/taxes/fiscal_positions.rst index cd3556c786..3646c3143b 100644 --- a/content/applications/finance/accounting/taxes/fiscal_positions.rst +++ b/content/applications/finance/accounting/taxes/fiscal_positions.rst @@ -3,11 +3,11 @@ Fiscal positions (tax and account mapping) ========================================== Default taxes and accounts are set on products and customers to create new transactions on the fly. -However, depending on the customers' and providers' localization and business type, using different +However, depending on the customers' and vendors' location and business type, using different taxes and accounts for a transaction might be necessary. -**Fiscal positions** allow the creation of rules to adapt the taxes and accounts used for a -transaction automatically. +**Fiscal positions** allow the creation of rules to adapt the taxes and the income and expense +accounts used for a transaction automatically. They can be applied :ref:`automatically `, :ref:`manually `, or :ref:`assigned to a partner `. @@ -16,38 +16,39 @@ They can be applied :ref:`automatically `, :ref:`man Several default fiscal positions are available as part of your :ref:`fiscal localization package `. +.. _fiscal_positions/configuration: + Configuration ============= - .. _fiscal_positions/mapping: +To edit or create a fiscal position, go to :menuselection:`Accounting --> Configuration --> Fiscal +Positions`, and open the record to modify or click :guilabel:`New`. -Tax and account mapping ------------------------ +.. tip:: + If any notes are legally required when using this fiscal position, add them in the + :guilabel:`Legal Notes...` field below the :ref:`tax mapping ` + section to display them on quotations, sales orders, invoices, and bills. -To edit or create a fiscal position, go to :menuselection:`Accounting --> Configuration --> Fiscal -Positions`, and open the entry to modify or click on :guilabel:`New`. +.. _fiscal_positions/tax-mapping: -The mapping of taxes and accounts is based on the default taxes and accounts defined in the -product form. +Tax mapping +----------- -- To map to another tax or account, fill out the right column (:guilabel:`Tax to Apply`/ - :guilabel:`Account to Use Instead`). +Fiscal positions are required to map taxes. :ref:`Tax mapping ` is configured on +taxes themselves. -.. image:: fiscal_positions/fiscal-positions-tax-mapping.png - :align: center - :alt: Example of a fiscal position's tax mapping +.. _fiscal_positions/account-mapping: -.. image:: fiscal_positions/fiscal-positions-account-mapping.png - :align: center - :alt: Example of a fiscal position's account mapping +Account mapping +--------------- -- To remove a tax, leave the field :guilabel:`Tax to Apply` empty. -- To replace a tax with several other taxes, add multiple lines using the same :guilabel:`Tax on - Product`. +Account mapping is based on the income and expense accounts defined on the product or product +category. To map to another account, select the account to be replaced in the left column +(:guilabel:`Account on Product`) and select the account to use instead in the right column +(:guilabel:`Account to Use Instead`). -.. note:: - The mapping only works with *active* taxes. Therefore, make sure they are active by going to - :menuselection:`Accounting --> Configuration --> Taxes`. +.. image:: fiscal_positions/fiscal-positions-account-mapping.png + :alt: Example of a fiscal position's account mapping Application =========== @@ -68,7 +69,6 @@ From there, several conditions can be activated: selected country or country group. .. image:: fiscal_positions/fiscal-positions-automatic.png - :align: center :alt: Example of a fiscal position automatic application settings .. note:: @@ -91,12 +91,11 @@ From there, several conditions can be activated: Manual application ------------------ -To manually select a fiscal position, open a sales order, invoice, or bill, go to the -:guilabel:`Other Info` tab and select the desired :guilabel:`Fiscal Position` before adding product -lines. +To manually select a fiscal position, open a sales order, purchase order, invoice, or bill, go to +the :guilabel:`Other Info` tab and select the desired :guilabel:`Fiscal Position` before adding +product lines. .. image:: fiscal_positions/fiscal-positions-manual.png - :align: center :alt: Selection of a fiscal position on a sales order, invoice, or bill .. _fiscal_positions/partner: @@ -109,9 +108,12 @@ To define which fiscal position must be used by default for a specific partner, :guilabel:`Sales & Purchase` tab, and select the :guilabel:`Fiscal Position`. .. image:: fiscal_positions/fiscal-positions-customer.png - :align: center :alt: Selection of a fiscal position on a customer +.. tip:: + To view all partners at once instead of only customers, remove the :guilabel:`Customer Invoices` + filter or use the **Contacts** application. + .. seealso:: * :doc:`../taxes` diff --git a/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-tax-mapping.png b/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-tax-mapping.png deleted file mode 100644 index ace6efff75..0000000000 Binary files a/content/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-tax-mapping.png and /dev/null differ diff --git a/content/applications/finance/accounting/taxes/tax-mapping-example.png b/content/applications/finance/accounting/taxes/tax-mapping-example.png new file mode 100644 index 0000000000..1b95f868e0 Binary files /dev/null and b/content/applications/finance/accounting/taxes/tax-mapping-example.png differ diff --git a/content/applications/finance/accounting/taxes/tax-mapping-list.png b/content/applications/finance/accounting/taxes/tax-mapping-list.png new file mode 100644 index 0000000000..145c22a0bb Binary files /dev/null and b/content/applications/finance/accounting/taxes/tax-mapping-list.png differ diff --git a/content/applications/finance/accounting/vendor_bills.rst b/content/applications/finance/accounting/vendor_bills.rst index 7108165982..12c6379b1a 100644 --- a/content/applications/finance/accounting/vendor_bills.rst +++ b/content/applications/finance/accounting/vendor_bills.rst @@ -4,29 +4,68 @@ Vendor bills ============ -In Odoo, we can register vendor bills **manually** or **automatically**, while the -**Aged Payable report** provides an overview of all outstanding bills to help us pay the correct -amounts on time. +Vendor bills can be registered either **manually** or **automatically** in Odoo. The +:ref:`Aged Payable report ` provides an overview of all +outstanding bills to help ensure timely payment of the correct amounts. .. seealso:: - - Tutorial `Registering a vendor bill `_ + - Tutorial `Registering a vendor bill `_ - :doc:`/applications/inventory_and_mrp/purchase/manage_deals/manage` + - :doc:`../accounting/customer_invoices/credit_notes` + +.. _accounting/vendor_bills/creation: Bill creation ============= +.. _accounting/vendor_bills/creation-manual: + Manually -------- -Create a vendor bill manually by going to :menuselection:`Accounting --> Vendors --> Bills` and -clicking :guilabel:`Create`. +To create a vendor bill manually, go to :menuselection:`Accounting --> Vendors --> Bills` and +click :guilabel:`New`. + +.. tip:: + Alternatively, it is possible to create a vendor bill from the Accounting dashboard: + + - either click :guilabel:`New` on the :guilabel:`Purchases` journal; + - or click the :icon:`fa-ellipsis-v` :guilabel:`(vertical ellipsis)` icon of the + :guilabel:`Purchases` journal, then :guilabel:`Bill` under the :guilabel:`New` section. + +.. _accounting/vendor_bills/automatic: Automatically ------------- -Vendor bills can be automatically created by **sending an email** to an :ref:`email alias -` associated with the purchase journal, or by **uploading a PDF** -in :menuselection:`Accounting --> Vendors --> Bills` and then clicking :guilabel:`Upload`. +Vendor bills can be automatically created by sending an email to an :ref:`email alias +` associated with the purchase journal, or by +:ref:`uploading a PDF `. + +.. note:: + - Once the bill is uploaded, the PDF document appears on the right side of the screen, making it + easy to fill in the bill information. + - Bills can be :doc:`digitized ` for automatic + completion and :ref:`matched with purchase orders + ` to replace OCR-detected data with the + existing purchase order's details. + - Services such as digitizing scanned or PDF vendor bills in Odoo require :doc:`In-App + Purchase (IAP) ` credits. + +To automatically post bills from selected vendors, go to :menuselection:`Accounting --> Vendors --> +Vendors` and select the relevant vendor. In the :guilabel:`Accounting` tab, under the +:guilabel:`General` section, update the :guilabel:`Auto-post bills` field with one of the following +options: + +- :guilabel:`Always` +- :guilabel:`Ask after 3 validations without edits` +- :guilabel:`Never` + +.. seealso:: + :ref:`Vendor bills matching with purchase orders + ` + +.. _accounting/vendor_bills/bill-completion: Bill completion =============== @@ -34,82 +73,91 @@ Bill completion Whether the bill is created manually or automatically, make sure the following fields are appropriately completed: -- :guilabel:`Vendor`: Odoo automatically fills some information based on the vendor's registered - information, previous purchase orders, or bills. -- :guilabel:`Bill Reference`: add the sales order reference provided by the vendor and is used to do - the :ref:`matching ` when you receive the products. -- :guilabel:`Auto-Complete`: select a past bill/purchase order to automatically complete the - document. The :guilabel:`Vendor` field should be completed prior to completing this field. -- :guilabel:`Bill Date`: is the issuance date of the document. -- :guilabel:`Accounting Date`: is the date on which the document is registered in your accounting. -- :guilabel:`Payment Reference`: when registering the payment, it is automatically indicated in the - :guilabel:`Memo` field. -- :guilabel:`Recipient Bank`: to indicate to which account number the payment has to be made. -- :guilabel:`Due Date` or :guilabel:`Terms` to pay the bill. -- :guilabel:`Journal`: select in which journal the bill should be recorded and the :doc:`Currency +- :guilabel:`Vendor`: Odoo automatically fills in some information based on the information on the + vendor's contact record as well as previous purchase orders and bills. +- :guilabel:`Bill Reference`: Add the sales order reference provided by the vendor. This field is + used to :ref:`match ` the products when they are received. +- :guilabel:`Auto-Complete`: Select a past bill/purchase order to complete the document + automatically. The :guilabel:`Vendor` field should be completed before completing this field. +- :guilabel:`Bill Date`: Select the document's issuance date. +- :guilabel:`Accounting Date`: Update the document's accounting registration date if needed. +- :guilabel:`Payment Reference`: The :guilabel:`Memo` field automatically includes the payment + reference once the payment is registered. +- :guilabel:`Recipient Bank`: Indicates the account number to which the payment will be made. This + field is required when paying via batch payment files (such as :ref:`NACHA + ` and :doc:`SEPA `). +- :guilabel:`Due Date` or :guilabel:`Payment Terms` must be specified for the bill payment. +- :guilabel:`Journal`: Select which journal should record the bill and in which :doc:`currency `. -.. image:: vendor_bills/bill-completion.png - :alt: filling the vendor bill +In the :guilabel:`Invoice Lines` tab: + +- To access the product catalog, click :doc:`Catalog + `. +- Select the products and quantities, then click :guilabel:`Back to Bill` to return to the vendor + bill; the selected catalog items will appear in the vendor bill lines. +- Update the :guilabel:`Quantity`, :guilabel:`Price`, and :doc:`Taxes ` fields if needed. + +.. tip:: + If the bill line does not correspond to an existing product in the database, click :guilabel:`Add + a line` and enter a description for the bill line without linking it to a product. .. note:: - - Bills can be :doc:`digitized ` for - automatic completion by clicking :guilabel:`Send for Digitization`. - - If you upload the bill, the PDF document is displayed on the right of the screen, allowing you - to easily fill in the bill information. + Multiple bills for the same purchase order may be issued if the vendor is on back-order and sends + invoices as products are shipped or if the vendor sends partial bills or requests a deposit. In + this case, multiple bills may have the same :guilabel:`Bill Reference`. + +.. _accounting/vendor_bills/bill-confirmation: Bill confirmation ================= -Click :guilabel:`Confirm` when the document is completed. The status of your document changes to -:guilabel:`Posted` and a journal entry is generated based on the configuration on the invoice. +Click :guilabel:`Confirm` when the document is completed. The status changes to :guilabel:`Posted`, +and a journal entry is generated based on the vendor bill information. On confirmation, Odoo assigns +each vendor bill a unique number from a defined :doc:`sequence `. .. note:: - Once confirmed, it is no longer possible to update it. Click :guilabel:`Reset to draft` if + Once confirmed, a vendor bill can no longer be updated. Click :guilabel:`Reset to draft` if changes are required. -Bill Payment -============ +.. _accounting/vendor_bills/bill-payment: -Upon payment of the vendor bill, click on :guilabel:`Register Payment` to open a new payment window. +Payment and reconciliation +========================== -Select the :guilabel:`Journal`, the :guilabel:`Payment Method`, the :guilabel:`Amount` you wish to -pay (full or partial payment), and the :guilabel:`Currency`. In the case of a partial payment (when -the :guilabel:`Amount` paid is less than the total remaining amount on the vendor bill), the -:guilabel:`Payment Difference` field displays the outstanding balance. -You have two options: +To register a payment, click on :guilabel:`Pay`. In the :guilabel:`Pay` window, select the +:guilabel:`Journal`, the :guilabel:`Payment Method`, the :guilabel:`Amount`, and the +:guilabel:`Currency`. -- :guilabel:`Keep open`: to keep the bill open and mark it with a :guilabel:`Partial` banner; -- :guilabel:`Mark as fully paid`: In this case, select an account in the - :guilabel:`Post Difference In` field and change the :guilabel:`Label` if needed. A journal entry - will be created to balance the account receivable with the selected account. +When the :guilabel:`Amount` paid is less than the total remaining amount on the vendor bill, the +payment is :ref:`partial `, and the :guilabel:`Payment +Difference` field displays the outstanding balance. -.. image:: vendor_bills/partial-payment.png - :alt: register a partial payment - -The :guilabel:`Memo` field is filled automatically if the :guilabel:`Payment Reference` has been -set correctly in the vendor bill. If the field is empty, select the vendor invoice number as a +The :guilabel:`Memo` field is filled automatically if the :guilabel:`Payment Reference` has been set +correctly on the vendor bill. If the field is empty, select the vendor invoice number as a reference. -Once confirmed, an :guilabel:`In Payment` banner appears on the bill until it is :doc:`reconciled -`. +Then click :guilabel:`Create payment`. An :guilabel:`In Payment`/:guilabel:`Partial` banner appears +on the bill until it is :doc:`reconciled ` and its status updates to +:guilabel:`Paid`. + +.. seealso:: + - :doc:`payments` + - :doc:`bank/reconciliation` + +.. _accounting/vendor_bills/age-payable-report: Aged payable report =================== -To get an overview of your open vendor bills and their related due dates, you can use the -**Aged Payable report**. Go to :menuselection:`Accounting --> Reporting --> Partner Reports: Aged -payable`. +For an overview of the open vendor bills and their due dates, go to :menuselection:`Accounting --> +Reporting --> Aged payable`. -Click on a vendor's name to open up the details of all outstanding bills, the amounts due, the due -dates, etc. +Click the :icon:`fa-caret-right` :guilabel:`(right arrow)` icon next to a vendor to view the details +of all their outstanding bills, including the due dates and amounts. .. Note:: - - By clicking the :guilabel:`Save` button, you can export the information available on the screen - as a PDF or XLSX file and save it in the folder of your choice. - - You might receive several bills for the same purchase order if your vendor is in back-order and - is sending you invoices as they ship the products, or if your vendor is sending you a partial - bill or asking for a deposit. + Click :guilabel:`PDF` or :guilabel:`XLSX` to generate a PDF or XLSX file, respectively. .. toctree:: :titlesonly: diff --git a/content/applications/finance/accounting/vendor_bills/assets.rst b/content/applications/finance/accounting/vendor_bills/assets.rst index 5b112978a7..0270ca7c2c 100644 --- a/content/applications/finance/accounting/vendor_bills/assets.rst +++ b/content/applications/finance/accounting/vendor_bills/assets.rst @@ -199,6 +199,8 @@ time of the sale and the amount it is sold for. To record the sale of an asset, you must first post the related Customer Invoice so you can link the sale of the asset with it. +.. _assets/asset-model: + Assets Models ============= diff --git a/content/applications/finance/accounting/vendor_bills/bill-completion.png b/content/applications/finance/accounting/vendor_bills/bill-completion.png deleted file mode 100644 index bebb9879cf..0000000000 Binary files a/content/applications/finance/accounting/vendor_bills/bill-completion.png and /dev/null differ diff --git a/content/applications/finance/accounting/vendor_bills/invoice_digitization.rst b/content/applications/finance/accounting/vendor_bills/invoice_digitization.rst index 6bd2706212..7c4f209487 100644 --- a/content/applications/finance/accounting/vendor_bills/invoice_digitization.rst +++ b/content/applications/finance/accounting/vendor_bills/invoice_digitization.rst @@ -1,101 +1,217 @@ -================================ -AI-powered document digitization -================================ +===================== +Document digitization +===================== -**Invoice digitization** is the process of converting paper documents into vendor bill and customer -invoice forms in your accounting. +Document digitization refers to the process of converting paper or digital documents into records +in a database. Using :abbr:`OCR (optical character recognition)` and artificial intelligence +technologies, Odoo reads the content and automatically creates and fills in the record's details. +This process is mainly used for vendor bills (or refunds). -Odoo uses :abbr:`OCR (optical character recognition)` and artificial intelligence technologies to -recognize the content of the documents. Vendor bill and customer invoice forms are automatically -created and populated based on the scanned invoices. +.. note:: + Although less common, this digitization process can also be applied to customer invoices and + credit notes. The :ref:`settings ` need to be + adjusted accordingly. .. seealso:: - `Test Odoo's invoice digitization `_ - `Odoo Tutorials: Vendor Bill Digitization `_ + - :doc:`/applications/essentials/in_app_purchase` + +.. _accounting/bill-digitization/configuration: Configuration ============= -In :menuselection:`Accounting --> Configuration --> Settings --> Digitization`, check the box -:guilabel:`Document Digitization` and choose whether :guilabel:`Vendor Bills` and -:guilabel:`Customer Invoices` (this includes customer credit notes) should be processed -automatically or on demand. +Go to :menuselection:`Accounting --> Configuration --> Settings` and navigate to the +:guilabel:`Digitization` section. Enable the :guilabel:`Document Digitization` option and choose +whether :guilabel:`Vendor Bills` should be processed automatically or on demand. -If you enable the :guilabel:`Single Invoice Line Per Tax` option, only one line is created per tax -in the new bill, regardless of the number of lines on the invoice. +.. note:: + If the :guilabel:`Single Invoice Line Per Tax` option is enabled, only one line is created per + tax in the new vendor bill, regardless of the number of lines on it. -Invoice upload -============== +.. _accounting/bill-digitization/vendor-bills-upload: -Upload invoices manually ------------------------- +Vendor bills upload +=================== -From the :guilabel:`Accounting Dashboard`, click on the :guilabel:`Upload` button of your vendor -bills journal. -Alternatively, go to :menuselection:`Accounting --> Customers --> Invoices` or -:menuselection:`Accounting --> Vendors --> Bills` and select :guilabel:`Upload`. +Vendor bills are :ref:`uploaded manually ` or sent to a +:ref:`designated email alias ` to be digitized. They can +also be :ref:`automatically posted ` for selected +vendors. -.. _invoice-digitization/email-alias: +.. note:: + Once the bill is uploaded, the document preview appears on the right side of the screen. + +.. seealso:: + :doc:`Vendor bills <../vendor_bills>` -Upload invoices using an email alias ------------------------------------- +.. _accounting/bill-digitization/manual-upload: -You can configure your connected scanner to send scanned documents to an email alias. Emails sent to -these aliases are converted into new draft customer invoices or vendor bills. +Manual upload +------------- -You can modify the email alias of a journal. To do so, go to the :guilabel:`Settings` app. Under -:guilabel:`General Settings: Discuss`, enable :guilabel:`Custom Email Servers`, add an -:guilabel:`Alias Domain`, and :guilabel:`Save`. +In the Accounting dashboard, drag and drop vendor bills into the desired purchase journal or click +:guilabel:`Upload` on the purchase journal. -The email alias is now available in the :guilabel:`Advanced Settings` tab of the journal. Emails -sent to this address will be converted automatically into new invoices or bills. +.. _accounting/bill-digitization/email-alias: + +Upload via email alias +---------------------- + +Vendor bills can be uploaded via an email alias associated with the relevant journal in two ways: + +- scanned from a connected scanner configured to send email to an email alias; +- sent directly to an email alias. + +Each PDF attached to the email is automatically converted into a new draft vendor bill. .. note:: - If you use the :doc:`Documents ` app, you can automatically - send your scanned invoices to the :guilabel:`Finance` workspace (e.g., - `inbox-financial@example.odoo.com`). + - Only PDF and XML formats are processed via an email alias associated with a journal. + - JPEG files must be processed via :ref:`email alias in the Documents app + `. -The default email aliases `vendor-bills@` and `customer-invoices@` followed by the -:guilabel:`Alias Domain` you set are automatically created for the :guilabel:`Vendor Bills` and -:guilabel:`Customer Invoices` journals, respectively. Emails sent to these addresses are converted -automatically into new invoices or bills. +To add an email alias to a journal, follow these steps: -To change a default email alias, go to -:menuselection:`Accounting --> Configuration --> Accounting: Journals`. Select the journal you want -to edit, click on the :guilabel:`Advanced Settings` tab, and edit the `Email Alias`. +#. Make sure an :doc:`alias domain <../../../websites/website/configuration/domain_names>` has been + configured. +#. The default email alias `vendor-bills@` followed by the alias domain is automatically created + and available in the :guilabel:`Advanced Settings` tab of the :guilabel:`Vendor Bills` journal. +#. To change a default email alias, go to :menuselection:`Accounting --> Configuration --> + Journals`, select the corresponding journal, and edit the :guilabel:`Email Alias` in the + :guilabel:`Advanced Settings` tab. +#. Configure the connected scanner to send scanned documents to the email alias, if needed. -Invoice digitization -==================== +.. note:: + Alternatively, an :ref:`email alias in the Documents app ` can be used + to automatically send vendor bills to the :guilabel:`Finance` :ref:`folder + ` (e.g., `inbox-financial@example.odoo.com`). -According to your settings, the document is either processed automatically, or you need to click on -:guilabel:`Send for digitization` to do it manually. +.. _accounting/bill-digitization/auto-post-bills: -Once the data is extracted from the PDF, you can correct it if necessary by clicking on the -respective tags (available in :guilabel:`Edit` mode) and selecting the proper information instead. +Automatic vendor bill posting +----------------------------- -Data recognition with AI -======================== +.. note:: + To use the :guilabel:`Auto-post bills` option, the :guilabel:`Digitize automatically` setting in + the :ref:`Document Digitization ` section must be + enabled for vendor bills. -It is essential to review and correct (if needed) the information uploaded during digitization. -Then, you have to post the document by clicking on :guilabel:`Confirm`. In this manner, the AI -learns, and the system identifies the correct data for future digitizations. +To automatically post digitized vendor bills for specific vendors, go to :menuselection:`Accounting +--> Vendors --> Vendors` and click the desired vendor. In the :guilabel:`Accounting` tab of the +contact form, select an :guilabel:`Auto-post bills` option in the :guilabel:`Automation` section: + +- :guilabel:`Always` +- :guilabel:`Ask after 3 validations without edits`: When the third uploaded bill is confirmed + without any edits, an :guilabel:`Autopost Bills` window appears. The following options can be + chosen: :guilabel:`Activate auto-validation`, :guilabel:`Ask me later`, or :guilabel:`Never for + this vendor`. +- :guilabel:`Never` + +.. note:: + Since automation is triggered after three validated bills without edits, the contact name must + already exist in the database, and each uploaded vendor bill must include a bill date. + +.. _accounting/bill-digitization/digitization: + +Digitization and data recognition with AI +========================================= + +Depending on the :ref:`settings `, documents are either +automatically digitized or require manual processing if digitization is set to on-demand only. + +To manually digitize an :ref:`uploaded document +`, click :guilabel:`Digitize document`. + +Once the document has been digitized, a blue banner appears; click :icon:`oi-arrow-right` +:guilabel:`Refresh`. Review and correct any information uploaded during digitization: click on the +related field(s) to edit them, or click :guilabel:`Reload AI data` to refresh the data. + +Then, click :guilabel:`Confirm` to post the document. + +.. tip:: + Once a document has been digitized, the :guilabel:`Vendor` field remains empty if the vendor + doesn't exist in the database. To add it, click the :icon:`fa-caret-down` :guilabel:`(down arrow)` + in the :guilabel:`Vendor` field; the vendor name appears highlighted in the document preview on + the right. Click it to open a new vendor form with the name pre-filled. + +.. note:: + The following vendor bill fields are recognized by OCR: + + - :guilabel:`Vendor`, :guilabel:`Bill Reference`, :guilabel:`Bill Date`, :guilabel:`Payment + Reference` (only in the Belgian +++xxx/xxxx/xxxxx+++ format), :guilabel:`Recipient Bank`, + :guilabel:`Due Date`, and the currency (in a :doc:`multi-currency + <../get_started/multi_currency>` environment and if the currency is activated). + - From the :guilabel:`Invoices Lines` tab: :guilabel:`Product` description/label, + :guilabel:`Quantity`, unit :guilabel:`Price`, :guilabel:`Taxes` (if the :ref:`tax is activated + `; this field is not recognized by OCR for the :doc:`Indian + localization <../../fiscal_localizations/india>`), :guilabel:`Untaxed Amount`, and + :guilabel:`Total`. + +.. _accounting/bill-digitization/vendor-bills-matching-po: + +Purchase order matching +======================= + +When a digitized vendor bill is recognized by :abbr:`OCR (optical character recognition)`, Odoo +searches the database for a matching purchase order. If found, the vendor bill can be manually +matched with the existing open purchase order lines. + +Once a vendor bill has been :ref:`uploaded ` and +:ref:`digitized `, click the :guilabel:`Purchase +matching` smart button to access the :guilabel:`Purchase matching` list view, displaying all +purchase order lines linked to the vendor assigned to the vendor bill. Then, select the relevant +purchase order lines and the draft vendor bill (shown in grey), and click :guilabel:`Match`. + +.. tip:: + In the :guilabel:`Purchase Matching` list view, update the :guilabel:`Quantity` and + :guilabel:`Price` in the purchase order lines, if necessary. + +If there is no existing purchase order related to the vendor of the uploaded vendor bill, a new +purchase order can be directly created from the vendor bill lines. To do so, follow these steps: + +#. Once the vendor bill is uploaded, make sure the :guilabel:`Vendor` field is filled in with the + correct vendor. +#. Click the :guilabel:`Purchase matching` smart button, select the draft vendor bill in the list + (shown in grey), and click :guilabel:`Add to PO`. +#. In the :guilabel:`Add to Purchase Order` window, start typing in the :guilabel:`Purchase Order` + field and select :guilabel:`Create and edit`. +#. In the :guilabel:`Create Purchase Order` window, select the vendor assigned to the vendor bill, + then complete all :ref:`required fields ` and click + :guilabel:`Confirm`. +#. In the :guilabel:`Purchase Matching` list view, select the relevant purchase order lines and the + draft vendor bill (shown in grey), and click :guilabel:`Match`. + +.. Note:: + If any information required for the purchase order fields is missing, click :guilabel:`Save and + Close` in the :guilabel:`Create Purchase Order` window. Then, open the Purchase app to fill in + the fields and :ref:`confirm the purchase order `. + +.. tip:: + - Electronic vendor bills with embedded XML ensure more accurate and efficient processing. + - Alternatively, the :ref:`Auto-complete ` feature + can transfer information from the purchase order to the vendor bill, without requiring OCR. + +.. _accounting/bill-digitization/pricing: Pricing ======= -The **invoice digitization** is an In-App Purchase (IAP) service that requires prepaid credits to -work. Digitizing one document consumes one credit. +The document digitization feature is an In-App Purchase (IAP) service requiring prepaid credits. +Digitizing one document uses one credit. -To buy credits, go to :menuselection:`Accounting --> Configuration --> Settings --> Digitization` -and click on :guilabel:`Buy credits`, or go to :menuselection:`Settings --> Odoo IAP` and click on -:guilabel:`View My Services`. +To buy credits, :ref:`go to the Settings app ` or :menuselection:`Accounting --> +Configuration --> Settings`, navigate to the :guilabel:`Digitization` section, and click +:guilabel:`Buy credits`. .. note:: - Enterprise Odoo users with a valid subscription get free credits to test IAP features before - deciding to purchase more credits for the database. This includes demo/training databases, - educational databases, and one-app-free databases. + - Odoo Enterprise users with a valid subscription get free credits to test IAP features before + purchasing more credits for the database. This includes demo/training databases, educational + databases, and one-app-free databases. + - XML files don't require OCR credits because they contain structured data that can be processed + directly, without OCR. .. seealso:: - - `Our Privacy Policy `_ + - `Odoo In-App Purchase Privacy Policy `_ - :doc:`/applications/essentials/in_app_purchase` diff --git a/content/applications/finance/accounting/vendor_bills/sequence.rst b/content/applications/finance/accounting/vendor_bills/sequence.rst index 9f8503aef2..26043755a4 100644 --- a/content/applications/finance/accounting/vendor_bills/sequence.rst +++ b/content/applications/finance/accounting/vendor_bills/sequence.rst @@ -3,8 +3,8 @@ Vendor bill sequence ==================== When confirming a vendor bill, Odoo generates a unique vendor bill reference number. By default, it -uses the following sequence format `BILL/year/month/incrementing-number` (e.g., -`BILL/2025/01/00001`), which restarts from `00001` each year. +uses the sequence format `BILL/year/month/incrementing-number` (e.g., `BILL/2025/01/00001`), which +restarts from `00001` each year. However, it is possible to :ref:`change the sequence format ` and its periodicity, and to :ref:`mass-resequence vendor bills @@ -60,7 +60,26 @@ Follow these steps to resequence vendor bill numbers: #. Set the :guilabel:`First New Sequence`. #. :guilabel:`Preview Modifications` and click :guilabel:`Confirm`. -The first vendor bill using the new sequence appears in red in the :guilabel:`Bills` list view. - .. image:: sequence/sequence-bill-sequencing.png :alt: Resequence options window + +.. note:: + - To indicate where the sequence change began, the first vendor bill in the new sequence is + highlighted in red in the :guilabel:`Vendor Bills` list. This visual marker is permanent + and purely informational. + - If there are any irregularities in the new sequence, such as gaps, cancelled, or deleted + entries within the open period, a :guilabel:`Gaps in the sequence` message appears in the + :guilabel:`Vendor Bills` journal on the Accounting dashboard. To view more details about the + related vendor bill(s), click :guilabel:`Gaps in the sequence`. This visual marker is temporary + and will disappear once the entry's accounting date is on or after the lock date. + +.. tip:: + Resequencing is not possible: + + - When entries are before a lock date. + - When the sequence leads to a duplicate. + - When the range is invalid. For example, if the :guilabel:`Bill Date` doesn't align with the + date in the new sequence, such as using a 2024 sequence (BILL/2024/MM/XXXX) for an vendor bill + dated in 2025. + + In these cases, a :guilabel:`Validation Error` message appears. diff --git a/content/applications/finance/esg.rst b/content/applications/finance/esg.rst new file mode 100644 index 0000000000..a784d8100b --- /dev/null +++ b/content/applications/finance/esg.rst @@ -0,0 +1,329 @@ +=== +ESG +=== + +The ESG (Environment, Social, and Governance) app helps you automate ESG data collection by +integrating with apps like Accounting, Fleet, Payroll, and Employees. It pulls data from your +operations to build your ESG reports, based on legal and sustainability reporting requirements, +while giving you a real-time view of your emissions and other key ESG metrics. + +Carbon footprint +================ + +The carbon footprint tool automates emissions tracking by collecting data from accounting records +(purchases, expenses, etc.) and employee commuting activity, and supports manual inputs. Emissions +are updated in real time, allowing for continuous monitoring and reporting. You can: + +- Track your daily environmental impact. +- Evaluate the immediate effect of your reduction actions. +- Prioritize targeted changes. +- Continuously monitor and refine your sustainability strategy. + +.. admonition:: Emissions (kgCO₂e) formula + + `Activity data` × `Emission factor` + +Activity data sources +--------------------- + +The following data sources are used: + +- :ref:`Accounting ` +- :ref:`Fleet ` +- :ref:`Manual inputs ` + +.. _esg/accounting: + +Accounting +~~~~~~~~~~ + +Odoo collects activity data from journal entries posted to expense and asset accounts. These +include: + +- Fixed assets +- Expenses +- Other expenses +- Cost of revenue + +Only these account types are considered for carbon footprint calculations, in line with the *Bilan +Carbone* methodology. + +.. _esg/fleet: + +Fleet +~~~~~ + +Odoo calculates commuting emissions using data from the Fleet and Employees apps. + +.. admonition:: Employee commuting emissions formula + + `Days` × `Home-work distance` × `2` × (`Number of office days` / `7`) × `Vehicle model CO₂ + emissions` + +To ensure accurate calculations: + +- Define the average number of days per week the employees commute to the office by going to + :menuselection:`ESG --> Configuration --> Settings` and filling in the :guilabel:`Weekly Office + Attendance`. +- Set the emissions of each vehicle model by going to :menuselection:`Fleet --> Configuration --> + Models`, selecting a model, and entering its :guilabel:`CO₂ Emissions`. +- Set each employee's home-to-work distance by opening the :guilabel:`Employees` app, selecting an + employee, and filling in the employee's :guilabel:`Home-Work Distance`. + +.. note:: + The employee vehicle's :guilabel:`Start Date` and, if applicable, :guilabel:`End Date`, are used + to calculate the emissions. Ensure they are set by opening the :guilabel:`Employees` app, + selecting an employee, and clicking the :guilabel:`Cars` smart button. + +To access the employee commuting emissions pivot table, go to :menuselection:`ESG --> Collect --> +Employee Commuting`. + +.. image:: esg/employee-commuting-pivot.png + :alt: The employee commuting emissions pivot table + +.. _esg/manual: + +Manual input +~~~~~~~~~~~~ + +You can manually enter emissions for activities that not tracked automatically (e.g., employee +lunches, waste, etc.). To do so, go to :menuselection:`ESG --> Collect --> Emitted Emissions` and +click :guilabel:`New`, then: + +- Name the activity. +- Select a :guilabel:`Date`. +- Select an :guilabel:`Emission factor`. +- Enter a :guilabel:`Quantity`. + +Once saved, the entry appears under :menuselection:`ESG --> Collect --> Emitted Emissions` and is +included in the carbon footprint report. + +Emission factors +---------------- + +An emission factor is a coefficient that indicates the rate at which a specific activity emits +greenhouse gases into the atmosphere. + +Source database +~~~~~~~~~~~~~~~ + +Import the data from a certified emission factors database by going to :menuselection:`ESG --> +Configuration --> Source Databases`. Click :guilabel:`Download` on the `ADEME +`_ database to import its emission factors and sources. + +Main components of an emission factor +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Source +****** + +Each emission factor is assigned to a scope, following the GHG Protocol: + +- Scope 1 – Direct emissions (e.g., fuel burned on-site or in company vehicles) +- Scope 2 – Indirect emissions from purchased energy (e.g., electricity or heat) +- Scope 3 – All other indirect emissions across the value chain (e.g., purchased goods, travel, + waste) + +Scopes can be structured hierarchically (parent-child) for more detailed categorization, such as +"Scope 3: Others Indirect > Purchased Goods > Electronics". + +Uncertainty +*********** + +Uncertainty represents the potential margin of error in an emission factor. It reflects how precise +or reliable the factor is when estimating emissions for a given activity, based on the quality of +data, assumptions used, and calculation methodology. + +It helps you assess the confidence level of the emissions data used in the reporting. + +Compute method +************** + +The compute method determines whether emissions are calculated using physical quantities (e.g., kg, +liters, units) or monetary values (e.g., € spent). In physical mode, the system uses the quantity +from the transaction (e.g., 10 units × :abbr:`EF (emission factor)` per unit). In monetary mode, it +uses the transaction amount (e.g., €500 × :abbr:`EF (emission factor)` per €). + +Gas emissions lines +******************* + +Each emission factor can include multiple gas emission lines, representing the different greenhouse +gases involved in the activity. The ESG app includes the six main gases from the Kyoto Protocol — +CO₂, CH₄, N₂O, HFCs, PFCs, SF₆ — each with a predefined Global Warming Potential (GWP) used to +convert them into a common unit: CO₂-equivalent (kgCO₂e). + +.. tip:: + Add more specific gases by going to :menuselection:`ESG --> Configuration --> Gases`. + +Each gas line can be linked to an activity type such as production, transport, or use, allowing for +detailed breakdowns in your emissions reporting. + +The final emission factor value is the sum of all these gases’ emissions converted into +CO₂-equivalents. + +Assignation rules +~~~~~~~~~~~~~~~~~ + +Assignation rules allow emission factors to be automatically applied to relevant activity data based +on specific criteria: the product, partner, and/or account involved in the transaction. + +.. example:: + You have assigned an emission factor to the *Zenith Pro Computer* product and later receive a + vendor bill for 150 units; the system automatically applies the assigned emission factor, + multiplying the emission factor's emissions (kgCO₂e) by 150. + +To define assignation rules on emissions factors, go to :menuselection:`ESG --> Configuration --> +Emission Factors` and select an emission factor. Under the :guilabel:`Assignations` tab, click +:guilabel:`Add a line`, and select a record for one or more of the following attributes: +:guilabel:`Product`, :guilabel:`Partner`, and :guilabel:`Account`. + +All attributes have to match for the rule to be applied. + +.. important:: + Ensure the unit of measure set next to the product's :guilabel:`Cost` matches the emission + factor's :guilabel:`Unit of Measure`. + + .. image:: esg/product-unit-of-measure.png + :alt: A product's unit of measure + + If the field is not displayed, go to :menuselection:`Accounting --> Configuration --> Settings` + and enable the :guilabel:`Units of Measure & Packagings` option. + +.. tip:: + Accounting journal entries with a missing emission factor can be found by clicking + :guilabel:`Emissions to define` under the :guilabel:`Collect Emissions` card on the dashboard. + +Rules priority +************** + +When multiple assignation rules match, Odoo prioritizes the most specific rule based on the +following criteria: + +#. Attribute specificity: Odoo first evaluates rules by the most precise attribute, following this + priority hierarchy (from most to least specific): + + #. Product + #. Partner + #. Account + +#. Attribute count: if multiple rules share the same level of attribute specificity, Odoo then + considers the number of attributes in the rule. The rule with more attributes defined will take + priority. + +.. example:: + **Example 1** + + *Emission factor #1 assignation rule* + + .. list-table:: + :header-rows: 1 + + * - Account + - Partner + - Product + * - *Any Account* + - *Any Partner* + - **Zenith Pro Computer** + + *Emission factor #2 assignation rule* + + .. list-table:: + :header-rows: 1 + + * - Account + - Partner + - Product + * - *Any Account* + - **Digital Den** + - *Any Product* + + Given the assignation rules above, all products purchased from **Digital Den** will be assigned + emission factor **#2**, except the **Zenith Pro Computer** product, which will be assigned + emission factor **#1**. + + + **Example 2** + + *Emission factor #1 assignation rule* + + .. list-table:: + :header-rows: 1 + + * - Account + - Partner + - Product + * - *Any Account* + - *Any Partner* + - **Zenith Pro Computer** + + *Emission factor #2 assignation rule* + + .. list-table:: + :header-rows: 1 + + * - Account + - Partner + - Product + * - *Any Account* + - **Digital Den** + - **Zenith Pro Computer** + + Given the assignation rules above, any purchased **Zenith Pro Computer** will be assigned + emission factor **#1**, except if purchased from the **Digital Den**, which will be assigned + emission factor **#2**. + +Apply retroactively +******************* + +Once your emission factors are configured with assignation rules, you can also apply them +retroactively to past activity data. + +To do so, go to :menuselection:`ESG --> Configuration --> Emission Factors`, select an emission +factor, and click :guilabel:`Assign`. Select an :guilabel:`Application Period`, and, if desired, +enable the :guilabel:`Replace existing assignations` option. + +.. tip:: + Apply emission factors in bulk by selecting multiple emission factors in :icon:`oi-view-list` + list view and clicking :icon:`fa-cog` (:guilabel:`Actions`) :menuselection:`--> Assign Emission + Factors`. + +Gender parity and pay gap +========================= + +Gender parity tracks the distribution of genders across the workforce, such as comparing women and +men in technical vs. administrative roles, permanent vs. temporary contracts, different office +locations, or management vs. non-management positions. + +These insights, based on employee data, are essential for CSRD reporting under ESRS S1 and will also +support future VSME standards. + +To view a company's gender parity and pay gap measures, set the gender of each employee by +opening the :guilabel:`Employees` app and selecting an employee. Under the :guilabel:`Private +Information` tab, select the employee's :guilabel:`Gender`. + +The pay gap is calculated using the wages set on the employees' Payroll contracts for the same jobs. + +.. admonition:: Pay gap formula + + ((`Average male salary` – `Average female salary`) / `Average male salary`) × `100` + +Access the measures by clicking :menuselection:`ESG --> Measure --> Gender Parity / Pay Gap`. + +.. tip:: + Use the different :ref:`Group By ` options to break down the data by + :guilabel:`Leadership Level`, :guilabel:`Department`, :guilabel:`Job Position`, + :guilabel:`Contract Type`, or :guilabel:`Country`. + + .. image:: esg/gender-graph-group-by.png + :alt: The gender parity card on the ESG app dashboard + +Initiatives +=========== + +Go to :menuselection:`ESG --> Act --> Initiatives` to access all the :doc:`Project +<../services/project>` features, and start taking action on your impact. You can estimate CO₂ +savings for each task, track progress, and assign team members with deadlines. + +.. note:: + Estimated CO₂ reductions do not immediately lower your carbon footprint. The real impact shows + only when these reductions are reflected in your operations. diff --git a/content/applications/finance/esg/employee-commuting-pivot.png b/content/applications/finance/esg/employee-commuting-pivot.png new file mode 100644 index 0000000000..c5fb768a13 Binary files /dev/null and b/content/applications/finance/esg/employee-commuting-pivot.png differ diff --git a/content/applications/finance/esg/gender-graph-group-by.png b/content/applications/finance/esg/gender-graph-group-by.png new file mode 100644 index 0000000000..43eb79933b Binary files /dev/null and b/content/applications/finance/esg/gender-graph-group-by.png differ diff --git a/content/applications/finance/esg/product-unit-of-measure.png b/content/applications/finance/esg/product-unit-of-measure.png new file mode 100644 index 0000000000..c4415ad901 Binary files /dev/null and b/content/applications/finance/esg/product-unit-of-measure.png differ diff --git a/content/applications/finance/fiscal_localizations.rst b/content/applications/finance/fiscal_localizations.rst index 9cb9911c10..7013919e79 100644 --- a/content/applications/finance/fiscal_localizations.rst +++ b/content/applications/finance/fiscal_localizations.rst @@ -84,7 +84,7 @@ Fiscal localization modules are available for the countries listed below. - :doc:`Germany ` - Guinea - Greece -- Guatemala +- :doc:`Guatemala ` - Guinea-Bissau - Honduras - :doc:`Hong Kong ` @@ -164,6 +164,7 @@ Fiscal localization modules are available for the countries listed below. fiscal_localizations/egypt fiscal_localizations/france fiscal_localizations/germany + fiscal_localizations/guatemala fiscal_localizations/hong_kong fiscal_localizations/india fiscal_localizations/indonesia @@ -188,4 +189,3 @@ Fiscal localization modules are available for the countries listed below. fiscal_localizations/united_states fiscal_localizations/uruguay fiscal_localizations/vietnam - fiscal_localizations/employment_hero diff --git a/content/applications/finance/fiscal_localizations/argentina.rst b/content/applications/finance/fiscal_localizations/argentina.rst index 7315e6f888..7846701a43 100644 --- a/content/applications/finance/fiscal_localizations/argentina.rst +++ b/content/applications/finance/fiscal_localizations/argentina.rst @@ -696,9 +696,9 @@ Taxes` and removing the default :guilabel:`Sale or Purchase` filter. To verify t `: Journal entries are *not* created when payments are posted unless :ref:`outstanding accounts -` are set up. Thus, for this feature to work properly, it is -important to verify that *all* payment methods within the bank journals have an outstanding payment -and receipt account set. +` are set up. Thus, for this feature to work properly, it +is important to verify that *all* payment methods within the bank journals have an outstanding +payment and receipt account set. .. image:: argentina/l10n-ar-outstanding-payments.png :alt: An outstanding payment account must be set. diff --git a/content/applications/finance/fiscal_localizations/belgium.rst b/content/applications/finance/fiscal_localizations/belgium.rst index 33c07f9a79..c21d970b6f 100644 --- a/content/applications/finance/fiscal_localizations/belgium.rst +++ b/content/applications/finance/fiscal_localizations/belgium.rst @@ -224,7 +224,7 @@ your :guilabel:`Bank` journal on your dashboard. :alt: Import CODA files .. seealso:: - :ref:`Import bank files ` + :ref:`Import bank files ` .. _belgium/soda: @@ -474,38 +474,8 @@ This government-certified system entails the use of a :ref:`certified POS system Certified POS system -------------------- -The Odoo POS system is certified for the major versions of databases hosted on **Odoo Online**, -**Odoo.sh**, and **On-Premise**. Please refer to the following table to ensure that your POS system -is certified. - -.. list-table:: - :header-rows: 1 - :stub-columns: 1 - - * - - - Odoo Online - - Odoo.sh - - On-Premise - * - Odoo 18.0 - - Certified - - Certified - - Certified - * - Odoo 17.0 - - Certified - - Certified - - Certified - * - Odoo 16.0 - - Certified - - Certified - - Certified - * - Odoo 15.0 - - Certified - - Certified - - Certified - * - Odoo 14.0 - - Certified - - Certified - - Certified +The Odoo POS system is certified for databases hosted on **Odoo Online**, **Odoo.sh**, and +**On-Premise**. .. seealso:: :doc:`/administration/supported_versions` diff --git a/content/applications/finance/fiscal_localizations/brazil.rst b/content/applications/finance/fiscal_localizations/brazil.rst index af10601d3f..6dbc821bce 100644 --- a/content/applications/finance/fiscal_localizations/brazil.rst +++ b/content/applications/finance/fiscal_localizations/brazil.rst @@ -6,27 +6,8 @@ Brazil .. |API| replace:: :abbr:`API (Application programming interface)` .. |SO| replace:: :abbr:`SO (Sales order)` -Introduction -============ - -With the Brazilian localization, sales taxes can be automatically computed and electronic invoices -for goods (NF-e) and services (NFS-e) can be sent using AvaTax (Avalara) through |API| calls. -Moreover, taxes for services can be configured. - -For the goods and services tax computation and electronic invoicing process, you need to configure -the :ref:`contacts `, :ref:`company `, :ref:`products -`, and :ref:`create an account in AvaTax ` which needs to be -configured in the general settings. - -For the services taxes, you can create and configure them from Odoo directly without computing them -with AvaTax. - -The localization also includes taxes and a chart of accounts template that can be modified if -needed. - .. seealso:: - Links to helpful resources for the Brazilian localization, including onboarding materials and - videos: + Helpful resources for the Brazilian localization, including onboarding materials and videos: - `Onboarding checklist for new users `_. @@ -37,14 +18,12 @@ needed. - :doc:`Documentation on e-invoicing's legality and compliance in Brazil <../accounting/customer_invoices/electronic_invoicing/brazil>` -Configuration -============= +.. _localizations/brazil/modules: -Modules installation --------------------- +Modules +======= -:ref:`Install ` the following modules to get all the features of the Brazilian -localization: +The following modules related to the Brazilian localization are available: .. list-table:: :header-rows: 1 @@ -55,350 +34,389 @@ localization: - Description * - :guilabel:`Brazilian - Accounting` - `l10n_br` - - Default :ref:`fiscal localization package `, which represents - having the Generic Brazilian chart of accounts and Taxes, together with document types and + - Brazilian :ref:`fiscal localization package `, complete with + the Brazilian chart of accounts, taxes, tax report, fiscal positions, and document and identification types. * - :guilabel:`Brazil - Accounting Reports` - `l10n_br_reports` - Accounting reports for Brazil. - * - :guilabel:`AvaTax Brazil` & :guilabel:`AvaTax Brazil for Services` - - `l10n_br_avatax` & `l10n_br_avatax_services` + * - :guilabel:`AvaTax Brazil`, :guilabel:`Avatax Brazil Sale` & :guilabel:`Test SOs for the + Brazilian Avatax` + - `l10n_br_avatax`, `l10n_br_avatax_sale` & `l10n_br_test_avatax_sale` - Goods and Services tax computation through Avalara. - * - :guilabel:`Brazilian Accounting EDI` & :guilabel:`Brazilian Accounting EDI for services` - - `l10n_br_edi` & `l10n_br_edi_services` - - Provides electronic invoicing for goods and services for Brazil through AvaTax. - * - :guilabel:`Brazil Pix QR codes` - - `l10n_br_pix` - - Implements Pix QR codes for Brazil. + * - :guilabel:`Brazilian Accounting EDI` + - `l10n_br_edi` + - Provides electronic invoicing through Avatax. + * - :guilabel:`Brazilian Accounting EDI For Sale` + - `l10n_br_edi_sale` + - Adds some fields to sale orders that are carried over the invoice. + * - :guilabel:`Brazilian Accounting EDI for POS` + - `l10n_br_edi_pos` + - Provides electronic invoicing through Avatax in the POS. + * - :guilabel:`Brazilian Accounting EDI for eCommerce` + - `l10n_br_edi_website_sale` + - Allows tax calculation and EDI for eCommerce users. + * - :guilabel:`Brazilian Accounting EDI for stock` + - `l10n_br_edi_stock` + - Adds delivery-related information to the NF-e. + * - :guilabel:`Brazil - Website Sale` + - `l10n_br_website_sale` + - Allows tax calculation and EDI for eCommerce users. + * - :guilabel:`Brazil - Sale` + - `l10n_br_sales` + - Sale modifications for Brazil + * - :guilabel:`Brazil - Sale Subscription` + - `l10n_br_sale_subscription` + - Sale subscription modifications for Brazil -.. _brazil/company: +.. note:: + The localization's core modules are installed automatically with the localization. The rest can + be manually :doc:`installed `. -Configure your company ----------------------- +.. _localizations/brazil/loc-review: -To configure your company information, go to the :menuselection:`Contacts` app and search the name -given to your company. +Localization overview +===================== -#. Select the :guilabel:`Company` option at the top of the page. Then, configure the following - fields: +The Brazilian localization package ensures compliance with Brazilian fiscal and accounting +regulations. It includes tools for managing taxes, fiscal positions, reporting, and a predefined +chart of accounts tailored to Brazil’s standards. - - :guilabel:`Name` - - :guilabel:`Address`: add :guilabel:`City`, :guilabel:`State`, :guilabel:`Zip Code`, - :guilabel:`Country` +The Brazilian localization package provides the following key features to ensure compliance with +local fiscal and accounting regulations: + +- :ref:`Chart of accounts `: a predefined structure tailored + to Brazilian accounting standards +- :ref:`Taxes `: pre-configured tax rates, including standard VAT, + zero-rated, and exempt options. +- :doc:`Payroll ` +- :doc:`Reporting <../accounting/reporting>` + +.. _localizations/brazil/chart-of-accounts: + +Chart of accounts +----------------- + +In the :doc:`chart of accounts <../accounting/get_started/chart_of_accounts>`, the accounts are +mapped automatically to their corresponding taxes, and the default account payable and account +receivable fields. + +.. note:: + The Brazil chart of accounts is based on the SPED CoA, which provides a baseline of the necessary + accounts. + +.. _localizations/brazil/taxes: + +Taxes +----- + +:doc:`Taxes <../accounting/taxes>` are automatically created and configured when installing the +Brazilian localization. Avalara uses some to compute taxes on sales orders or invoices. + +Taxes used for services must be manually added and configured, as the rate may differ depending on +the city where the service is offered. + +.. important:: + NFS-e can't be issued for service taxes created manually. To :ref:`electronically send an NFS-e + `, compute taxes using Avalara. - - In the :guilabel:`Street` field, enter the street name, number, and any additional address - information. - - In the :guilabel:`Street 2` field, enter the neighborhood. +.. warning:: + Do not delete taxes, as they are used for the AvaTax tax computation. If deleted, Odoo creates + them again when used in an |SO| or invoice, computing taxes with AvaTax. However, the account + used to register the tax must be reconfigured in the tax's :guilabel:`Definition` tab, under + the :guilabel:`Distribution for invoices` and :guilabel:`Distribution for refunds` sections. + +.. _localizations/brazil/company-and-contacts: + +Company and contacts +==================== + +To use all the features of this fiscal localization, the following fields are required on the +:doc:`company record `: + +- :guilabel:`Name` +- :guilabel:`Address`: add :guilabel:`City`, :guilabel:`State`, :guilabel:`Zip Code`, + :guilabel:`Country` - - :guilabel:`Identification Number`: :guilabel:`CNPJ` or :guilabel:`CPF` - - :guilabel:`Tax ID`: associated with the identification type - - :guilabel:`IE`: State registration - - :guilabel:`IM`: Municipal registration - - :guilabel:`SUFRAMA code`: Superintendence of the Manaus Free Trade Zone - add if applicable - - :guilabel:`Phone` - - :guilabel:`Email` + - In the :guilabel:`Street` field, enter the street name, number, and any additional address + information. + - In the :guilabel:`Street 2` field, enter the neighborhood. - .. image:: brazil/contact-configuration.png - :alt: Company configuration. +- :guilabel:`Identification Number`: :guilabel:`CNPJ` or :guilabel:`CPF` +- :guilabel:`Tax ID`: associated with the identification type +- :guilabel:`IE`: State registration +- :guilabel:`IM`: Municipal registration +- :guilabel:`SUFRAMA code`: Superintendence of the Manaus Free Trade Zone - add if applicable +- :guilabel:`Phone` +- :guilabel:`Email` -#. Configure the :guilabel:`Fiscal Information` within the :guilabel:`Sales and Purchase` tab: +Configure the :guilabel:`Fiscal Information` within the :guilabel:`Sales and Purchase` tab: - - Add the :guilabel:`Fiscal Position` for :ref:`AvaTax Brazil `. + - Add the :ref:`Fiscal Position ` for AvaTax Brazil. - :guilabel:`Tax Regime`: Federal Tax Regime - :guilabel:`ICMS Taxpayer Type`: indicates :guilabel:`ICMS regime`, :guilabel:`Exempt status`, or :guilabel:`Non-Taxpayer` - :guilabel:`Main Activity Sector` - .. image:: brazil/contact-fiscal-configuration.png - :alt: Company fiscal configuration. +Configure the following extra :guilabel:`Fiscal Information` to issue NFS-e: -#. Configure the following extra :guilabel:`Fiscal Information` if you are going to issue NFS-e: - - - Add the :guilabel:`Fiscal Position` for :ref:`AvaTax Brazil `. + - Add the :ref:`Fiscal Position ` for AvaTax Brazil. - :guilabel:`COFINS Details`: :guilabel:`Taxable, Not Taxable, Taxable with rate 0%, Exempt, Suspended` - :guilabel:`PIS Details` :guilabel:`Taxable, Not Taxable, Taxable with rate 0%, Exempt, Suspended` - - :guilabel:`CSLL Taxable` If the company is subject to CSLL or not + - :guilabel:`CSLL Taxable` if the company is subject to CSLL or not - .. image:: brazil/contact-fiscal-configuration-nfse.png - :alt: Company fiscal configuration for NFSe. +.. tip:: + If it is a simplified regime, the ICMS rate must be configured. To do so, go to + :menuselection:`Accounting --> Configuration --> Settings`, scroll down to the :guilabel:`Taxes` + section, and set the :guilabel:`Sales Tax` and :guilabel:`Purchase Tax` fields in the + :guilabel:`Default Taxes` section. -#. Finally, upload a company logo and save the contact. +The same configuration applies to the relevant :doc:`contact <../../essentials/contacts>` form when +using the AvaTax integration. .. note:: - If you are a simplified regime, you need to configure the ICMS rate under - :menuselection:`Accounting --> Configuration --> Settings --> Taxes --> AvaTax Brazil`. - -.. _brazil/avatax-account: + Select the :guilabel:`Company` option for a contact with a tax ID (CNPJ), or check + :guilabel:`Individual` for a contact with a CPF. -Configure AvaTax integration ----------------------------- +.. _localizations/brazil/avatax-account: -Avalara AvaTax is a tax calculation and electronic invoicing provider that can be integrated in Odoo -to automatically compute taxes by taking into account the company, contact (customer), product, and -transaction information to retrieve the correct tax to be used and process the e-invoice afterward -with the government. - -Using this integration requires :doc:`In-App-Purchases (IAPs) <../../essentials/in_app_purchase>` to -compute the taxes and to send the electronic invoices. Whenever you compute taxes, send an -electronic document (NF-e, NFS-e, etc), or perform any electronic flow (NF-e Cancellation, -Correction letter, Invalidate invoice number range), an API call is made using credits from your -`IAP credits balance `_. +AvaTax integration +================== .. note:: + - Make sure to :ref:`install ` the :guilabel:`AvaTax Brazil` (`l10n_br_avatax`) + module. - Odoo is a certified partner of Avalara Brazil. - - You can `buy IAP credit on odoo.com `_. - - On creation, new databases receive 500 free credits. + - The :doc:`Avalara AvaTax integration <../accounting/taxes/avatax>` uses :doc:`In-App-Purchases + (IAPs) <../../essentials/in_app_purchase>` to compute taxes and handle electronic documents + (e.g., :ref:`NF-e `, :ref:`NFS-e + `). Each action consumes credits from the `IAP credit + balance `_. On creation, new databases receive + 500 free credits. + +To compute the goods and services tax and process electronic invoices, the following configurations +are needed: -Credential configuration -~~~~~~~~~~~~~~~~~~~~~~~~ +- :ref:`Company ` +- :ref:`Contacts ` +- :ref:`AvaTax configuration`. +- :ref:`A1 digital certificate ` +- :ref:`Tax mapping ` +- :ref:`Products ` -To activate AvaTax in Odoo, you need to create an account. To do so, go to -:menuselection:`Accounting --> Configuration --> Settings --> Taxes`, and in the :guilabel:`AvaTax -Brazil` section, add the administration email address to be used for the AvaTax portal in the -:guilabel:`AvaTax Portal Email`, and then click on :guilabel:`Create account`. +.. _localizations/brazil/avatax-configuration: + +Configuration +------------- + +.. _localizations/brazil/avatax-credentials: + +Credentials +~~~~~~~~~~~ + +:ref:`Activate AvaTax in Odoo ` and, in the :guilabel:`AvaTax Brazil` +section, add the administrator's email address for the AvaTax portal in the :guilabel:`AvaTax Portal +Email` field, then click :icon:`fa-plug` :guilabel:`Create account`. .. warning:: When **testing** or **creating a production** :guilabel:`AvaTax Portal Email` integration in a - sandbox or production database, use a real email address, as it is needed to log in to the - Avalara Portal and set up the certificates, whether you want to test or use it on production. + sandbox or production database, use a real email address, as it is needed to :ref:`connect to + Avalara ` and set up the certificates, whether to test or use it + on production. - There are two different Avalara Portals, one for testing and one for production: + There are two different Brazilian Avalara Portals: - - Sandbox: https://portal.sandbox.avalarabrasil.com.br/ - - Production: https://portal.avalarabrasil.com.br/ + - One for testing: https://portal.sandbox.avalarabrasil.com.br/ + - One for production: https://portal.avalarabrasil.com.br/ - When you create the account from Odoo, be sure to select the right environment. Moreover, the - email used to open the account cannot be used to open another account. Save your :guilabel:`API - ID` and :guilabel:`API Key` when you create the account from Odoo. + When the account is created from Odoo, select the right environment. Moreover, the email used to + open the account cannot be used to open another account. Save the :guilabel:`API ID` and + :guilabel:`API Key` when the account is created from Odoo. .. image:: brazil/transfer-api-credentials.png :alt: Transfer API Credentials. -After you create the account from Odoo, you need to go to the Avalara Portal to set up your -password: +After the account is created from Odoo, go to the Avalara Portal to set up the password: #. Access the `Avalara portal `_. -#. Click on :guilabel:`Meu primeiro acesso`. -#. Add the email address you used in Odoo to create the Avalara/AvaTax account, and then click +#. Click :guilabel:`Meu primeiro acesso`. +#. Add the email address used in Odoo to create the Avalara/AvaTax account, and click :guilabel:`Solicitar Senha`. -#. You will receive an email with a token and a link to create your password. Click on this link and - copy-paste the token to allocate your desired password. +#. An email will then be received with a token and a link to create a password. Click on this link + and copy-paste the token to allocate the desired password. .. tip:: - You can start using AvaTax in Odoo for tax computation **only** without creating a password and - accessing the Avalara portal in the Odoo database. However, in order to use the electronic - invoice service, you **must** access the AvaTax portal and upload your certificate there. - -.. image:: brazil/avatax-account-configuration.png - :alt: AvaTax account configuration. + If you use AvaTax in Odoo for tax computation **only**, setting a password or accessing the + Avalara portal is unnecessary. However, to use the electronic invoice service, access to + AvaTax is needed, and the :ref:`certificate must be uploaded + `. .. note:: - You can transfer |API| credentials. Use this only when you have already created an account in - another Odoo instance and wish to reuse it. + |API| credentials can be transferred. This option should be used only when an account has already + been created in another Odoo instance and must be reused. + +.. _localizations/brazil/certificate-upload: A1 certificate upload ~~~~~~~~~~~~~~~~~~~~~ -In order to issue electronic invoices, a certificate needs to be uploaded to the `AvaTax portal +To issue electronic invoices, a certificate must be uploaded to the `AvaTax portal `_. -The certificate will be synchronized with Odoo, as long as the external identifier number in the -AvaTax portal matches - without special characters - with the CNPJ number, and the identification -number (CNPJ) in Odoo matches with the CNPJ in AvaTax. +The certificate will be synchronized with Odoo as long as the external identifier number in the +AvaTax portal matches, without special characters, with the CNPJ number, and the identification +number (CNPJ) in Odoo matches the CNPJ in AvaTax. .. important:: - To issue NFS-e, some cities require that you link the certificate within the City Portal system - before issuing NFS-e from Odoo. + Some cities require the certificate to be linked within the City Portal system before issuing + NFS-e from Odoo. - If you receive an error message from the city that says :guilabel:`Your certificate is not linked - to the user`, that means this process needs to be done in the city portal. + If an error message from the city that says :guilabel:`Your certificate is not linked + to the user` is received, this process needs to be done in the city portal. -Configure master data ---------------------- +.. _localizations/brazil/fiscal-positions: -Chart of accounts -~~~~~~~~~~~~~~~~~ +Fiscal positions +~~~~~~~~~~~~~~~~ -The :doc:`chart of accounts <../accounting/get_started/chart_of_accounts>` is installed by default -as part of the data set included in the localization module. The accounts are mapped automatically -in their corresponding taxes, and the default account payable and account receivable fields. +To set up the :guilabel:`Automatic Tax Mapping (Avalara Brazil)` :ref:`fiscal position +`, enable the :guilabel:`Detect Automatically` and +:guilabel:`Use AvaTax Brazil API` options. -.. note:: - The chart of accounts for Brazil is based on the SPED CoA, which gives a baseline of the accounts - needed in Brazil. +.. seealso:: + :doc:`Fiscal positions <../accounting/taxes/fiscal_positions>` - You can add or delete accounts according to the company's needs. +.. _localizations/brazil/products: -Journals +Products ~~~~~~~~ -In Brazil, a *series* number is linked to a sequence number range for electronic invoices. The -series number can be configured in Odoo on a sales journal from the :guilabel:`Series` field. If -more than one series is needed, then a new sales journal will need to be created and a new series -number assigned to it for each series needed. - -The :guilabel:`Use Documents` field needs to be selected. When issuing electronic and non-electronic -invoices, the :guilabel:`Type` field selects the document type used when creating the invoice. The -:guilabel:`Type` field will only be displayed if the :guilabel:`Use Documents` field is selected on -the journal. - -.. image:: brazil/journal-configuration.png - :alt: Journal configuration with the Use Documents? field checked. +To use the AvaTax integration on sales orders and invoices, enter the following information in the +:guilabel:`Sales` tab of the product form under the :guilabel:`Brazil Accounting` section, based on +how the product will be used. -.. note:: - When creating the journal, ensure the field :guilabel:`Dedicated Credit Note Sequence` is - unchecked, as in Brazil, sequences between invoices, credit notes, and debit notes are shared per - series number, which means per journal. - -Taxes -~~~~~ +.. _localizations/brazil/e-invoice-goods: -Taxes are automatically created when installing the Brazilian localization. Taxes are already -configured, and some of them are used by Avalara when computing taxes on the sales order or invoice. - -Taxes can be edited, or more taxes can be added. For example, some taxes used for services need to -be manually added and configured, as the rate may differ depending on the city where you are -offering the service. +E-invoices for goods (NF-e) +*************************** .. important:: - If you decide to do service taxes manually, you won't be able to issue an NFS-e. To - electronically send an NFS-e, you need to compute taxes using Avalara. + The :ref:`Avalara integration ` works on a credit-based + system, where each interaction with Avalara consumes one credit. Below are the main + credit-consuming operations: -.. warning:: - Do not delete taxes, as they are used for the AvaTax tax computation. If deleted, Odoo creates - them again when used in an |SO| or invoice and computing taxes with AvaTax, but the account used - to register the tax needs to be re-configured in the tax's :guilabel:`Definition` tab, under the - :guilabel:`Distribution for invoices` and :guilabel:`Distribution for refunds` sections. + **Sales application** -.. seealso:: - :doc:`Taxes functional documentation <../accounting/taxes>` + - Tax calculation on quotations and sales orders. -.. _brazil/products: + **Accounting application** -Products -~~~~~~~~ + - Tax calculation on invoices. + - Electronic invoice submission (NF-e or NFS-e). -To use the AvaTax integration on sale orders and invoices, first specify the following information -on the product depending on its intended use: + **Occasional operations**: (each step is billed separately) -E-Invoice for goods (NF-e) -************************** + - :ref:`Correction letter (Carta de Correção) ` + - :ref:`Invoice cancellation ` + - :ref:`Sales refund via credit note ` + - :ref:`Sales complementary invoice via debit note ` + - :ref:`Invoice number range invalidation ` + - Other tax validations. -- :guilabel:`CEST Code`: Code for products subject to ICMS tax substitution +.. note:: + If taxes are calculated in the **Sales** app, and the invoice is later issued in the + **Accounting** app, the calculation happens twice, consuming two credits. + +.. example:: + | **Sales order confirmed** + | :icon:`fa-arrow-down` 1 credit (tax calculation) + | **Invoice created** + | :icon:`fa-arrow-down` 1 credit (tax calculation) + | **Invoice confirmed and submitted** + | :icon:`fa-arrow-down` 1 credit (tax calculation) + 1 credit (submit invoice) + | **Total: 4 credits** + +- :guilabel:`CEST Code`: tax classification code identifying goods and products subject to tax + substitution under ICMS regulations, and helps determine the applicable tax treatment and + procedures for specific items. The product's applicability to this requirement can be verified at + https://www.codigocest.com.br/. - :guilabel:`Mercosul NCM Code`: Mercosur Common Nomenclature Product Code -- :guilabel:`Source of Origin`: Indicates the origin of the product, which can be foreign or - domestic, among other possible options depending on the specific use case -- :guilabel:`SPED Fiscal Product Type`: Fiscal product type according to SPED list table -- :guilabel:`Purpose of Use`: Specify the intended purpose of use for this product - -.. image:: brazil/product-configuration.png - :alt: Product configuration. +- :guilabel:`Source of Origin`: origin of the product, which can be foreign or domestic, among other + possible options, depending on the specific use case +- :guilabel:`SPED Fiscal Product Type`: fiscal product type according to the SPED list table +- :guilabel:`Purpose of Use`: intended purpose of use for this product .. note:: Odoo automatically creates three products to be used for transportation costs associated with - sales. These are named `Freight`, `Insurance`, and `Other Costs`. They are already configured, if - more need to be created, duplicate and use the same configuration (configuration needed: - :guilabel:`Product Type` `Service`, :guilabel:`Transportation Cost Type` `Insurance`, `Freight`, - or `Other Costs`). + sales. These are named :guilabel:`Freight`, :guilabel:`Insurance`, and :guilabel:`Other Costs` + and are already configured. If more need to be created, duplicate and use the same configuration: -E-Invoice for services (NFS-e) -****************************** + - :guilabel:`Product Type` :guilabel:`Service` + - :guilabel:`Transportation Cost Type`: :guilabel:`Insurance`, :guilabel:`Freight`, or + :guilabel:`Other Costs` -- :guilabel:`Mercosul NCM Code`: Mercosur Common Nomenclature Product Code -- :guilabel:`Purpose of Use`: Specify the intended purpose of use for this product -- :guilabel:`Service Code Origin`: City Service Code where the provider is registered -- :guilabel:`Service Codes`: City Service Code where the service will be provided, if no - code is added, the Origin City Code will be used -- :guilabel:`Labor Assignment`: Defines if your services includes labor +.. _localizations/brazil/e-invoice-services: -.. _brazil/contacts: - -Contacts -~~~~~~~~ - -Before using the integration, specify the following information on the contact: - -#. General information about the contact: - - - Select the :guilabel:`Company` option for a contact with a tax ID (CNPJ), or check - :guilabel:`Individual` for a contact with a CPF. - - :guilabel:`Name` - - :guilabel:`Address`: add :guilabel:`City`, :guilabel:`State`, :guilabel:`Zip Code`, - :guilabel:`Country` - - - In the :guilabel:`Street` field, enter the street, number, and any extra address information. - - In the :guilabel:`Street 2` field, enter the neighborhood. - - - :guilabel:`Identification Number`: :guilabel:`CNPJ` or :guilabel:`CPF` - - :guilabel:`Tax ID`: associated with the identification type - - :guilabel:`IE`: state tax identification number - - :guilabel:`IM`: municipal tax identification number - - :guilabel:`SUFRAMA code`: SUFRAMA registration number - - :guilabel:`Phone` - - :guilabel:`Email` - - .. image:: brazil/contact-configuration.png - :alt: Contact configuration. - - .. note:: - The :guilabel:`CPF`, :guilabel:`IE`, :guilabel:`IM`, and :guilabel:`SUFRAMA code` fields are - are hidden until the :guilabel:`Country` is set to `Brazil`. - -#. Fiscal information about the contact under the :guilabel:`Sales \& Purchase` tab: - - - :guilabel:`Fiscal Position`: add the AvaTax fiscal position to automatically compute taxes on - sale orders and invoices automatically - - :guilabel:`Tax Regime`: federal tax regime - - :guilabel:`ICMS Taxpayer Type`: taxpayer type determines if the contact is within the - :guilabel:`ICMS regime`, :guilabel:`Exempt status`, or :guilabel:`Non-taxpayer` - - :guilabel:`Main Activity Sector`: list of main activity sectors of the contact - - .. image:: brazil/contact-fiscal-configuration.png - :alt: Contact fiscal configuration. - -#. Configure the following extra :guilabel:`Fiscal Information` if you are going to issue NFS-e: +E-invoices for services (NFS-e) +******************************* - - Add the :guilabel:`Fiscal Position` for :ref:`AvaTax Brazil ` - - :guilabel:`COFINS Details`: :guilabel:`Taxable, Not Taxable, Taxable with rate 0%, Exempt, - Suspended` - - :guilabel:`PIS Details`: :guilabel:`Taxable, Not Taxable, Taxable with rate 0%, Exempt, - Suspended` - - :guilabel:`CSLL Taxable`: If the company is subject to CSLL or not +.. important:: + The :ref:`Avalara integration ` works on a credit-based + system, where each interaction with Avalara consumes one credit. Below are the main + credit-consuming operations: - .. image:: brazil/contact-fiscal-configuration-nfse.png - :alt: Contact fiscal configuration for NFSe. + **Sales application** -.. _brazil/fiscal-positions: + - Tax calculation on quotations and sales orders. -Fiscal positions -~~~~~~~~~~~~~~~~ + **Accounting application** -To compute taxes and send electronic invoices on sale orders and invoices, both the -:guilabel:`Detect Automatically` and the :guilabel:`Use AvaTax API` options need to be enabled in -the :guilabel:`Fiscal Position`. + - Tax calculation on invoices. + - Electronic invoice submission (NF-e or NFS-e). + - Invoice status check (1 credit is consumed each time the invoice status is checked). -The :guilabel:`Fiscal Position` can be configured on the :ref:`contact ` or -selected when creating a sales order or an invoice. + **Occasional operations**: (each step is billed separately) -.. image:: brazil/fiscal-position-configuration.png - :alt: Fiscal position configuration + - :ref:`Correction letter (Carta de Correção) ` + - :ref:`Invoice cancellation ` + - :ref:`Sales refund via credit note ` + - :ref:`Sales complementary invoice via debit note ` + - :ref:`Invoice number range invalidation ` + - Other tax validations. -Workflows -========= +.. note:: + If taxes are calculated in the **Sales** app and the invoice is later issued in the + **Accounting** app, the calculation happens twice, consuming two credits. + +.. example:: + | **Sales order confirmed** + | :icon:`fa-arrow-down` 1 credit (tax calculation) + | **Invoice created** + | :icon:`fa-arrow-down` 1 credit (tax calculation) + | **Invoice confirmed and submitted** + | :icon:`fa-arrow-down` 1 credit (tax calculation) + 1 credit (submit invoice) + | **Total: 4 credits** -This section provides an overview of the actions that trigger `API calls -`_ for tax computation, along with instructions on how to send -electronic invoices for goods (NF-e) and services (NFS-e) for government validation. +- :guilabel:`Mercosul NCM Code`: Mercosur Common Nomenclature Product Code +- :guilabel:`Purpose of Use`: intended purpose of use for this product +- :guilabel:`Service Code Origin`: City Service Code where the provider is registered +- :guilabel:`Labor Assignment`: checkbox to select if the service involves labor +- :guilabel:`Transport Cost Type`: type of transport costs to select +- :guilabel:`Service Codes`: City Service Code where the service will be provided; if no code is + added, the :guilabel:`Service Code Origin` will be used. -.. warning:: - Please note that each |API| call incurs a cost. Be mindful of the actions that trigger these - calls to manage costs effectively. +.. _localizations/brazil/tax-computation: Tax computation --------------- +.. seealso:: + :ref:`Tax calculation ` + +.. _localizations/brazil/tax-calculations: + Tax calculations on quotations and sales orders ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -408,15 +426,17 @@ any of the following ways: - **Quotation confirmation** Confirm a quotation into a sales order. - **Manual trigger** - Click on :guilabel:`Compute Taxes Using AvaTax`. + Click :guilabel:`Compute Taxes Using AvaTax`. - **Preview** - Click on the :guilabel:`Preview` button. -- **Email a quotation / sales order** + Click :guilabel:`Preview`. +- **Email a quotation/sales order** Send a quotation or sales order to a customer via email. - **Online quotation access** When a customer accesses the quotation online (via the portal view), the |API| call is triggered. +.. _localizations/brazil/tax-calculations-invoices: + Tax calculations on invoices ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -424,9 +444,9 @@ Trigger an |API| call to calculate taxes on a customer invoice automatically wit the following ways: - **Manual trigger** - Click on :guilabel:`Compute Taxes Using AvaTax`. + Click :guilabel:`Compute Taxes Using AvaTax`. - **Preview** - Click on the :guilabel:`Preview` button. + Click :guilabel:`Preview`. - **Online invoice access** When a customer accesses the invoice online (via the portal view), the |API| call is triggered. @@ -437,160 +457,341 @@ the following ways: .. seealso:: :doc:`Fiscal positions (tax and account mapping) <../accounting/taxes/fiscal_positions>` -.. _brazil/electronic-documents: +.. _localizations/brazil/accounting: + +Accounting +========== + +.. _localizations/brazil/electronic-documents: Electronic documents -------------------- +.. _localizations/brazil/journals: + +Configuration +~~~~~~~~~~~~~ + +A *series* number is linked to a sequence number range for electronic invoices. To configure the +series number on a sales journal, go to :menuselection:`Accounting --> Configuration --> Journals` +and set it in the :guilabel:`Series` field. If more than one series is needed, a new sales journal +must be created, and a new series number must be assigned for each series. + +Enable the :guilabel:`Use Documents?` option as the :guilabel:`Series` field will only be displayed +if the :guilabel:`Use Documents?` option is selected on the journal. + +When issuing electronic and non-electronic invoices, the :guilabel:`Type` field selects the document +type used when creating the invoice. + +.. note:: + When creating the journal, ensure the :guilabel:`Dedicated Credit Note Sequence` field in the + :guilabel:`Accounting Information` section is unchecked, as in Brazil, sequences between + invoices, credit notes, and debit notes are shared per series number, which means per journal. + +.. _localizations/brazil/customer-invoices: + Customer invoices ~~~~~~~~~~~~~~~~~ -To process an electronic invoice for goods (NF-e) or services (NFS-e), the invoice needs to be -confirmed and taxes need to be computed by Avalara. Once that step is done, click on the -:guilabel:`Send & Print` button in the upper left corner. In the pop-up that appears, click on -:guilabel:`Process e-invoice` and any of the other options - :guilabel:`Download` or -:guilabel:`Email`. Finally, click on :guilabel:`Send & Print` to process the invoice with the -government. +To process an electronic invoice for goods (NF-e) or services (NFS-e), the invoice must be confirmed +and taxes must be computed by Avalara. The following fields must be filled out: -Before sending the electronic invoice for goods (NF-e) or services (NFS-e), some fields need to be -filled out on the invoice: +- :guilabel:`Customer`, with all customer information +- :guilabel:`Payment Method: Brazil`: Specify the expected payment method. +- :guilabel:`Document Type`: Select :guilabel:`(55) Electronic Invoice (NF-e)` or :guilabel:`(SE) + Electronic Service Invoice (NFS-e)`. -- :guilabel:`Customer`, with all the customer information -- :guilabel:`Payment Method: Brazil`: how the invoice is planned to be paid -- :guilabel:`Fiscal Position` set as the :guilabel:`Automatic Tax Mapping (Avalara Brazil)` -- :guilabel:`Document Type` set as :guilabel:`(55) Electronic Invoice (NF-e)` or :guilabel:`(SE) - Electronic Service Invoice (NFS-e)` +:guilabel:`Other Info` tab: -There are some other optional fields that depend on the nature of the transaction. These fields are -not required, so no errors will appear from the government if these optional fields are not -populated for most cases: +- :guilabel:`Fiscal Position` set as :guilabel:`Automatic Tax Mapping (Avalara Brazil)`. -- :guilabel:`Freight Model` determines how the goods are planned to be transported - domestic -- :guilabel:`Transporter Brazil` determines who is doing the transportation +Some optional fields depend on the nature of the transaction. These fields in the :guilabel:`Other +Info` tab are not required, so in most cases, leaving them blank will not result in errors from the +government when the invoice is submitted: -.. image:: brazil/invoice-info-needed.png - :alt: Invoice information needed to process an electronic invoice. +- :guilabel:`Freight Model` determines how the goods are planned to be transported - domestic. +- :guilabel:`Transporter Brazil` determines who is doing the transportation. -.. image:: brazil/process-electronic-invoice.png - :alt: Process electronic invoice pop-up in Odoo. +Then, click :guilabel:`Send`. In the :guilabel:`Print & Send` window, click :guilabel:`Process +e-invoice` and any other options, such as :guilabel:`Download` or :guilabel:`Email`. Finally, click +:guilabel:`Send` to process the invoice with the government. .. note:: - All of the fields available on the invoice used to issue an electronic invoice are also available - on the sales order, if needed. When creating the first invoice, the field :guilabel:`Document - Number` is displayed, allocated as the first number to be used sequentially for subsequent - invoices. + All fields available on the invoice used to issue an electronic invoice are also available on the + sales order, if needed. When creating the first invoice, the :guilabel:`Document Number` field is + displayed and allocated as the first number to be used sequentially for subsequent invoices. + +.. _localizations/brazil/credit-notes: Credit notes ~~~~~~~~~~~~ -If a sales return needs to be registered, then a credit note can be created in Odoo to be sent to -the government for validation. +If a sales return needs to be registered, a :ref:`credit note can be created in Odoo +` and sent to the government for validation. .. note:: Credit notes are only available for electronic invoices for goods (NF-e). -.. seealso:: - :ref:`Issue a credit note ` +.. _localizations/brazil/debit-notes: -Debit Notes +Debit notes ~~~~~~~~~~~ -If additional information needs to be included, or values need to be corrected that were not -accurately provided in the original invoice, a debit note can be issued. +If additional information needs to be included or values that were not accurately provided in the +original invoice need to be corrected, a :ref:`debit note can be issued +`. .. note:: - Debit notes are only available for electronic invoices for goods (NF-e). - - Only the products included in the original invoice can be part of the debit note. While changes - can be made to the product's unit price or quantity, products **cannot** be added to the debit - note. The purpose of this document is only to declare the amount that you want to add to the - original invoice for the same or fewer products. + - Debit notes are only available for electronic invoices for goods (NF-e). + - Only the products included in the original invoice can be included in the debit note. While + changes can be made to the product's unit price or quantity, products **cannot** be added to + the debit note. The purpose of this document is only to declare the amount to be added to the + original invoice for the same or fewer products. -.. seealso:: - :ref:`Issue a debit note ` +.. _localizations/brazil/invoice-cancellation: Invoice cancellation ~~~~~~~~~~~~~~~~~~~~ -It is possible to cancel an electronic invoice that was validated by the government. +It is possible to cancel an electronic invoice that the government validated. .. note:: Check whether the electronic invoice is still within the cancellation deadline, which may vary - according to the legislation of each state. + according to each state's legislation. + +.. _localizations/brazil/e-invoice-goods-nf-e: E-invoices for goods (NF-e) *************************** -Cancel an e-invoice for goods (NF-e) in Odoo by clicking :guilabel:`Request Cancel` and adding a -cancellation :guilabel:`Reason` on the pop-up that appears. If you want to send this cancellation -reason to the customer via email, activate the :guilabel:`E-mail` checkbox. - -.. image:: brazil/invoice-cancellation.png - :alt: Invoice cancellation reason in Odoo. +To cancel an e-invoice for goods (NF-e) in Odoo, click :guilabel:`Request Cancel` and add a +cancellation :guilabel:`Reason` on the pop-up that appears. To send this cancellation reason to the +customer via email, enable the :guilabel:`E-mail` checkbox. .. note:: This is an electronic cancellation, which means that Odoo will send a request to the government - to cancel the NF-e, and it will then consume one |IAP| credit, as an |API| call occurs. + to cancel the NF-e. It will then consume one |IAP| credit, as an |API| call occurs. + +.. _localizations/brazil/e-invoice-services-nf-e: E-invoices for services (NFS-e) ******************************* -Cancel an e-invoice for services (NFS-e) in Odoo by clicking :guilabel:`Request Cancel`. In this -case, there is no electronic cancellation process, as not every city has this service available. The -user needs to manually cancel this NFS-e on the city portal. Once that step is completed, they can +To cancel an e-invoice for services (NFS-e) in Odoo, click :guilabel:`Request Cancel`. There is no +electronic cancellation process in this case, as not every city has this service available. The +user needs to cancel this NFS-e on the city portal manually. Once that step is completed, they can request the cancellation in Odoo, which will cancel the invoice. +.. _localizations/brazil/correction-letter: + Correction letter ~~~~~~~~~~~~~~~~~ -A correction letter can be created and linked to an electronic invoice for goods (NF-e) that was -validated by the government. - -This can be done in Odoo by clicking :guilabel:`Correction Letter` and adding a correction -:guilabel:`Reason` on the pop-up that appears. To send this correction reason to a customer via -email, activate the :guilabel:`E-mail` checkbox. +A correction letter can be created and linked to an electronic invoice for goods (NF-e) that the +government validated. -.. image:: brazil/correction-letter.png - :alt: Correction letter reason in Odoo. +To do so in Odoo, click :guilabel:`Correction Letter` and add a correction :guilabel:`Reason` to the +pop-up. To send the correction reason to a customer via email, enable the :guilabel:`E-mail` +checkbox. .. note:: Correction letters are only available for electronic invoices for goods (NF-e). -Invalidate invoice number range -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. _localizations/brazil/invoice-number-invalidation: -A range of sequences that are assigned to sales journals can be invalidated with the government if -they are not currently used, **and** will not be used in the future. To do so, navigate to the -journal, and click the :menuselection:`⚙️ (gear) icon --> Invalidate Number Range (BR)`. On the +Invoice number range invalidation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A range of sequences that are assigned to sales journals can be invalidated by the government if +they are not currently used **and** will not be used in the future. To do so, go to +:menuselection:`Accounting --> Configuration --> Journals`, open the journal, click the +:icon:`fa-cog` (gear) icon, and select :guilabel:`Invalidate Number Range (BR)`. On the :guilabel:`Invalidate Number Range (BR)` wizard, add the :guilabel:`Initial Number` and :guilabel:`End Number` of the range that should be cancelled, and enter an invalidation :guilabel:`Reason`. -.. image:: brazil/range-number-invalidation.png - :alt: Number range invalidation selection in Odoo. - -.. image:: brazil/range-number-invalidation-wizard.png - :alt: Number range invalidation wizard in Odoo. - .. note:: - Invalidate invoice number range documents are only available for electronic invoices for goods - (NF-e). + - Invoice number range invalidation is only available for electronic invoices for goods (NF-e). + - The journal's chatter records the log of the cancelled numbers, along with the XML file. -.. note:: - The log of the cancelled numbers along with the XML file are recorded in the chatter of the - journal. +.. _localizations/brazil/vendor-bills: Vendor bills ------------ -On the vendor bills side, when receiving an invoice from a supplier, you can encode the bill in Odoo -by adding all the commercial information together with the same Brazilian specific information that -is recorded on the :ref:`customer invoices `. +When receiving an invoice from a supplier, encode the bill in Odoo by adding all the commercial +information and the same Brazilian-specific information recorded on the :ref:`customer invoices +`. -These Brazilian specific fields are: +These Brazilian-specific fields are: -- :guilabel:`Payment Method: Brazil`: how the invoice is planned to be paid -- :guilabel:`Document Type`: used by your vendor -- :guilabel:`Document Number`: the invoice number from your supplier +- :guilabel:`Payment Method: Brazil`: Specify the expected payment method. +- :guilabel:`Document Type`: used by the vendor +- :guilabel:`Document Number`: the invoice number from the supplier - :guilabel:`Freight Model`: **NF-e specific** how goods are planned to be transported - domestic - :guilabel:`Transporter Brazil`: **NF-e specific** who is doing the transportation. + +.. _localizations/brazil/pos: + +Point of sale NFC-e +=================== + +The NFC-e is a legal document that supports selling goods or merchandise to the final customer. Like +the :ref:`NF-e `, the electronic customer invoice is also +issued in XML file format and has an auxiliary document (DANFC-e) known as the *NFC-e Summary*. This +electronic document can be issued through **Odoo Point of Sale**. + +Its legal validity is guaranteed by the digital signature and by each Brazilian state's SEFAZ +(Secretaria da Fazenda). + +.. important:: + The :ref:`Avalara integration ` operates on a credit-based + system. Each operation that involves communication with Avalara consumes one credit. The + following operations within the **Point of Sale** (POS) application are subject to credit + consumption: + + - Tax calculation at the time of sale + - Electronic invoice issuance (NFC-e) + +.. note:: + Each step is billed separately. For example, calculating taxes and issuing an invoice for the + same POS transaction consumes two credits. + +.. seealso:: + :doc:`Point of Sale <../../sales/point_of_sale>` + +.. _localizations/brazil/pos-configuration: + +Configuration +------------- + +:ref:`Install ` the :guilabel:`Brazilian Accounting EDI for POS` (`l10nbr_edi_pos`) +module and make sure to activate :doc:`AvaTax <../accounting/taxes/avatax>`. + +.. _localizations/brazil/pos-csc-details: + +CSC details +----------- + +Go to :menuselection:`Accounting --> Configuration --> Settings` and scroll to the :guilabel:`Taxes` +section. In the :guilabel:`NFC-e configuration` section, complete the following CSC (Taxpayer +Security Code) fields: + +- :guilabel:`CSC ID`: The *CSC ID* or *CSC Token* is an identification of the taxpayer security + code, which can have 1 to 6 digits and is available on the official website of your state’s + Department of Finance (SEFAZ). +- :guilabel:`CSC Number`: The *CSC Number* is a code of up to 36 characters that only you and the + Department of Finance know. It is used to generate the QR Code of the NFC-e and ensure the + authenticity of the DANFE. + +.. note:: + The information required for these fields can be generated through the SEFAZ website of each + Brazilian State by the company's accountant. + +.. _localizations/brazil/pos-product: + +Product configuration +--------------------- + +Access the relevant :doc:`product form in POS <../../sales/point_of_sale/configuration>`, then +configure the :ref:`product `'s :guilabel:`Brazil Accounting` +fields. + +.. _localizations/brazil/pos-shop-configuration: + +Point of sale +------------- + +Go to :menuselection:`Point of Sale --> Configuration --> Settings` and make sure that the relevant +Point of Sale is :doc:`selected at the top of the screen <../../sales/point_of_sale/configuration>`. +Then, scroll to the :guilabel:`Accounting` section and configure the :guilabel:`Brazilian EDI` +fields: + +- :guilabel:`Series` +- :guilabel:`Next number`: the next NFC-e number in the sequence to be issued, for instance, if the + last number issued in SEFAZ is `100`, the *Next number* will be `101`. + +.. _localizations/brazil/pos-workflow: + +Workflow +-------- + +.. _localizations/brazil/generate-nfc-e: + +Generating an NFC-e +~~~~~~~~~~~~~~~~~~~ + +To generate an NFC-e, follow these steps: + +#. :ref:`Open the relevant point of sale shop and make a sale `. +#. Validate the payment to calculate taxes and issue an NFC-e. The valid NFC-e appears on the right + side of the screen. + +.. image:: brazil/l10n-br-nfce-succesfully-issued.png + :alt: NFC-e Success in a POS session. + +.. note:: + It is also possible to issue an NFC-e that identifies the customer by their CPF/CNPJ. To do + so, click :icon:`fa-user` :guilabel:`Customer`, search for the customer, or create a new one. + + The following are mandatory fields to issue a CPF/CNPJ identified NFC-e: + + - :guilabel:`Name` + - :guilabel:`City` and :guilabel:`State` where the invoice is being issued + - :guilabel:`CPF/CNPJ` + +#. Click :guilabel:`Validate`. The NFC-e appears, highlighting the customer's CPF on the print. +#. Click :guilabel:`Print` or :guilabel:`Send via e-mail` to deliver the invoice to the customer. + +.. _localizations/brazil/nfc-e-print: + +NFC-e ticket print +~~~~~~~~~~~~~~~~~~ + +After :ref:`generating and validating the NFC-e `, click +:guilabel:`Print` to deliver the invoice. + +.. note:: + The Odoo NFC-e feature is compatible with any thermal printer and does not require an :doc:`Odoo + IoT Box <../../general/iot>`. + +.. _localizations/brazil/order-with-nfc-e-error: + +Re-issuing a PoS order with an NFC-e error +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If the NFC-e returns an error, follow these steps: + +#. Correct the error. +#. Re-issue the NFC-e by clicking the :icon:`fa-bars` :guilabel:`(menu)` icon and selecting + :guilabel:`Orders`. +#. Filter the list to show only :guilabel:`Paid` orders and click :guilabel:`Details`. The error is + displayed. +#. Click :guilabel:`Send NFC-e`. + +.. note:: + If the error has been corrected and the PoS session is closed, Odoo logs the tax adjustment in + the chatter of the related journal entry. The journal entry for the order indicates that the + taxes were incorrectly calculated. In this case, reprocessing the NFC-e is required. + +.. image:: brazil/l10n-br-order-error-screen.png + :alt: Point of sale order view form. + +.. _localizations/brazil/nfc-e-refunds-cancellations: + +NFC-e refunds & cancellations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:ref:`Refunds can be processed directly in Odoo `, but *cancellations* must be performed +through the official government portal. + +When the process is finalized, the approved return NF-e is created, meaning the **previous NFC-e is +canceled**. + +.. image:: brazil/l10n-br-return-succeed.png + :alt: Return of Goods NF-e Approved. + +.. important:: + SEFAZ only allows cancellation of an NFC-e **within 30 minutes** of its issuance on the SEFAZ + website. After this period, a manual refund must be processed, along with the issuance of a + *Return of Goods NF-e*. diff --git a/content/applications/finance/fiscal_localizations/brazil/avatax-account-configuration.png b/content/applications/finance/fiscal_localizations/brazil/avatax-account-configuration.png deleted file mode 100644 index 92f77c3068..0000000000 Binary files a/content/applications/finance/fiscal_localizations/brazil/avatax-account-configuration.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/brazil/contact-configuration.png b/content/applications/finance/fiscal_localizations/brazil/contact-configuration.png deleted file mode 100644 index 71faca94d2..0000000000 Binary files a/content/applications/finance/fiscal_localizations/brazil/contact-configuration.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/brazil/contact-fiscal-configuration-nfse.png b/content/applications/finance/fiscal_localizations/brazil/contact-fiscal-configuration-nfse.png deleted file mode 100644 index 63077d95d9..0000000000 Binary files a/content/applications/finance/fiscal_localizations/brazil/contact-fiscal-configuration-nfse.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/brazil/contact-fiscal-configuration.png b/content/applications/finance/fiscal_localizations/brazil/contact-fiscal-configuration.png deleted file mode 100644 index 837d48e0de..0000000000 Binary files a/content/applications/finance/fiscal_localizations/brazil/contact-fiscal-configuration.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/brazil/correction-letter.png b/content/applications/finance/fiscal_localizations/brazil/correction-letter.png deleted file mode 100644 index 3a371488bc..0000000000 Binary files a/content/applications/finance/fiscal_localizations/brazil/correction-letter.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/brazil/fiscal-position-configuration.png b/content/applications/finance/fiscal_localizations/brazil/fiscal-position-configuration.png deleted file mode 100644 index 967a324cf1..0000000000 Binary files a/content/applications/finance/fiscal_localizations/brazil/fiscal-position-configuration.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/brazil/invoice-cancellation.png b/content/applications/finance/fiscal_localizations/brazil/invoice-cancellation.png deleted file mode 100644 index 41cb172183..0000000000 Binary files a/content/applications/finance/fiscal_localizations/brazil/invoice-cancellation.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/brazil/invoice-info-needed.png b/content/applications/finance/fiscal_localizations/brazil/invoice-info-needed.png deleted file mode 100644 index 5240979144..0000000000 Binary files a/content/applications/finance/fiscal_localizations/brazil/invoice-info-needed.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/brazil/journal-configuration.png b/content/applications/finance/fiscal_localizations/brazil/journal-configuration.png deleted file mode 100644 index b2ec85fd87..0000000000 Binary files a/content/applications/finance/fiscal_localizations/brazil/journal-configuration.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/brazil/l10n-br-nfce-succesfully-issued.png b/content/applications/finance/fiscal_localizations/brazil/l10n-br-nfce-succesfully-issued.png new file mode 100644 index 0000000000..c120913133 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/brazil/l10n-br-nfce-succesfully-issued.png differ diff --git a/content/applications/finance/fiscal_localizations/brazil/l10n-br-order-error-screen.png b/content/applications/finance/fiscal_localizations/brazil/l10n-br-order-error-screen.png new file mode 100644 index 0000000000..479c56b0ae Binary files /dev/null and b/content/applications/finance/fiscal_localizations/brazil/l10n-br-order-error-screen.png differ diff --git a/content/applications/finance/fiscal_localizations/brazil/l10n-br-return-succeed.png b/content/applications/finance/fiscal_localizations/brazil/l10n-br-return-succeed.png new file mode 100644 index 0000000000..d9236ff88f Binary files /dev/null and b/content/applications/finance/fiscal_localizations/brazil/l10n-br-return-succeed.png differ diff --git a/content/applications/finance/fiscal_localizations/brazil/process-electronic-invoice.png b/content/applications/finance/fiscal_localizations/brazil/process-electronic-invoice.png deleted file mode 100644 index 773a985e39..0000000000 Binary files a/content/applications/finance/fiscal_localizations/brazil/process-electronic-invoice.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/brazil/product-configuration.png b/content/applications/finance/fiscal_localizations/brazil/product-configuration.png deleted file mode 100644 index 92c09d7d53..0000000000 Binary files a/content/applications/finance/fiscal_localizations/brazil/product-configuration.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/brazil/range-number-invalidation-wizard.png b/content/applications/finance/fiscal_localizations/brazil/range-number-invalidation-wizard.png deleted file mode 100644 index 994d0a65a5..0000000000 Binary files a/content/applications/finance/fiscal_localizations/brazil/range-number-invalidation-wizard.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/brazil/range-number-invalidation.png b/content/applications/finance/fiscal_localizations/brazil/range-number-invalidation.png deleted file mode 100644 index 01213dee75..0000000000 Binary files a/content/applications/finance/fiscal_localizations/brazil/range-number-invalidation.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/canada.rst b/content/applications/finance/fiscal_localizations/canada.rst index fc716a3c50..21947c0bea 100644 --- a/content/applications/finance/fiscal_localizations/canada.rst +++ b/content/applications/finance/fiscal_localizations/canada.rst @@ -195,7 +195,8 @@ and region-specific tax calculations when items are sold, purchased, and invoice .. important:: AvaTax is available for integration with databases/companies that have locations in Canada and/or - the United States. Reference the :ref:`avatax/fiscal_country` documentation for more information. + the United States. Reference the :ref:`accounting/avatax/fiscal_country` documentation for more + information. .. seealso:: Refer to the documentation articles below to integrate and configure an AvaTax account with an diff --git a/content/applications/finance/fiscal_localizations/chile.rst b/content/applications/finance/fiscal_localizations/chile.rst index c4afc5107d..b89c4aedfa 100644 --- a/content/applications/finance/fiscal_localizations/chile.rst +++ b/content/applications/finance/fiscal_localizations/chile.rst @@ -211,6 +211,11 @@ Certificates` section. Then, click :guilabel:`New` to configure the certificate: :alt: Digital certificate configuration. :align: center +.. warning:: + If the :guilabel:`Certificate Owner` field is set to a specific user, and there are no + certificates shared with users, then the automatic sending of electronic documents and receipt + acknowledgments is **disabled**. + Multicurrency ============= diff --git a/content/applications/finance/fiscal_localizations/colombia.rst b/content/applications/finance/fiscal_localizations/colombia.rst index ec3d0d1408..ae91ba5e64 100644 --- a/content/applications/finance/fiscal_localizations/colombia.rst +++ b/content/applications/finance/fiscal_localizations/colombia.rst @@ -146,21 +146,32 @@ scroll to the :guilabel:`Colombian Electronic Invoicing` section. Then, follow t .. image:: colombia/dian-credentials-configuration.png :alt: Colombian electronic invoicing credentials configured. -#. Configure the |DIAN| environment; the |DIAN| electronic invoicing module offers three different +#. Configure the |DIAN| environment; the |DIAN| electronic invoicing module offers four different |DIAN| environments to connect with: + - **DIAN demo mode**: This environment allows to test electronic invoicing workflows using + a demo digital certificate. Files are created and accepted automatically and are not sent + to any |DIAN| environment. Every internal validation can be tested. To activate it, tick the + :guilabel:`DIAN Demo Mode` checkbox. + + .. note:: + The :guilabel:`DIAN Demo Mode` checkbox is hidden from view when the :guilabel:`Test + environment` checkbox is enabled. + - **Certification environment**: This environment is useful to pass the |DIAN| certification process and obtain the *Enabled* status to invoice from Odoo. To activate it, enable both the :guilabel:`Test environment` and the :guilabel:`Activate the certification process` checkboxes. - - **Testing environment**: This environment allows reproducing electronic invoicing flows and validations in the |DIAN| testing portal. To activate it, enable only the :guilabel:`Test Environment` checkbox. - - - **Production environment**: Activate production databases to generate valid electronic documents. - To activate it, disable both the :guilabel:`Test environment` and the :guilabel:`Activate the + - **Production environment**: This environment allows generating valid electronic documents. To + activate it, disable both the :guilabel:`Test environment` and the :guilabel:`Activate the certification process` checkboxes. + .. important:: + Do not activate :guilabel:`DIAN Demo Mode` on a production database. This mode is intended + for use in test environments only. + .. note:: In a multi-company database, each company can have its own certificate. @@ -278,6 +289,20 @@ is based on the PUC (Plan Unico de Cuentas). .. _localization/colombia/workflows: +Multicurrency +------------- + +The official exchange rate for Colombia is provided by the `Banco de la República +`_. + +To enable automatic exchange rate updates, follow these steps: + +#. Go to :menuselection:`Accounting --> Configuration --> Settings`. +#. Navigate to the :guilabel:`Currencies` section and enable :guilabel:`Automatic Currency Rates`. +#. Ensure that :guilabel:`[CO] Bank of the Republic` is selected as the :guilabel:`Service`. +#. Select an :guilabel:`Interval` for how frequently the currency rate should be automatically + updated. + Main workflows ============== diff --git a/content/applications/finance/fiscal_localizations/denmark.rst b/content/applications/finance/fiscal_localizations/denmark.rst index 31986d2e53..564a34aa22 100644 --- a/content/applications/finance/fiscal_localizations/denmark.rst +++ b/content/applications/finance/fiscal_localizations/denmark.rst @@ -10,6 +10,12 @@ specifically regarding the storage and integrity of financial transactions and r Odoo recognizes the importance of adhering to Danish regulations and has implemented robust measures to ensure clients' data is secure and compliant. +.. important:: + Odoo’s registration as a digital bookkeeping system has been confirmed by the Danish Business + Authority under registration numbers `fob585505` and `fob441967`. Customers must meet certain + conditions to benefit from it, as outlined below. + + Key requirements of the Danish Bookkeeping Act ---------------------------------------------- @@ -19,7 +25,7 @@ The Danish Bookkeeping Act (DBA) outlines the `requirements for digital bookkepi - **Retain transactional data and receipts:** Store all recorded transactions and receipts covered by § 3 for a minimum of five years from the end of the financial year to which they pertain. -- **Ensure data integrity:** Prevent the company from changing, backdating, or deleting recorded transactions. +- **Ensure data integrity:** Prevent the customer from changing, backdating, or deleting recorded transactions. - **Maintain data accessibility:** Store all recorded transactions in a structured and machine-readable format for the required five-year period, regardless of customer relationship status, bankruptcy, or dissolution. @@ -27,11 +33,31 @@ The Danish Bookkeeping Act (DBA) outlines the `requirements for digital bookkepi - **Provide decryption capabilities:** Ensure that encrypted bookkeeping data and receipts can be decrypted into a structured and readable format. -Odoo compliance measures ------------------------- +Odoo Compliance +--------------- + +Odoo's registration as digital standard bookkeeping systems with the Danish Business Authority +confirms that Odoo meets the applicable criteria for digital bookkeeping systems in Denmark, +in accordance with the requirements of the :abbr:`DBA (Danish Bookkeeping Act)`. + +However, to benefit from all the required guarantees for digital bookkeeping systems in Denmark, +customers must meet a few conditions. + +Conditions for full DBA compliance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- The customer uses Odoo Accounting on the Odoo SaaS platform (Odoo Online); +- The customer has an active Odoo subscription (e.g., Standard or Custom Plan), or their database is + managed by an officially registered `Odoo Accounting Firm `_; +- The customer refrains from customizations or actions intended to undermine the system’s immutability, + traceability, or security controls. + +.. note:: + Customers using Odoo products outside these conditions are responsible for ensuring their own + compliance with the DBA. -For companies using Odoo on Odoo Cloud hosting specifically, these requirements are met -through the following features and processes: +When the above conditions are met, the requirements of the DBA are fulfilled through features and +processes described in the following sections. Immutable transaction records ----------------------------- @@ -58,9 +84,9 @@ Continuous data availability Automated data export and secure storage ---------------------------------------- -- Odoo Accounting implements no automatic deletion or archival of recorded transactions, so if a company has +- Odoo Accounting implements no automatic deletion or archival of recorded transactions, so if a customer has been recording transactions for six years, the six years of history are preserved in the Odoo Accounting database. -- As described in the `Odoo SLA `_ and +- As described in the `Odoo Cloud Hosting SLA `_ and `Odoo Privacy Policy `_, the Odoo Cloud relies on immutable daily snapshot backups, which cannot be individually altered or deleted, even at the customer's request, ensuring their integrity. - All documents and receipts stored in a database backup are available as a standard ZIP archive accompanying @@ -73,12 +99,10 @@ Data lifecycle management - Odoo database backups are available in standard SQL dump formats at all times and include all recorded transactions. -- The default Odoo Cloud SLA guarantees three months of backup history to all active customers. As a special guarantee for - Danish companies subject to the :abbr:`DBA (Danish Bookkeeping Act)` and who opt for an Odoo Cloud solution, the backup retention gets increased - to six years as soon as they decide to terminate their Odoo Cloud subscription, in order to comply with the - requirements of Annex 1, 4 of Executive Order 97. -- Companies who are using Odoo products outside of the Odoo Cloud are responsible for implementing their - own compliance with the :abbr:`DBA (Danish Bookkeeping Act)`. +- The `Odoo Cloud Hosting SLA `_ guarantees three months of backup history to all + active customers. As a special guarantee for Danish customers subject to the DBA and meeting the conditions + highlighted above the last Odoo Cloud backup retention gets increased to six years as soon as they decide to + terminate their Odoo Cloud subscription, in order to comply with the requirements of Annex 1, 4 of Executive Order 97. Decryption ---------- diff --git a/content/applications/finance/fiscal_localizations/ecuador.rst b/content/applications/finance/fiscal_localizations/ecuador.rst index 18ffdd5859..9d6575d586 100644 --- a/content/applications/finance/fiscal_localizations/ecuador.rst +++ b/content/applications/finance/fiscal_localizations/ecuador.rst @@ -2,46 +2,39 @@ Ecuador ======= -Introduction -============ +With the Ecuadorian localization, electronic documents can be generated using XML, fiscal +folio, electronic signature, and direct connection to tax authority SRI. -With the Ecuadorian localization you can generate electronic documents with its XML, Fiscal folio, -with electronic signature and direct connection to tax authority SRI. +The supported documents are invoices, credit notes, debit notes, purchase liquidations, and +withholdings. -The supported documents are Invoices, Credit Notes, Debit Notes, Purchase Liquidations and -Withholds. - -The localization also Includes automations to easily predict the withholding tax to be applied to +The localization also includes automation to easily predict the withholding tax to be applied to each purchase invoice. .. seealso:: - `App Tour - Localización de Ecuador `_ - - `Smart Tutorial - Localización de Ecuador `_ + - `Smart Tutorial - Localización de Ecuador + `_ - :doc:`Documentation on e-invoicing's legality and compliance in Ecuador <../accounting/customer_invoices/electronic_invoicing/ecuador>` -Glossary --------- - -Here are some terms that are essential on the Ecuadorian localization: - -- **SRI**: meaning *Servicio de Rentas Internas*, the government organization that enforces pay of - taxes in Ecuador. -- **EDI**: stands for *Electronic Data Interchange*, which refers to the sending of Electronics - Documents. -- **RIMPE**: stands for *Regimen Simplificado para Emprendedores y Negocios*, the type of taxpayer - qualified for SRI. - -Configuration -============= - -.. _l10n_ec/module-installation: - -Modules installation --------------------- +.. tip:: + - **SRI**: *Servicio de Rentas Internas*, the government organization that enforces the payment + of taxes in Ecuador. + - **SRI certificate**: Document or digital credential issued by the *SRI* that is crucial for + compliance with Ecuadorian tax laws. + - **EDI**: *Electronic Data Interchange*, which refers to the electronic transmission of + documents. + - **RIMPE**: *Regimen Simplificado para Emprendedores y Negocios*, the type of taxpayer qualified + for SRI. + +.. _localizations/ecuador/module-installation: + +Modules +======= -:ref:`Install ` the following modules to get all the features of the Ecuadorian -localization: +:doc:`Install ` the following modules to get all the features of +the Ecuadorian localization: .. list-table:: :header-rows: 1 @@ -52,19 +45,18 @@ localization: - Description * - :guilabel:`Ecuadorian - Accounting` - `l10n_ec` - - The default :doc:`fiscal localization package <../fiscal_localizations>`, adds accounting + - The default :doc:`fiscal localization package <../fiscal_localizations>` adds accounting characteristics for the Ecuadorian localization, which represent the minimum configuration required for a company to operate in Ecuador according to the guidelines set by the :abbr:`SRI (servicio de rentas internas)`. The module's installation automatically loads: - Chart of Accounts, taxes, documents types, tax support types. Additionally, the generation of - forms 103 and 104 are automatic. + a chart of accounts, taxes, document types, and tax support types. Additionally, the + generation of forms 103 and 104 is automatic. * - :guilabel:`Ecuadorian Accounting EDI` - `l10n_ec_edi` - Includes all the technical and functional requirements to generate and validate - :doc:`Electronics Documents - <../accounting/customer_invoices/electronic_invoicing>`, based on the Technical - documentation published by the SRI. The authorized documents are: Invoices, Credit Notes, - Debit Notes, Withholdings and Purchase liquidations. + :doc:`Electronics Documents <../accounting/customer_invoices/electronic_invoicing>` based on + the technical documentation published by the SRI. The authorized documents are: Invoices, + Credit Notes, Debit Notes, Withholdings, and Purchase liquidations. * - :guilabel:`Ecuadorian Accounting Reports` - `l10n_ec_reports` - Includes all the technical and functional requirements to generate forms 103 and 104. @@ -80,604 +72,802 @@ localization: - `l10n_ec_edi_pos` - Includes all the technical and functional requirements to generate automatic electronic invoices from a POS sale. + * - :guilabel:`Ecuadorian Delivery Guide` + - `l10n_ec_edi_stock` + - Includes all the technical and functional requirements to generate :ref:`electronic delivery + guides `. .. note:: - When you install a database from scratch selecting `Ecuador` as the country, Odoo automatically - installs the base module :guilabel:`Ecuadorian - Accounting`. + In some cases, such as when upgrading to a version with additional modules, those modules may not + be installed automatically. Any missing modules can be manually + :doc:`installed `. + +.. seealso:: + :doc:`/applications/hr/payroll/payroll_localizations` are documented separately. + +.. _localizations/ecuador/specifics: + +Localization overview +===================== + +The Ecuadorian localization package ensures compliance with Ecuadorian fiscal and accounting +regulations. It includes tools for managing taxes, fiscal positions, reporting, and a predefined +chart of accounts tailored to Ecuador's standards. + +The Ecuadorian localization package provides the following key features to ensure compliance with +local fiscal and accounting regulations: + +- :doc:`../accounting/get_started/chart_of_accounts`: a predefined structure aligned with the latest + standards of Ecuador’s *Superintendency of Companies*, organized into multiple categories and + fully compatible with NIIF accounting +- :ref:`Products ` +- :ref:`Taxes `: pre-configured tax rates, including standard VAT, + zero-rated, and exempt options +- :doc:`../accounting/taxes/fiscal_positions`: automated tax adjustments based on customer or + supplier registration status +- :ref:`Document types `: classification of transactions like + *customer invoices* and *vendor bills* using government-defined document types set by the SRI + (Ecuador’s tax authority) +- :ref:`Company and contacts ` +- :ref:`Electronic documents ` +- :ref:`VAT withholding ` +- :ref:`Printer points ` +- :ref:`Withholding ` +- :ref:`Reporting ` + +.. _localizations/ecuador/products: + +Products +-------- + +If products have any :doc:`withholding taxes <../accounting/taxes/retention>`, they must be +configured on the product form. To do so, go to :menuselection:`Accounting --> Vendors --> +Products`. On the :guilabel:`General Information` tab, specify both :guilabel:`Purchase Taxes` and +:guilabel:`Profit Withhold`. + +.. _localizations/ecuador/taxes: + +Taxes +----- + +To manage taxes, navigate to :menuselection:`Accounting --> Configuration --> Taxes`. Depending on +the tax type, the following options may be required for additional configuration: + +- :guilabel:`Tax Name`: Follows a specific format depending on the tax type: + + - | **For IVA (Value-Added Tax)**: + | `IVA [percent] (104, [form code] [tax support code] [tax support short name])` + | Example: `IVA 12% (104, RUC [tax support code] IVA)` + - | **For Income Tax Withholding codes**: + | `Code ATS [percent of withhold] [withhold name]` + | Example: `Code ATS 10% Retención a la Fuente` + +- :guilabel:`Tax Support`: Configure only for the IVA tax. This option is used to register purchase + withholdings. +- :guilabel:`Code ATS`: Configure only for income tax withholding codes, as it is necessary to + register a withholding. + +In the :guilabel:`Definition` tab: + +- :guilabel:`Tax Grids`: Configure the code of a 104 form if it is an IVA tax, and the code of a + 103 form if it is an income tax withholding code. + +.. seealso:: + :doc:`Configuring taxes <../accounting/taxes>` -.. _l10n_ec/configure-your-company: +.. _localizations/ecuador/document types: -Configure your company ----------------------- +Document types +-------------- + +To access or configure document types, go to :menuselection:`Accounting --> Configuration --> +Document Types`. Each document type can have a unique sequence per journal where it is assigned. As +part of the localization, the document type includes the country where the document is applicable; +also, the data is created automatically when the localization module is installed. The information +required for the document types is included by default and doesn't need to be changed. -To configure your company information, go to the :guilabel:`Contacts` app and search the name given -to your company or activate :ref:`developer mode ` and go to :menuselection:`Company ---> Contact` and then edit the contact to configure the following information: +.. _localizations/ecuador/company-contact: -#. Check the :guilabel:`Company` option on top +Company and contact +------------------- - - :guilabel:`Name` - - :guilabel:`Address` - - :guilabel:`Identification Number` - - :guilabel:`Taxpayer Type` - - :guilabel:`Phone` - - :guilabel:`Email` +.. seealso:: + :doc:`Configure a company or individual contact <../../essentials/contacts>` -#. Upload company logo and save +The following fields should be completed for localization purposes on the contact form: -.. image:: ecuador/ecuador-company.png - :align: center - :alt: Populate company data for Ecuador in Odoo Contacts. +- :guilabel:`Name`: Enter the company or individual's name. +- :guilabel:`Address`: The :guilabel:`Street` sub-field is required to confirm electronic invoices. +- :guilabel:`Identification Number`: For a company, enter the :guilabel:`Ruc`. For individuals, + enter the :guilabel:`Cédula` or :guilabel:`Passport` number. +- :guilabel:`SRI Taxpayer Type`: Select the contact's SRI taxpayer type. +- :guilabel:`Phone`: Enter the company or individual's phone number. +- :guilabel:`Email`: Enter the company or individual's email. This email is used to send electronic + documents, such as invoices. + +.. note:: + The :guilabel:`SRI Taxpayer Type` indicated on the contact form determines which :ref:`VAT and + profit withholding ` taxes apply when using this contact + on a vendor bill. + +.. _localizations/ecuador/electronic-documents: Electronic documents -------------------- -To upload your information for electronic documents go to :menuselection:`Accounting --> -Configuration --> Settings` and search for :command:`Ecuadorian Localization`. +To upload information for electronic documents, go to :menuselection:`Accounting --> Configuration +--> Settings`, and scroll to the :guilabel:`Ecuadorian Localization` section. -Configure the next information: +Configure the following information, starting with the :guilabel:`Electronic Invoicing` section: - :guilabel:`Company legal name` -- :guilabel:`Use production servers`: check the checkbox if your company is going to do electronic - documents in the production environment. If you want to use the testing environment for electronic - documents then keep the checkbox unchecked. -- :guilabel:`Regime`: select if your company is in General Regular or is qualified as RIMPE. -- :guilabel:`Forced to keep accounting books`: check the checkbox if your company has this - condition. -- :guilabel:`Default taxes for withholdings` -- :guilabel:`Issue withholds`: check the checkbox if your company is going to do electronic - withholds. -- :guilabel:`Withhold consumibles`: put the code of the withholding for when you buy goods. -- :guilabel:`Withhold services`: put the code of the withholding for when you buy services. -- :guilabel:`Withhold credit card`: put the code of the withholding for when you buy with credit - card -- :guilabel:`Withhold agent number`: put the company withholding agent resolution number, if - applicable for your company. -- :guilabel:`Electronic Certificate File`: upload electronic certificate and password, then save it. -- :guilabel:`Special tax contributor number`: if your company is qualified as a special taxpayer, - fill out this field with it's corresponding tax contributor number. - -.. image:: ecuador/electronic-signature.png - :align: center - :alt: Electronic signature for Ecuador. +- :guilabel:`Regime`: Select whether the company is in the :guilabel:`Regular Regime (without + additional messages in the RIDE)` or is qualified as in the :guilabel:`RIMPE Regime`. +- :guilabel:`Special Taxpayer Number`: If the company is qualified as a special taxpayer, complete + this field with the company's corresponding tax contributor number. +- :guilabel:`Forced to Keep Accounting Books`: Enable this option if needed. + +:guilabel:`Withholding` section: + +- :guilabel:`Consumables`: Enter the code of the default withholding tax used when purchasing goods. +- :guilabel:`Services`: Enter the code of the default withholding tax used when purchasing services. +- :guilabel:`Credit Card`: Enter the code of the default withholding tax used when purchasing with + credit cards. +- :guilabel:`Withhold Agent Number`: Enter the company's withholding agent resolution number, if + applicable. + +:guilabel:`SRI Connection` section: + +- :guilabel:`Certificate file for SRI`: Select the company's :guilabel:`SRI certificate`. Click + :icon:`oi-arrow-right` :guilabel:`SRI Certificates` to upload one, if necessary. +- :guilabel:`Use production servers`: Enable this option if electronic documents are used in the + production environment; leave it disabled if the testing environment is used instead. + +:guilabel:`Withholding accounts` section: + +- :guilabel:`Sales Tax Base Account`: Enter the company's sales tax base account. +- :guilabel:`Purchase Tax Base Account`: Enter the company's sales tax purchase account. + +.. important:: + When using the testing environment, EDI data is sent to test servers. .. note:: - When configuring the withholdings in the configuration menu, these suggested withholdings are - only for domestic suppliers when no withholdings are setup on their *Taxpayer Type*. Moreover, - the Credit Card withholding set up is always used when a Credit or Debit Card SRI Payment Metho - is used. + - The values entered in the :guilabel:`Consumables` and :guilabel:`Services` withholding fields + are used as default values for domestic **only when** no withholdings are set up on the *SRI + Taxpayer Type*. + - The entered :guilabel:`Credit Card` withholding value is always applied when a credit or debit + card SRI payment method is used. + +.. _localizations/ecuador/vat-withholding: VAT withholding --------------- -This configuration only applies if you are qualified as a *Withholding Agent* by the SRI, otherwise -skip this step. To configure your VAT withholding, go to :menuselection:`Accounting --> Accounting ---> Configuration --> Ecuadorian SRI: Taxpayer Type SRI`. - -You must configure the withholding percentage that applies for each type of taxpayer, specify the -:guilabel:`Goods VAT Withholding` and the :guilabel:`Services VAT Withholding`. +.. note:: + This configuration applies only if the SRI recognizes the company as a withholding agent. If not, + skip this step. -.. image:: ecuador/contributor-type.png - :align: center - :alt: Taxpayer Type configuration for Ecuador. +To configure a VAT withholding, go to :menuselection:`Accounting --> Configuration --> Taxpayer Type +SRI`. Then, configure the :guilabel:`Name` of the taxpayer type, the :guilabel:`Goods VAT +Withholding`, and the :guilabel:`Services VAT Withholding`. .. tip:: - In the case that the :guilabel:`Taxpayer Type` is `RIMPE`, also configure the :guilabel:`Profit - Withholding` percentage. + If the :guilabel:`Taxpayer Type` is :guilabel:`Rimpe`, configure the :guilabel:`Profit Withhold` + percentage. + +.. _localizations/ecuador/printer-points: Printer points -------------- -To configure your printer points, go to :menuselection:`Accounting --> Configuration --> Accounting: -Journals`. +*Printer points* need to be configured for each type of electronic document used, such as customer +invoices, credit notes, and debit notes. -Printer points need to be configured for each type of electronic document that you need. For -example: Customer Invoice, Credit Notes, and Debit Notes +To configure printer points, navigate to :menuselection:`Accounting --> Configuration --> +Journals`. For each electronic document, click :guilabel:`New`, and enter the following information +on the journal form: -For each printer point, you need to configure the following information: +- :guilabel:`Journal Name`: Enter in this format: `[Emission Entity]-[Emission Point] [Document + Type]`, e.g., `001-001 Sales Documents`. +- :guilabel:`Type`: Refers to the journal type; select :guilabel:`Sales`. -- :guilabel:`Journal Name`: in this format `[Emission Entity]-[Emission Point] [Document Type]`, for - example: `001-001 Sales Documents`. -- :guilabel:`Type`: refers to the type of journal, select `Sales`. -- :guilabel:`Use Documents?`: this checkbox is automatically checked, leave it checked. -- :guilabel:`Emission Entity`: configure the establishment number. -- :guilabel:`Emission Point`: configure the printer point. -- :guilabel:`Emission address`: configure the address of the establishment. -- :guilabel:`Default income account`: configure the default income account. -- :guilabel:`Dedicated Credit Note Sequence`: check the checkbox if *Credit Notes* are to be - generated from this printer point - journal. -- :guilabel:`Short Code`: This is the unique code for the sequence of accounting entries, enter a - unique 5-digit code, for example: `VT001` +Once the :guilabel:`Type` is selected, complete the following fields: -Customer Invoice, Credit Notes and Debit Notes need to use the same journal as the -:guilabel:`Emission Point`, and the :guilabel:`Entity Point` should be unique per journal. +- :guilabel:`Use Documents?`: Enable this option if legal invoicing (invoices, debit/credit notes) + is used, as this is the standard configuration. If not, select the option to record accounting + entries unrelated to legal invoicing documents, such as receipts, tax payments, or journal + entries. +- :guilabel:`Emission Entity`: Enter the facility number. +- :guilabel:`Emission Point`: Enter the printer point. +- :guilabel:`Emission address`: Enter the address of the facility. -.. image:: ecuador/printer-point.png - :align: center - :alt: Configuring a printer point for Ecuador electronic document type of Customer Invoices. +In the :guilabel:`Journal Entries` tab, under the :guilabel:`Accounting information` section, fill +in the following fields: -.. note:: - In the :guilabel:`Advanced Settings` tab, check the :guilabel:`Electronic Invoicing` checkbox to - enable it for Ecuador. +- :guilabel:`Default Income Account`: Enter the default income account. +- :guilabel:`Dedicated Credit Note Sequence`: Enable this option if *credit notes* should be + generated from this printer point (i.e., the journal). +- :guilabel:`Dedicated Debit Note Sequence`: Enable this option if *debit notes* should be + generated from this printer point (i.e., the journal). +- :guilabel:`Short Code`: Enter a unique 5-digit code for the accounting entry sequence (e.g., + VT001). + +Customer invoices, credit notes, and debit notes must use the same journal as the +:guilabel:`Emission Point`, whereas the :guilabel:`Entity Point` should be unique per journal. + +Finally, in the :guilabel:`Advanced Settings` tab, check the :guilabel:`Electronic invoicing` +checkbox to enable sending XML/EDI invoices. .. seealso:: :doc:`../accounting/customer_invoices/electronic_invoicing` +.. _localizations/ecuador/withholding: + Withholding ----------- -A Withholding Journal must be defined, go to go to :menuselection:`Accounting --> Configuration --> -Accounting: Journals` where you need to configure the following information: - -- :guilabel:`Journal Name`: in this format `[Emission Entity]-[Emission Point] [Document Type]`, for - example: `001-001 Withholding`. -- :guilabel:`Type`: refers to the type of journal, select `Miscellaneous`. -- :guilabel:`Withhold Type`: Configure Purchase Withholding. -- :guilabel:`Use Documents?`: this checkbox is automatically checked, leave it checked. -- :guilabel:`Emission Entity`: configure the establishment number. -- :guilabel:`Emission Point`: configure the printer point. -- :guilabel:`Emission address`: configure the address of the establishment. -- :guilabel:`Default account`: configure the default income account. -- :guilabel:`Short Code`: This is the unique code for the sequence of accounting entries, enter a - unique 5-digit code, for example: `RT001` - -.. image:: ecuador/withhold.png - :align: center - :alt: Configuring withholding for Ecuador electronic document type of Withholding. +To define a *withholding journal*, go to :menuselection:`Accounting --> Configuration --> Journals`. +For each withholding journal, click :guilabel:`New`, and enter the following information: -.. note:: - In the :guilabel:`Advanced Settings` tab, check the :guilabel:`Electronic Invoicing` checkbox to - enable the sending of electronic invoicing for the withholding. +- :guilabel:`Journal Name`: Enter this format: `[Emission Entity]-[Emission Point] [Document Type]`, + e.g.,`001-001 Withholding`. +- :guilabel:`Type`: Refers to the journal type. Select :guilabel:`Miscellaneous`. +- :guilabel:`Withhold Type`: Select :guilabel:`Purchase Withhold`. -Purchase Liquidations ---------------------- +Once the :guilabel:`Type` and :guilabel:`Withhold Type` are selected, complete the following fields: -When using Purchase Liquidations, a specific journal must be created, go to -:menuselection:`Accounting --> Configuration --> Accounting: Journals` and configure the following -information: - -- :guilabel:`Journal Name`: in this format `[Emission Entity]-[Emission Point] [Document Type]`, for - example: `001-001 Withhold`. -- :guilabel:`Type`: refers to the type of journal, select `Miscellaneous`. -- :guilabel:`Purchase Liquidations`: check the checkbox to enable purchase liquidations. -- :guilabel:`Use Documents?`: this checkbox is automatically checked, leave it checked. -- :guilabel:`Emission Entity`: configure the establishment number. -- :guilabel:`Emission Point`: configure the printer point. -- :guilabel:`Emission address`: configure the address of the establishment. -- :guilabel:`Short Code`: This is the unique code for the sequence of accounting entries, enter a - unique 5-digit code, for example: `RT001` - -.. image:: ecuador/purchase-liqudations.png - :align: center - :alt: Configuring purchase liquidations for Ecuador electronic document type of Withholding. +- :guilabel:`Emission Entity`: Enter the facility number. +- :guilabel:`Emission Point`: Enter the printer point. +- :guilabel:`Emission address`: Enter the address of the facility. -.. note:: - In the :guilabel:`Advanced Settings` tab, check the :guilabel:`Electronic Invoicing` checkbox to - enable the sending of electronic invoicing for the withholding. +In the :guilabel:`Journal Entries` tab, under the :guilabel:`Accounting information` section, fill +in the following fields: -Configure master data ---------------------- +- :guilabel:`Default Account`: Configure the default income account. +- :guilabel:`Short Code`: Enter a unique 5-digit code for the accounting entry sequence (e.g., + `WT001`). -Chart of accounts -~~~~~~~~~~~~~~~~~ +Finally, in the :guilabel:`Advanced Settings` tab, check the :guilabel:`Electronic invoicing` +checkbox to enable sending XML/EDI invoices. -The :doc:`chart of accounts <../accounting/get_started/chart_of_accounts>` -is installed by default as part of the set of data included in the localization module, the accounts -are mapped automatically in Taxes, Default Account Payable, Default Account Receivable. +.. _localizations/ecuador/reporting: -The chart of accounts for Ecuador is based on the most updated version of Superintendency of -Companies, which is grouped in several categories and is compatible with NIIF accounting. +Reporting +--------- -You can add or delete accounts according to the company's needs. +Ecuadorian companies submit fiscal reports to the SRI, with Odoo supporting two main ones: **reports +103** and **104**. -Products -~~~~~~~~ +To get these reports, go to :menuselection:`Accounting --> Reporting --> Tax Return`. Click the +:icon:`fa-book` :guilabel:`Report:` icon and select `103 (EC)` or `104 (EC)`. -In addition to the basic information in your products, you must add the configuration of the -withholding code (tax) that applies. +.. _localizations/ecuador/report-103: -Go to :menuselection:`Accounting --> Vendors: Products` under the tab "Purchase" +Report 103 +~~~~~~~~~~ -.. image:: ecuador/products.png - :align: center - :alt: Product for Ecuador. +This report details income tax withholdings in a given period and can be reported monthly or +semi-annually. It includes information about base, tax amounts, and tax codes and can be used for +SRI reporting. -Contacts -~~~~~~~~ +.. _localizations/ecuador/report-104: -Configure the next information when you create a contact: +Report 104 +~~~~~~~~~~ -- Check the :guilabel:`Company` option on top if it is a contact with RUC, or check - :guilabel:`Individual` if it is a contact with cedula or passport. -- :guilabel:`Name` -- :guilabel:`Address`: :guilabel:`Street` is a required field to confirm the Electronic Invoice. -- :guilabel:`Identification Number`: select an identification type `RUC`, `Cedula`, or `Passport`. -- :guilabel:`Taxpayer Type`: select the contact's SRI Taxpayer Type. -- :guilabel:`Phone` -- :guilabel:`Email` +This report details VAT tax and VAT withholding for a given period and can be generated monthly or +semi-annually. It includes information about base, tax amounts, and tax codes and can be used for +SRI reporting. -.. image:: ecuador/contacts.png - :align: center - :alt: Contacts for Ecuador. +.. _localizations/ecuador/ats: + +ATS report +~~~~~~~~~~ + +To enable downloading the ATS :abbr:`ATS (Anexo Transaccional Simplificado)` report in XML format, +:doc:`install ` the *ATS Report* (`l10n_ec_reports_ats`) module. .. note:: - The :guilabel:`SRI Taxpayer Type` has inside the configuration of which VAT and Profit - withholding will apply when you use this contact on Vendor Bill, and then create a withholding - from there. + The Ecuadorian *ATS Report* module depends on the previous installation of the *Accounting* app + and the *Ecuadorian EDI module*. -Review your taxes -~~~~~~~~~~~~~~~~~ +.. _localizations/ecuador/ats-configuration: -As part of the localization module, taxes are automatically created with its configuration and -related financial accounts. +Configuration +************* -.. image:: ecuador/taxes.png - :align: center - :alt: Taxes for Ecuador. +To issue electronic documents, ensure the company is configured as explained in the +:ref:`electronic invoice ` section. In the :abbr:`ATS (Anexo +Transaccional Simplificado)`, every document generated in Odoo, such as :ref:`invoices +`, :ref:`vendor bills `, +:ref:`sales ` and :ref:`purchases withholdings +`, :ref:`credit notes +`, and :ref:`debit notes `, +is included. -The following options have been automatically configured: +.. _localizations/ecuador/ats-vendor-bills: -- :guilabel:`Tax Support`: to be configured only in the IVA tax, this option is useful when you - register purchase withholdings. -- :guilabel:`Code ATS`: to be configured only for income tax withholding codes, it is important when - you register the withholding. -- :guilabel:`Tax Grids`: configure the codes of 104 form if it is a IVA tax and configure the codes - of 103 form if it is a income tax withholding code. -- :guilabel:`Tax Name`: +Vendor bills +^^^^^^^^^^^^ - - For IVA tax, format the name as: `IVA [percent] (104, [form code] [tax support code] [tax - support short name])` - - For income tax withholding code, format the name as: `Code ATS [Percent of withhold] [withhold - name]` +When generating a :ref:`vendor bill `, register the authorization +number from the vendor's invoice. To do so, go to :menuselection:`Accounting --> Vendors --> Bills` +and select the bill. Then, enter the number from the vendor's invoice in the +:guilabel:`Authorization Number` field. -Once the Ecuador module is installed, the most common taxes are automatically configured. If you -need to create an additional one, you can do so, for which you must base yourself on the -configuration of the existing taxes. +.. _localizations/ecuador/ats-credit-debit-notes: -.. image:: ecuador/taxes-with-tax-support.png - :align: center - :alt: Taxes with tax support for Ecuador. +Credit and debit notes +^^^^^^^^^^^^^^^^^^^^^^ -Review your Document Types -~~~~~~~~~~~~~~~~~~~~~~~~~~ +When creating a :ref:`credit ` or :ref:`debit +` note manually or through an import, link it to the sales +invoice it modifies. -Some accounting transactions like *Customer Invoices* and *Vendor Bills* are classified by document -types. These are defined by the government fiscal authorities, in this case by the SRI. +.. note:: + Some information is required to the documents before downloading the :abbr:`ATS (Anexo + Transaccional Simplificado)` file. For example, add the *Authorization Number* and the *SRI + Payment Method* to documents when needed. -Each document type can have a unique sequence per journal where it is assigned. As part of the -localization, the document type includes the country on which the document is applicable; also the -data is created automatically when the localization module is installed. +.. _localizations/ecuador/ats-xml-generation: -The information required for the document types is included by default so the user does not need to -fill anything there. +XML generation +************** -.. image:: ecuador/document-types.png - :align: center - :alt: Document types for Ecuador. +To generate the :abbr:`ATS (Anexo Transaccional Simplificado)` report, go to +:menuselection:`Accounting --> Reporting --> Tax Return`. Choose a period for the desired :abbr:`ATS +(Anexo Transaccional Simplificado)` report, then click :guilabel:`ATS`. Then, upload the downloaded +XML file to *DIMM Formularios*. -Workflows -========= +.. note:: + When downloading the :abbr:`ATS (Anexo Transaccional Simplificado)` report, Odoo generates a + warning pop-up alerting the user if a document(s) has missing or incorrect data. Nevertheless, + the XML file can still be downloaded. + +.. _localizations/ecuador/accounting: + +Accounting +========== -Once you have configured your database, you can register your documents. +.. _localizations/ecuador/sales-documents: Sales documents --------------- -Customer invoices -~~~~~~~~~~~~~~~~~ +.. _localizations/ecuador/customer-invoice: -:guilabel:`Customer invoices` are electronic documents that, when validated, are sent to SRI. These -documents can be created from your sales order or manually. They must contain the following data: +Customer invoice +~~~~~~~~~~~~~~~~ -- :guilabel:`Customer`: type the customer's information. -- :guilabel:`Journal`: select the option that matches the printer point for the customer invoice. -- :guilabel:`Document Type`: type document type in this format `(01) Invoice`. -- :guilabel:`Payment Method (SRI)`: select how the invoice is going to be paid. -- :guilabel:`Products`: specify the product with the correct taxes. +Customer invoices, electronic documents :doc:`created from sales orders or manually +<../accounting/customer_invoices/overview>`, must contain the following data and, once validated, +are sent to the SRI: -.. image:: ecuador/customer-invoice.png - :align: center - :alt: Customer invoice for Ecuador. +- :guilabel:`Journal`: Select the option matching the customer invoice's printer point. +- :guilabel:`Document Type`: Type the document type in this format: `(01) Invoice`. +- :guilabel:`Payment Method (SRI)`: Select how the invoice will be paid. + +.. _localizations/ecuador/credit-notes: Customer credit note ~~~~~~~~~~~~~~~~~~~~ -The :doc:`Customer credit note <../accounting/customer_invoices/credit_notes>` is an -electronic document that, when validated, is sent to SRI. It is necessary to have a validated -(posted) invoice in order to register a credit note. On the invoice there is a button named -:guilabel:`Credit note`, click on this button to be directed to the :guilabel:`Create credit note` -form, then complete the following information: - -- :guilabel:`Credit Method`: select the type of credit method. - - - :guilabel:`Partial Refund`: use this option when you need to type the first number of documents - and if it is a partial credit note. - - :guilabel:`Full Refund`: use this option if the credit note is for the total invoice and you - need the credit note to be auto-validated and reconciled with the invoice. - - :guilabel:`Full refund and new draft invoice`: use this option if the credit note is for the - total invoice and you need the credit note to be auto-validated and reconciled with the invoice, - and auto-create a new draft invoice. +:doc:`Customer credit notes <../accounting/customer_invoices/credit_notes>` are electronic +documents sent to the SRI once validated. :ref:`Credit notes +` can only be registered from a validated (posted) +invoice. -- :guilabel:`Reason`: type the reason for the credit note. -- :guilabel:`Rollback Date`: select the :guilabel:`specific` options. -- :guilabel:`Reversal Date`: type the date. -- :guilabel:`Use Specific Journal`: select the printer point for your credit note, or leave it empty - if you want to use the same journal as the original invoice. +Keep the :guilabel:`Document Type` on :guilabel:`(04) Credit Note` in the :guilabel:`Credit note` +window. -Once reviewed, you can click on the :guilabel:`Reverse` button. +Filling out a credit note follows the same process as completing an :ref:`invoice +`. -.. image:: ecuador/add-customer-credit-note.png - :align: center - :alt: Add Customer Credit Note for Ecuador. - -When the :guilabel:`Partial Refund` option is used, you can change the amount of the credit note and -then validate it. Before validating the credit note, review the following information: - -- :guilabel:`Customer`: type the customer's information. -- :guilabel:`Journal`: select the printer point for the customer Credit Note. -- :guilabel:`Document Type`: this is the document type `(04) Credit Note`. -- :guilabel:`Products`: It must specify the product with the correct taxes. +.. note:: + When creating the first credit note, select :guilabel:`Reverse` and assign the first credit note + number or, by default, Odoo assigns `NotCr 001-001-000000001` as the first credit note number. -.. image:: ecuador/customer-credit-note.png - :align: center - :alt: Customer Credit Note for Ecuador. +.. _localizations/ecuador/debit-notes: Customer debit note ~~~~~~~~~~~~~~~~~~~ -The :guilabel:`Customer debit note` is an electronic document that, when validated, is sent to SRI. -It is necessary to have a validated (posted) invoice in order to register a debit note. On the -invoice there is a button named :guilabel:`Debit Note`, click on this button to be directed to the -:guilabel:`Create debit note` form, then complete the following information: +:ref:`Customer debit notes ` are electronic documents sent +to the SRI once validated. They can only be registered from a validated (posted) invoice. -- :guilabel:`Reason`: type the reason for the debit note. -- :guilabel:`Debit note date`: select the :guilabel:`specific` options. -- :guilabel:`Copy lines`: select this option if you need to register a debit note with the same - lines of invoice. -- :guilabel:`Use Specific Journal`: select the printer point for your credit note, or leave it empty - if you want to use the same journal as the original invoice. +In the :guilabel:`Use Specific Journal` of the :guilabel:`Create Debit Note` window, select the +printer point for the credit note or leave it empty to use the same journal as the original +invoice. -Once reviewed you can click on the :guilabel:`Create Debit Note` button. - -.. image:: ecuador/add-customer-debit-note.png - :align: center - :alt: Add Customer Debit Note for Ecuador. - -You can change the debit note amount, and then validate it. Before validating the debit note, review -the following information: - -- :guilabel:`Customer`: type the customer's information. -- :guilabel:`Journal`: select the printer point for the customer Credit Note. -- :guilabel:`Document Type`: this is the document type `(05) Debit Note`. -- :guilabel:`Products`: It must specify the product with the correct taxes. - -.. image:: ecuador/customer-debit-note.png - :align: center - :alt: Customer Debit Note for Ecuador. +.. _localizations/ecuador/customer-withholdings: Customer withholding ~~~~~~~~~~~~~~~~~~~~ -The :guilabel:`Customer withholding` is a non-electronic document for your company, this document is -issued by the client in order to apply a withholding to the sale. +:guilabel:`Customer withholdings` are non-electronic documents issued by the client to apply a +withholding to a sale. They can only be registered from a validated (posted) invoice. -It is necessary to have a validated (posted) invoice in order to register a customer withholding. On -the invoice there is a button named :guilabel:`Add Withhold`, click on this button to be directed -to the :guilabel:`Customer withholding` form, then complete the following information: +On the invoice, click :guilabel:`Add Withhold` and complete the following information in the +:guilabel:`Customer withholding` window: -- :guilabel:`Document Number`: type the withholding number. -- :guilabel:`Withhold Lines`: select the taxes that the customer is withholding. +- :guilabel:`Document Number`: Enter the withholding number. +- :guilabel:`Withhold Lines`: Select the taxes that the customer is withholding. Before validating the withholding, review that the amounts for each tax are the same as the original document. -.. image:: ecuador/customer-withhold.png - :align: center - :alt: Customer withhold for Ecuador. +.. _localizations/ecuador/purchase-documents: -Purchase Documents +Purchase documents ------------------ +.. _localizations/ecuador/vendor-bill: + Vendor bill ~~~~~~~~~~~ -The :guilabel:`Vendor bill` is a non-electronic document for your company, this document is issued -by your vendor when your company generates a purchase. +:doc:`Vendor bills <../accounting/vendor_bills>`, non-electronic documents created from purchase +orders or manually, require a specific :ref:`vendor bill journal +`. + +.. _localizations/ecuador/vendor-bills-journal: + +Vendor bills journal +******************** -The bills can be created from the purchase order or manually, it must contain the following -information: +Use the following configuration to set up the vendor bills journal: -- :guilabel:`Vendor`: type the vendor's information. -- :guilabel:`Bill Date`: select the date of invoice. -- :guilabel:`Journal`: it is the journal for vendor bills. -- :guilabel:`Document Type`: this is the document type `(01) Invoice` -- :guilabel:`Document number`: type the document number. -- :guilabel:`Payment Method (SRI)`: select how the invoice is going to be paid. -- :guilabel:`Products`: specify the product with the correct taxes. +- Select :guilabel:`Purchase` as the :guilabel:`Type`. +- **Do not** tick the :guilabel:`Purchase Liquidations` checkbox. +- Add a :guilabel:`Default Expense Account`. -.. image:: ecuador/purchase-invoice.png - :align: center - :alt: Purchases for Ecuador. +To configure a vendor bill, make sure also to complete the following Ecuador-specific fields: + +- :guilabel:`Document Type`: Enter this document type: `(01) Invoice`. +- :guilabel:`Document number`: Enter the document number. +- :guilabel:`Payment Method (SRI)`: Select how to pay the vendor bill. .. important:: - When creating the purchase withholding, verify that the bases (base amounts) are correct. If you - need to edit the amount of the tax in the :guilabel:`Vendor bill`, click the :guilabel:`Edit` - button. Otherwise, from the :guilabel:`Journal Items` tab click the :guilabel:`Edit` button and - set the adjustment to go where you want. + When creating the purchase withholding, verify that the bases (base amounts) are correct. If the + amount of the tax in the :guilabel:`Vendor bill` needs to be edited, click :guilabel:`Edit`. Or, + from the :guilabel:`Journal Items` tab, click :guilabel:`Edit` and set the adjustment as desired. + +.. _localizations/ecuador/purchase-liquidation: Purchase liquidation ~~~~~~~~~~~~~~~~~~~~ -The :guilabel:`Purchase liquidation` is an electronic document that, when validated, is sent to SRI. +*Purchase liquidations* are electronic documents sent to the SRI once they're validated. Companies +issue them when they make a purchase, but the vendor does not provide an invoice due to one or more +of the following reasons: + +- Non-residents of Ecuador provided services. +- Foreign companies provided services without residency or facility in Ecuador. +- Purchase of goods or services from natural persons not registered with a RUC, who cannot issue + sales receipts or customer invoices. +- Reimbursement for purchasing goods or services must be given to employees in a dependency + relationship (full-time employee). +- Members of collegiate bodies have provided services in the exercise of their function. + +In these cases, a :ref:`purchase liquidation journal +` must be created. + +.. _localizations/ecuador/purchase-liquidation-journal: + +Create a purchase liquidation journal +************************************* + +To create a *purchase liquidations* journal, enter the following information: + +- :guilabel:`Journal Name`: Enter this format: `[Emission Entity]-[Emission Point] [Document Type]`, + e.g., `001-001 Purchase Liquidations`. +- :guilabel:`Type`: Refers to the journal type. Select :guilabel:`Purchase`. + +Once the :guilabel:`Type` is selected, complete the following fields: -Companies issue this type of electronic document when they purchase, and the vendor does not issue -an invoice due to one or more of the following cases: +- :guilabel:`Purchase Liquidations`: Tick this checkbox to enable purchase liquidations. +- :guilabel:`Use Documents?`: Enable this option if legal invoicing (invoices, debit/credit notes) + is used, as this is the standard configuration. If not, select the option to record accounting + entries unrelated to legal invoicing documents, such as receipts, tax payments, or journal + entries. +- :guilabel:`Emission Entity`: Enter the facility number. +- :guilabel:`Emission Point`: Enter the printer point. +- :guilabel:`Emission address`: Enter the address of the facility. +- :guilabel:`Short Code`: Enter a unique 5-digit code for the accounting entry sequence (e.g., + `PT001`). -- Services were provided by non-residents of Ecuador. -- Services provided by foreign companies without residency or establishment in Ecuador. -- Purchase of goods or services from natural persons not registered with a RUC, who due to their - cultural level or hardiness are not able to issue sales receipts or customer invoices. -- Reimbursement for the purchase of goods or services to employees in a dependency relationship - (full-time employee). -- Services provided by members of collegiate bodies for the exercise of their function. +Finally, in the :guilabel:`Advanced Settings` tab, check the :guilabel:`Electronic invoicing` +checkbox to enable sending XML/EDI invoices. -These types of electronic documents can be created from the :guilabel:`Purchase Order` or manually -from the :guilabel:`Vendor Bills` form view. It must contain the following data: +.. _localizations/ecuador/purchase-liquidation-creation: -- :guilabel:`Vendor`: type the vendor's information. -- :guilabel:`Journal`: select the journal for the :guilabel:`Purchase Liquidation` with the correct - printer point. -- :guilabel:`Document Type`: this is the document type `(03) Purchase Liquidation` -- :guilabel:`Document number`: type the document number (sequence), you will only have to do this - once, then the sequence will be automatically assigned for the next documents. -- :guilabel:`Payment Method (SRI)`: select how the invoice is going to be paid. -- :guilabel:`Products`: specify the product with the correct taxes. +Create a purchase liquidation +***************************** -Once you review the information you can validate the :guilabel:`Purchase Liquidation`. +Purchase liquidations, created from *purchase orders* or manually from *vendor bills*, must contain +the following data: -.. image:: ecuador/purchase-liquidation.png - :align: center - :alt: Purchase liquidation for Ecuador. +- :guilabel:`Vendor`: Enter the vendor's information. +- :guilabel:`Journal`: Select the :guilabel:`Purchase Liquidation` journal with the correct printer + point. +- :guilabel:`Document Type`: Enter this document type: `(03) Purchase Liquidation`. +- :guilabel:`Document number`: Enter the document number (sequence). This must only be entered once, + and the sequence will automatically be assigned to the subsequent documents. +- :guilabel:`Payment Method (SRI)`: Select how to pay the invoice. +- :guilabel:`Products`: Specify the product with the correct taxes. + +Then, validate the :guilabel:`Purchase Liquidation`. + +.. _localizations/ecuador/purchase-withholding: Purchase withholding ~~~~~~~~~~~~~~~~~~~~ -The :guilabel:`Purchase withholding` is an electronic document that, when validated, is sent to SRI. +*Purchase withholdings* are electronic documents sent to the SRI once they're validated. They can +only be registered from a validated (posted) invoice. -It is necessary to have an invoice in a validated state in order to register a :guilabel:`Purchase -withholding`. On the invoice, there is a button named :guilabel:`Add Withhold`, click on this button -to be directed to the :guilabel:`Withholding` form, then complete the following information: +On the invoice, click :guilabel:`Add Withhold` and complete the following fields in the +:guilabel:`Withhold` window: -- :guilabel:`Document number`: type the document number (sequence), you will only have to do this - once, then the sequence will be automatically assigned for the next documents. +- :guilabel:`Document number`: Enter the document number (sequence). This must only be entered once, + and the sequence will automatically be assigned for the next documents. - :guilabel:`Withhold lines`: The taxes appear automatically according to the configuration of - products and vendors, you should review if the taxes and tax support are correct, and, if it is - not correct, you can edit and select the correct taxes and tax support. - -Once you review the information you can validate the :guilabel:`Withholding`. + products and vendors. Review if the taxes and tax support are correct. If not, edit and select + the correct taxes and tax support. -.. image:: ecuador/purchase-withhold.png - :align: center - :alt: Purchase withhold for Ecuador. +Then, validate the :guilabel:`Withholding`. .. note:: - You can't change the tax support for one that was not included in the configuration of the taxes - used on the :guilabel:`Vendor Bill`. To do so, go to the tax applied on the :guilabel:`Vendor - Bill` and change the :guilabel:`Tax Support` there. + Tax support types must be configured on the :guilabel:`Vendor Bill`. To do so, go to the tax + applied on the :guilabel:`Vendor Bill` and change the :guilabel:`Tax Support` there. -A withholding tax can be divided into two or more lines, this will depend on whether two or more -withholdings percentages apply. +A withholding tax can be divided into two or more lines, depending on whether two or more +withholding percentages apply. .. example:: - The system suggests a VAT withholding of 30% with tax support 01, you can add your VAT - withholding of 70% in a new line with the same tax support, the system will allow you as long as - the total of the bases matches the total from the :guilabel:`Vendor Bill`. + Odoo suggests a VAT withholding of 30% with tax support 01. VAT withholding of 70% can be added + to a new line with the same tax support. Odoo allows it if the base total matches the + :guilabel:`Vendor Bill`'s total. -eCommerce ---------- +.. _localizations/ecuador/expense reimbursement: + +Expense reimbursement +--------------------- -The :ref:`ATS Report module ` enables the following: +Expense reimbursements apply to the following cases: -- Choose the SRI Payment Method in each payment method's configuration. -- Customers can manually input their identification type and identification number during the - eCommerce checkout process. -- Automatically generate a valid electronic invoice for Ecuador at the end of the checkout process. +- :guilabel:`Individual`: reimbursement to an employee for miscellaneous expenses (e.g., purchase + liquidations) +- :guilabel:`Legal Entity`: reimbursement for incurred expenses, such as representation expenses + (e.g., hiring a lawyer) -Configuration -~~~~~~~~~~~~~ +To enable expense reimbursement, make sure a :ref:`purchase liquidation journal +` has been created for an individual or a :ref:`vendor +bills journal ` for a legal entity. -Website -******* +.. note:: + In the vendor bills journal, be sure the following necessary configurations are set for a legal + entity: -To generate an invoice after the checkout process, navigate to :menuselection:`Website --> -Configuration --> Settings` and activate the :guilabel:`Automatic Invoice` option found under the -:guilabel:`Invoicing` section. + - Select :guilabel:`Purchase` as the :guilabel:`Type`. + - **Do not** tick the :guilabel:`Purchase Liquidations` checkbox. + - Add a :guilabel:`Default Expense Account`. -.. tip:: - The invoice's email template can be modified from the :guilabel:`Invoice Email Template` field - under the :guilabel:`Automatic Invoice` option. +Next, to create a reimbursement, :ref:`create a vendor bill ` +using the *purchase liquidation* or *vendor bills* journal. On the vendor bill, configure the +following fields: + +- :guilabel:`Vendor`: This field should be an employee. +- :guilabel:`Document Type`: Verify that this field is accurately populated from the journal. +- :guilabel:`Payment Method (SRI)`: Select a payment method. +- :guilabel:`Reimbursement Lines` tab: Click :guilabel:`Auto Fill Invoice Lines` to automatically + populate the invoice lines or add the expenses line by line, and provide the following details for + each expense: + + - :guilabel:`Partner or authorization number` + - :guilabel:`Date` + - :guilabel:`Document Type` + - :guilabel:`Document Number` + - :guilabel:`Tax Base` + - :guilabel:`Tax` + +Then, click :guilabel:`Confirm Vendor Bill` and :guilabel:`Process Now`. The XML and authorization +number for the purchase liquidation are recorded, and the purchase withholding created from this +vendor bill includes the reimbursement information. + +.. image:: ecuador/l10n-ec-individual-flow.png + :alt: Expense Reimbursement. + +.. _localizations/ecuador/electronic-delivery-guide: + +Electronic delivery guide +------------------------- + +An *Electronic Delivery Guide* in Ecuador is a legal document that supports the transportation of +goods or merchandise from one place to another within the national territory. It is issued by the +sender of the goods and aims to record and justify the movement of products to avoid legal or tax +issues. It is a fiscal requirement mandated by the *Internal Revenue Service (SRI)*. .. important:: - The sales journal used for invoicing is the first in the sequence of priority in the - :guilabel:`Journal` menu. + Make sure to :doc:`install ` the :guilabel:`Ecuadorian + Delivery Guide` (`l10n_ec_edi_stock`) module. + +.. _localizations/ecuador/transporter: + +Transporter +~~~~~~~~~~~ + +To create a new carrier (transporter), first :doc:`create a new contact <../../essentials/contacts>` +and fill out the contact information as a :guilabel:`Company`. Make sure the following fields are +complete: + +- :guilabel:`Identification Number`: Select :guilabel:`RUC` and type the carrier's RUC number. +- :guilabel:`SRI Taxpayer Type`: Select :guilabel:`Companies - Legal Entities` as the partner + position in the tax pyramid to automate the computation of VAT withholdings. + +.. image:: ecuador/l10n-ec-carrier-contact.png + :alt: Configuration of a carrier contact. + +.. _localizations/ecuador/certificate-file: + +Certificate file for SRI +~~~~~~~~~~~~~~~~~~~~~~~~ + +To upload the certificate file for SRI, go to :menuselection:`Accounting --> Configuration --> +Settings`, scroll to the :guilabel:`Ecuadorian Localization` section, and click +:icon:`oi-arrow-right` :guilabel:`SRI Certificates` in the :guilabel:`SRI Connection` section. Then, +to create a new certificate, click :guilabel:`New` and fill out the following fields: + +- :guilabel:`Name`: The title of the certificate. +- :guilabel:`Certificate`: Use the :guilabel:`Upload your file` button to upload the SRI + certificate. +- :guilabel:`Certificate Password`: Include the password to decrypt the PKS file if required. + +Once the certificate is created, click :guilabel:`Settings` to go back to the settings and ensure +the certificate is selected in the :guilabel:`Certificate file for SRI` field and the :guilabel:`Use +production servers` checkbox is ticked. + +.. _localizations/ecuador/warehouse configuration: + +Warehouse configuration +~~~~~~~~~~~~~~~~~~~~~~~ + +To configure a warehouse, first :doc:`create a new warehouse +<../../inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses>`. Enter the +following data for each warehouse that generates an electronic delivery guide: + +- :guilabel:`Entity Point`: the emission entity number given by the SRI +- :guilabel:`Emission Point`: the emission point number given by the SRI +- :guilabel:`Next Delivery Guide Number`: the forwarding tracking number (editable after first + saving the warehouse). -Payment providers -***************** +.. _localizations/ecuador/generate-electronic-delivery: -To activate the payment providers that should be used to capture eCommerce payments, navigate to -:menuselection:`Website --> Configuration --> Payment Providers` section and then click on the -:guilabel:`View other providers` button under the :guilabel:`Activate Payments` heading. From here, -each payment provider can be configured by selecting a provider record. Refer to the :doc:`payment -provider <../payment_providers>` documentation for more information. +Generate an electronic delivery guide +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Payment methods -^^^^^^^^^^^^^^^ +Once the :doc:`delivery <../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration>` +from inventory is created during the sales workflow, make sure the following fields are complete in +the :guilabel:`Delivery Guide` section on the :guilabel:`Additional info` tab: -To activate one or more payment methods for a payment provider, click :guilabel:`→ Enable Payment -Methods` within the :guilabel:`Configuration` tab of each provider. +- :guilabel:`Transporter`: Enter the :ref:`contact ` created. +- :guilabel:`Plate Number`: Enter the vehicle plate number. +- :guilabel:`Transfer Reason`: By default, :guilabel:`Goods dispatch` is set; modify as needed. +- :guilabel:`Start date`: Automatically set to the creation date (editable). +- :guilabel:`End date`: Automatically set to 15 days after the start date (editable). -When configuring the payment method, it is **mandatory** to set the :guilabel:`SRI Payment Method` -for each method. This field appears after you create and save the payment method for the first -time. +.. image:: ecuador/l10n-ec-delivery-guide-settings.png + :alt: Delivery Guide Settings. + +Click :guilabel:`Validate`, then :guilabel:`Generate Delivery Guide`. Subsequently, the following +information will be available in the :guilabel:`Delivery Guide` section: + +- :guilabel:`Authorization date`: date on which the government authorizes the document. +- :guilabel:`Authorization number`: EDI authorization number (same as access key). +- :guilabel:`Delivery Guide Status`: status of the delivery guide. + +.. image:: ecuador/l10n-ec-authorization-number.png + :alt: Authorization number. + +To receive the XML and PDF, an email can be sent to the contact used in the :guilabel:`Delivery +Address` field - this is an optional and manual step; the :guilabel:`Send Email` button needs to be +clicked. + +.. image:: ecuador/l10n-ec-delivery-guide-pdf.png + :alt: Delivery Guide PDF. + +.. _localizations/ecuador/ecommerce: + +eCommerce +========= + +The :ref:`ATS Report module ` enables the following: + +- Choose the *SRI Payment Method* for each payment method's configuration. +- Customers can manually input their identification type and number during eCommerce checkout. +- Automatically generate a valid electronic invoice for Ecuador at the end of the checkout process. + +.. seealso:: + :doc:`eCommerce documentation <../../websites/ecommerce>` + +.. _localizations/ecuador/online-payments: + +Online payments +--------------- + +To enable online payments, add the relevant :doc:`payment provider(s) <../payment_providers>` and +configure the necessary :ref:`payment methods `. It is mandatory +to set the :guilabel:`SRI Payment Method` for each method. .. note:: - Adding the :guilabel:`SRI Payment Method` is necessary to generate correctly the electronic + Adding the :guilabel:`SRI Payment Method` is necessary to correctly generate the electronic invoice from an eCommerce sale. Select a **payment method** to access its configuration menu and - the field. + field. -.. seealso:: - :doc:`Payment provider <../payment_providers>` +.. _localizations/ecuador/automatic-invoice: -.. image:: ecuador/l10n-ec-sri-payment-method.png - :align: center - :alt: l10n_ec SRI Payment Method. +Automatic invoice +----------------- -eCommerce workflow -~~~~~~~~~~~~~~~~~~ +:ref:`Invoices ` can be generated after the checkout process. -Identification type and number -****************************** +.. tip:: + The invoice's email template can be modified from the :guilabel:`Invoice Email Template` field + under the :guilabel:`Automatic Invoice` option. + +.. important:: + The sales journal used for invoicing is the first in the priority sequence in the + :guilabel:`Journal` menu. -The client who is making a purchase will have the option to indicate their identification type and -number during the checkout process. This information is required to correctly generate the -electronic invoice after the checkout is completed. +.. _localizations/ecuador/ecommerce-workflow: -.. image:: ecuador/website-checkout-form.png - :alt: Website checkout form. +Identification type and number +------------------------------ + +During the checkout process, the client making a purchase will have the option to indicate their +identification type and number. This information is required to generate the electronic invoice +after the checkout is completed correctly. .. note:: Verification is done to ensure the :guilabel:`Identification Number` field is completed and has - the correct number of digits. For RUC identification, 13 digits are required. For Cédula, - 9 digits are required. + the correct number of digits. For RUC identification, 13 digits are required, and for Cédula, 9 + digits are required. After finishing the checkout process, a confirmed invoice is generated, ready to be sent manually or asynchronously to the SRI. -Point of Sale electronic invoicing ----------------------------------- +.. _localizations/ecuador/point-of-sale: + +Point of sale electronic invoicing +================================== Make sure the *Ecuadorian module for Point of Sale* (`l10n_ec_edi_pos`) is :ref:`installed -` to enable the following features and configurations: +` to enable the following features and configurations: - Choose the SRI payment method in each payment method configuration. -- Manually input the customer's identification type and identification number when creating a - new contact on *POS*. +- Manually input the customer's identification type and number when creating a new contact on *POS*. - Automatically generate a valid electronic invoice for Ecuador at the end of the checkout process. +.. _localizations/ecuador/payment-method-configuration: + Payment method configuration -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +---------------------------- To :doc:`create a payment method for a point of sale <../../sales/point_of_sale/payment_methods>`, go to :menuselection:`Point of Sale --> Configuration --> Payment Methods`. Then, set the :guilabel:`SRI Payment Method` in the payment method form. +.. _localizations/ecuador/invoicing-flow: + Invoicing flows -~~~~~~~~~~~~~~~ +--------------- + +.. _localizations/ecuador/identification-type-number: Identification type and number -****************************** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The POS cashier can :ref:`create a new contact for a customer ` who requests an +The P0S cashier can :ref:`create a new contact for a customer ` who requests an invoice from an open POS session. The *Ecuadorian Module for Point of Sale* adds two new fields to the contact creation form: @@ -685,23 +875,27 @@ The *Ecuadorian Module for Point of Sale* adds two new fields to the contact cre .. note:: As the identification number length differs depending on the identification type, Odoo - automatically checks the :guilabel:`Tax ID` field upon saving the contact form. To manually + automatically checks the :guilabel:`Tax ID` field when saving the contact form. To manually ensure the length is correct, know that the :guilabel:`RUC` and :guilabel:`Citizenship` types require 13 and 10 digits, respectively. +.. _localizations/ecuador/anonymous-end-consumer: + Electronic invoice: anonymous end consumer -****************************************** +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When clients do not request an electronic invoice for their purchase, Odoo automatically sets the customer as :guilabel:`Consumidor Final` and generates an electronic invoice anyway. .. note:: If the client requests a credit note due to a return of this type of purchase, the credit note - should be made using the client's real contact information. Credit notes cannot be created to + should be made using the client's real contact information. Credit notes cannot be created for *Consumidor Final* and can be managed :ref:`directly from the POS session `. +.. _localizations/ecuador/specific-customer: + Electronic invoice: specific customer -************************************* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If a customer requests an invoice for their purchase, it is possible to select or create a contact with their fiscal information. This ensures the invoice is generated with accurate customer details. @@ -709,96 +903,3 @@ with their fiscal information. This ensures the invoice is generated with accura .. note:: If the client requests a credit note due to a return of this type of purchase, the credit note and return process can be managed :ref:`directly from the POS session `. - -Financial reports -================= - -In Ecuador, there are fiscal reports that the company presents to SRI. Odoo supports two of the main -financial reports used by companies: **reports 103** and **104**. - -To get these reports, go to the **Accounting** app and select :menuselection:`Reporting --> -Statements Reports --> Tax Report` and then filter by `Tax Report 103` or `Tax Report 104`. - -Report 103 ----------- - -This report contains information of income tax withholdings in a given period, this can be reported -monthly or semi-annually. - -You can see the information needed to report, which includes base and tax amounts, but also includes -the tax code within the parenthesis in order to report it to the SRI. - -.. image:: ecuador/103-form.png - :align: center - :alt: Report 103 form for Ecuador. - -Report 104 ----------- - -This report contains information on VAT tax and VAT withholding for a given period, this can be -monthly or semi-annually. - -You can see the information needed to report, which includes base and tax amounts, but also includes -the tax code within the parenthesis to report it to the SRI. - -.. image:: ecuador/104-form.png - :align: center - :alt: Report 104 form for Ecuador. - -.. _ecuador/ats: - -ATS report ----------- - -:ref:`Install ` the *ATS Report* (`l10n_ec_reports_ats`) module to enable -downloading the ATS report in XML format. - -.. note:: - The Ecuadorian *ATS Report* module depends on the previous installation of the *Accounting* app - and the *Ecuadorian EDI module*. - -Configuration -~~~~~~~~~~~~~ - -To issue electronic documents, ensure your company is configured as explained in the -:ref:`electronic invoice ` section. - -In the :abbr:`ATS (Anexo Transaccional Simplificado)`, every document generated in Odoo (invoices, -vendor bills, sales and purchases withholdings, credit notes, and debit notes) will be included. - -Vendor bills -************ - -When generating a vendor bill, it is necessary to register the authorization number from the -invoice that the vendor generated for the purchase. To do so, go to :menuselection:`Accounting ---> Vendors --> Bills` and select the bill. Then, enter the number from the vendor's invoice in the -:guilabel:`Authorization Number` field. - -Credit and debit notes -********************** - -When generating a credit note or debit note manually or through importation, it is necessary to link -this note to the sales invoice that is being modified by it. - -.. note:: - Remember to add all required information to the documents before downloading the :abbr:`ATS - (Anexo Transaccional Simplificado)` file. For example, add the *Authorization Number* and the - *SRI Payment Method* on documents, when needed. - -XML generation -~~~~~~~~~~~~~~ - -To generate the :abbr:`ATS (Anexo Transaccional Simplificado)` report, go to -:menuselection:`Accounting --> Reports --> Tax Report` and choose a time period for the desired -:abbr:`ATS (Anexo Transaccional Simplificado)` report, then click :guilabel:`ATS`. - -The downloaded XML file is ready to be uploaded to *DIMM Formularios*. - -.. image:: ecuador/ats-report.png - :align: center - :alt: ATS report download for Ecuador in Odoo Accounting. - -.. note:: - When downloading the :abbr:`ATS (Anexo Transaccional Simplificado)` report, Odoo generates a - warning pop-up alerting the user if a document(s) has missing or incorrect data. Nevertheless, - the user can still download the XML file. diff --git a/content/applications/finance/fiscal_localizations/ecuador/103-form.png b/content/applications/finance/fiscal_localizations/ecuador/103-form.png deleted file mode 100644 index 104153ad5e..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/103-form.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/104-form.png b/content/applications/finance/fiscal_localizations/ecuador/104-form.png deleted file mode 100644 index acdd56b338..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/104-form.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/add-customer-credit-note.png b/content/applications/finance/fiscal_localizations/ecuador/add-customer-credit-note.png deleted file mode 100644 index fff34f68ca..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/add-customer-credit-note.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/add-customer-debit-note.png b/content/applications/finance/fiscal_localizations/ecuador/add-customer-debit-note.png deleted file mode 100644 index f226bc45fb..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/add-customer-debit-note.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/ats-report.png b/content/applications/finance/fiscal_localizations/ecuador/ats-report.png deleted file mode 100644 index afd80df561..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/ats-report.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/contacts.png b/content/applications/finance/fiscal_localizations/ecuador/contacts.png deleted file mode 100644 index c32cfecfbb..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/contacts.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/contributor-type.png b/content/applications/finance/fiscal_localizations/ecuador/contributor-type.png deleted file mode 100644 index a311b7ec8a..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/contributor-type.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/customer-credit-note.png b/content/applications/finance/fiscal_localizations/ecuador/customer-credit-note.png deleted file mode 100644 index 2a67bd062e..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/customer-credit-note.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/customer-debit-note.png b/content/applications/finance/fiscal_localizations/ecuador/customer-debit-note.png deleted file mode 100644 index b1e2568945..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/customer-debit-note.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/customer-invoice.png b/content/applications/finance/fiscal_localizations/ecuador/customer-invoice.png deleted file mode 100644 index 629f7b4895..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/customer-invoice.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/customer-withhold.png b/content/applications/finance/fiscal_localizations/ecuador/customer-withhold.png deleted file mode 100644 index 1050808d02..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/customer-withhold.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/document-types.png b/content/applications/finance/fiscal_localizations/ecuador/document-types.png deleted file mode 100644 index 513c642a88..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/document-types.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/ecuador-company.png b/content/applications/finance/fiscal_localizations/ecuador/ecuador-company.png deleted file mode 100644 index e42b3b61da..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/ecuador-company.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/electronic-signature.png b/content/applications/finance/fiscal_localizations/ecuador/electronic-signature.png deleted file mode 100644 index a291473270..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/electronic-signature.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-authorization-number.png b/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-authorization-number.png new file mode 100644 index 0000000000..54d6cf903a Binary files /dev/null and b/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-authorization-number.png differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-carrier-contact.png b/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-carrier-contact.png new file mode 100644 index 0000000000..b9c5ff5c98 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-carrier-contact.png differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-delivery-guide-pdf.png b/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-delivery-guide-pdf.png new file mode 100644 index 0000000000..34da7e27c5 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-delivery-guide-pdf.png differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-delivery-guide-settings.png b/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-delivery-guide-settings.png new file mode 100644 index 0000000000..7fdd1e201f Binary files /dev/null and b/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-delivery-guide-settings.png differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-individual-flow.png b/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-individual-flow.png new file mode 100644 index 0000000000..0174dce46f Binary files /dev/null and b/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-individual-flow.png differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-sri-payment-method.png b/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-sri-payment-method.png deleted file mode 100644 index 380d96f21e..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/l10n-ec-sri-payment-method.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/printer-point.png b/content/applications/finance/fiscal_localizations/ecuador/printer-point.png deleted file mode 100644 index 6742a0f467..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/printer-point.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/products.png b/content/applications/finance/fiscal_localizations/ecuador/products.png deleted file mode 100644 index 1a888d9887..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/products.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/purchase-invoice.png b/content/applications/finance/fiscal_localizations/ecuador/purchase-invoice.png deleted file mode 100644 index 75a511f17d..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/purchase-invoice.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/purchase-liqudations.png b/content/applications/finance/fiscal_localizations/ecuador/purchase-liqudations.png deleted file mode 100644 index 0bf7374a15..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/purchase-liqudations.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/purchase-liquidation.png b/content/applications/finance/fiscal_localizations/ecuador/purchase-liquidation.png deleted file mode 100644 index bbd664d592..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/purchase-liquidation.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/purchase-withhold.png b/content/applications/finance/fiscal_localizations/ecuador/purchase-withhold.png deleted file mode 100644 index 7543911e4c..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/purchase-withhold.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/taxes-with-tax-support.png b/content/applications/finance/fiscal_localizations/ecuador/taxes-with-tax-support.png deleted file mode 100644 index 309fc2ad28..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/taxes-with-tax-support.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/taxes.png b/content/applications/finance/fiscal_localizations/ecuador/taxes.png deleted file mode 100644 index 585396bb20..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/taxes.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/website-checkout-form.png b/content/applications/finance/fiscal_localizations/ecuador/website-checkout-form.png deleted file mode 100644 index 3c0dbeb24f..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/website-checkout-form.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/ecuador/withhold.png b/content/applications/finance/fiscal_localizations/ecuador/withhold.png deleted file mode 100644 index 5b45761721..0000000000 Binary files a/content/applications/finance/fiscal_localizations/ecuador/withhold.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/france.rst b/content/applications/finance/fiscal_localizations/france.rst index c00192d169..b2605f435f 100644 --- a/content/applications/finance/fiscal_localizations/france.rst +++ b/content/applications/finance/fiscal_localizations/france.rst @@ -2,68 +2,206 @@ France ====== +.. _localizations/france/configuration/modules: + +Modules +======= + +The following modules related to the French localization are available: + +.. list-table:: + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`France - Accounting` + - `l10n_fr_account` + - French :ref:`fiscal localization package ` that applies only + to companies based in mainland France and doesn't include DOM-TOMs. + * - :guilabel:`France - Accounting Reports` + - `l10n_fr_reports` + - Export of the French VAT report, which can be sent to the DGFiP, an OGA, or a professional + accountant. + * - :guilabel:`France - Payroll with Accounting` + - `l10n_fr_hr_payroll_account` + - Includes the necessary accounting data for the French payroll rules. + * - :guilabel:`France - Factur-X integration with Chorus Pro` + - `l10n_fr_facturx_chorus_pro` + - Adds fields needed for :ref:`submitting invoices to Chorus Pro + `. + * - :guilabel:`France - FEC Import` + - `l10n_fr_fec_import` + - Import of standard FEC files, useful for importing accounting history. + * - :guilabel:`France - VAT Anti-Fraud Certification for Point of Sale (CGI 286 I-3 bis)` + - `l10n_fr_pos_cert` + - :ref:`Point of Sale VAT anti-fraud certification + ` + +.. note:: + The localization's core modules are installed automatically with the localization. The rest can + be manually :doc:`installed `. + +.. _localizations/france/loc-overview: + +Localization overview +===================== + +The French localization package ensures compliance with French fiscal and accounting regulations. It +includes tools for managing taxes, fiscal positions, reporting, and a predefined chart of accounts +tailored to France’s standards. + +The French localization package provides the following key features to ensure compliance with local +fiscal and accounting regulations: + +- :doc:`../accounting/get_started/chart_of_accounts`: a predefined structure tailored to French + accounting standards +- :doc:`../accounting/taxes/fiscal_positions`: automated tax adjustments based on customer or + supplier registration status +- :doc:`Taxes <../accounting/taxes>`: pre-configured tax rates, including standard VAT, + zero-rated, and exempt options +- :doc:`Payroll ` +- :ref:`Reporting ` + +.. _localizations/france/reporting: + +Reporting +--------- + +:doc:`Installing ` the :guilabel:`France - Accounting` +(`l10n_fr_account`) module gives access to some accounting reports specific to France, such as: + +- :guilabel:`Bilan comptable (FR)` (:guilabel:`Balance Sheet`) +- :guilabel:`Compte de résultats (FR)` (:guilabel:`Profit and Loss`) +- :guilabel:`Rapport de taxes (FR)` (:guilabel:`Tax Report`) + +.. _localizations/france/accounting: + +Accounting +========== + +.. _localizations/france/e-invoicing: + +E-Invoicing +----------- + +The `Chorus Pro `_ portal, managed by the AIFE (Agence +pour l'Informatique financière de l'État), is the official platform for submitting electronic +invoices to French public entities. It allows businesses to send and manage invoices, track their +processing status, and access payment updates. Since January 2020, electronic invoicing has been +mandatory for all business-to-government (B2G) transactions in France. Odoo supports integration +with Chorus Pro to submit invoices generated in Odoo. + +.. _localizations/france/e-invoicing-configuration: + +Configuration +~~~~~~~~~~~~~ + +To send invoices to Chorus Pro, the following configuration is required: + +#. :doc:`Install ` the :guilabel:`France - Factur-X integration + with Chorus Pro` (`l10n_fr_facturx_chorus_pro`) module. +#. :ref:`Register ` with Peppol, as invoices are sent + from Odoo to Chorus Pro via the :ref:`Peppol ` network. +#. If you don’t already have a Chorus Pro account, go to the `Chorus Pro + `_ page, click :guilabel:`Créer un compte`, and + create one. +#. :ref:`Configure the relevant customers' contact form + `. + .. seealso:: - :doc:`Documentation on e-invoicing’s legality and compliance in France - <../accounting/customer_invoices/electronic_invoicing/france>` + `Chorus Pro documentation `_ -.. _localization/france/fec: +.. _localizations/france/e-invoicing-contacts: -FEC - Fichier des Écritures Comptables -====================================== +Customers +********* -An FEC :dfn:`Fichier des Écritures Comptables` audit file contains all the accounting data and entries -recorded in all the accounting journals for a financial year. The entries in the file must be -arranged in chronological order. +To submit invoices to Chorus Pro, configure the relevant customers' contact form as follows: -Since January 1st, 2014, every French company is required to produce and transmit this file upon -request by the tax authorities for audit purposes. +#. Verify the :guilabel:`Country` and :guilabel:`VAT` fields are filled out. +#. In the :guilabel:`Sales & Purchase` tab, ensure the :guilabel:`SIRET` field is completed. +#. In the :guilabel:`Accounting` tab, fill in the following fields in the :guilabel:`Customer + Invoices` section: -.. _localization/france/fec-import: + - :guilabel:`eInvoice format`: Select :guilabel:`BIS Billing 3.0`. + - Make sure :guilabel:`France SIRET` is selected in the next field, then type `11000201100044`, + the reference used by Chorus Pro. -FEC import ----------- +.. _localizations/france/e-invoicing-invoices: -To make the onboarding of new users easier, Odoo Enterprise's French :ref:`fiscal localization -package ` includes the **FEC Import** feature (module name: -``l10n_fr_fec_import``), which enables the import of existing FEC files from older software. +Sending invoices to Chorus Pro +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -To enable this feature, go to :menuselection:`Accounting --> Configuration --> Settings --> -Accounting Import`, enable **FEC Import**, and *Save*. +To send invoices to Chorus Pro, follow these steps: -Next, go to :menuselection:`Accounting --> Configuration --> FEC Import`, upload your FEC file, and -click on *Import*. +#. Go to :menuselection:`Accounting --> Customers --> Invoices` and open or create the invoice. +#. In the :guilabel:`Other Info` tab, make sure the following fields are filled in the + :guilabel:`Chorus Pro` section: -.. note:: + - :guilabel:`Buyer Reference`: :guilabel:`Service Exécutant` in Chorus Pro + - :guilabel:`Contract Reference`: :guilabel:`Numéro de Marché` in Chorus Pro + - :guilabel:`Purchase Order Reference`: :guilabel:`Engagement Juridique` in Chorus Pro - | Importing FEC files from different year takes no particular action or computation. - | Should multiple files contain any "Reports à Nouveaux" (RAN) with the starting balance of the - year, you might need to cancel those entries in the User Interface. Odoo makes those entries - (RAN) useless. +#. Confirm the invoice. +#. Click :guilabel:`Send` and, in the :guilabel:`Send` window, enable :guilabel:`By Peppol`. +#. Click :guilabel:`Send`. -.. _localization/france/fec-file: +Once the invoice is sent, the Peppol status of the invoice is updated to :guilabel:`Done`. -File formats -~~~~~~~~~~~~ +.. seealso:: + :ref:`Peppol ` + +.. _localizations/france/fec: + +FEC - Fichier des Écritures Comptables +-------------------------------------- + +An FEC :dfn:`Fichier des Écritures Comptables` audit file contains all the accounting data and +entries recorded in all the accounting journals for a financial year. The entries in the file must +be arranged in chronological order. Since January 2014, every French company is required to produce +and transmit this file upon request by the tax authorities for audit purposes. + +.. _localizations/france/fec-import: + +FEC Import +~~~~~~~~~~ + +:doc:`Install ` the :guilabel:`France - FEC Import` +(`l10n_fr_fec_import`) module to import FEC files from other software. -FEC files can only be in CSV format, as the XML format is not supported. +To enable this feature, go to :menuselection:`Accounting --> Configuration --> Settings`. In the +:guilabel:`Accounting Import` section, click :icon:`oi-arrow-right` :guilabel:`Import` and +:guilabel:`Import FEC`. Then, in the :guilabel:`FEC Import` window, upload the FEC file and click +:guilabel:`Import`. .. note:: + Importing FEC files from different years requires no particular actions or computations. However, + if multiple files contain RAN :dfn:`Reports à Nouveaux` with the starting balance for the year, + these entries are automatically marked as unnecessary in Odoo and may need to be deleted. - The FEC CSV file has a plain text format representing a data table, with the first line being a - header and defining the list of fields for each entry, and each following line representing one - accounting entry, in no predetermined order. +.. _localizations/france/fec-file-formats: -Our module expects the files to meet the following technical specifications: +File formats +************ + +.. note:: + - FEC files must be in CSV format, as XML format is not supported. + - The FEC CSV file is a plain text file structured as a data table. The first line serves as the + header, defining the list of fields for each entry, and each following line represents a single + accounting entry without any specific order. + +FEC files must comply with the following technical specifications: - **Encoding**: UTF-8, UTF-8-SIG and iso8859_15. - **Separator**: any of these: `;` or `|` or `,` or `TAB`. - **Line terminators**: both CR+LF (`\\r\\n`) and LF (`\\n`) character groups are supported. - **Date format**: `%Y%m%d` -.. _localization/france/fec-fields: +.. _localizations/france/fec-fields: Fields description and use -~~~~~~~~~~~~~~~~~~~~~~~~~~ +************************** +----+---------------+--------------------------------------+-----------------------------------+-----------------+ | # | Field name | Description | Use | Format | @@ -115,7 +253,7 @@ Fields description and use | | | (accepts null) | | | +----+---------------+--------------------------------------+-----------------------------------+-----------------+ -These two fields can be found in place of the others in the sence above. +These two fields appear in the same order as the others, replacing them. +----+---------------+--------------------------------------+-----------------------------------+-----------------+ | 12 | Montant | Amount | `move_line.debit` | Float | @@ -125,76 +263,65 @@ These two fields can be found in place of the others in the sence above. | | | or "D" for Debit | or `move_line.credit` | | +----+---------------+--------------------------------------+-----------------------------------+-----------------+ -.. _localization/france/fec-implementation: +.. _localizations/france/fec-implementation: Implementation details -~~~~~~~~~~~~~~~~~~~~~~ +********************** The following accounting entities are imported from the FEC files: **Accounts, Journals, Partners**, -and **Moves**. +and **Moves**. The module automatically determines the encoding, line terminator, and separator used +in the file. Next, a check is performed to ensure that each line has the correct number of fields +matching the header. If the check is successful, the entire file is read, stored in memory, and +scanned. Accounting entities are then imported one type at a time in the following order. -Our module determines the encoding, the line-terminator character, and the separator that are used -in the file. - -A check is then performed to see if every line has the correct number of fields corresponding to the -header. - -If the check passes, then the file is read in full, kept in memory, and scanned. Accounting entities -are imported one type at a time, in the following order. - -.. _localization/france/fec-accounts: +.. _localizations/france/fec-accounts: Accounts -******** +^^^^^^^^ -Every accounting entry is related to an account, which should be determined by the field -`CompteNum`. +Each accounting entry is associated with an account identified by the :guilabel:`CompteNum` field. -.. _localization/france/fec-code-matching: +.. _localizations/france/fec-code-matching: Code matching -************* - -Should a similar account code already be present in the system, the existing one is used instead of -creating a new one. +^^^^^^^^^^^^^ -Accounts in Odoo generally have a number of digits that are default for the fiscal localization. As -the FEC module is related to the French localization, the default number of relevant digits is 6. - -This means that the account codes the trailing zeroes are right-trimmed, and that the comparison -between the account codes in the FEC file and the ones already existing in Odoo is performed only on -the first six digits of the codes. +If an account with the same code already exists, the existing one is used rather than creating a new +one. In Odoo, account numbers follow the default digit length of the fiscal localization. Since the +FEC module is tied to the French localization, the default account length is 6 digits. +This means that trailing zeros in account codes are removed, and the comparison between the account +codes in the FEC file and those already in Odoo is made based only on the first six digits of the +codes. .. example:: - The account code `65800000` in the file is matched against an existing `658000` account in Odoo, - and that account is used instead of creating a new one. + The account code `65800000` in the file is matched with an existing `658000` account in Odoo, + and the existing account is used instead of creating a new one. -.. _localization/france/fec-reconcilable-flag: +.. _localizations/france/fec-reconcilable-flag: Reconcilable flag -***************** +^^^^^^^^^^^^^^^^^ An account is technically flagged as *reconcilable* if the first line in which it appears has the -`EcritureLet` field filled out, as this flag means that the accounting entry is going to be -reconciled with another one. +:guilabel:`EcritureLet` field filled out, indicating that the accounting entry will be reconciled +with another one. .. note:: + The field can be left empty on the line, but the entry must still be reconciled with an + unrecorded payment. The account is flagged as reconcilable once the import of the move lines + requires it. - In case the line somehow has this field not filled out, but the entry still has to be reconciled - with a payment that hasn't yet been recorded, this isn't a problem anyway; the account is - flagged as reconcilable as soon as the import of the move lines requires it. - -.. _localization/france/fec-account-type-template-matching: +.. _localizations/france/fec-account-type: Account type and templates matching -*********************************** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -As the **type** of the account is not specified in the FEC format, **new** accounts are created -with the default type *Current Assets* and then, at the end of the import process, they are -matched against the installed Chart of Account templates. Also, the *reconcile* flag is also -computed this way. +Since the account **type** is not specified in the FEC format, **new** accounts are created with the +default type :guilabel:`Current Assets`. After the import process, they are matched against the +installed Chart of Account templates. The *reconcile* flag is also determined this way. -The match is done with the left-most digits, starting by using all digits, then 3, then 2. +The matching is performed by comparing the left-most digits, starting with all digits, followed by +3 digits, and then 2 digits. .. example:: @@ -208,55 +335,55 @@ The match is done with the left-most digits, starting by using all digits, then | **Result** | | | | Match **found** | +------------+------------+-----------------+---------------------+---------------------+ -The type of the account is then flagged as *payable* and *reconcilable* as per the account template. +The account type is then flagged as :guilabel:`payable` and :guilabel:`reconcilable` based on the +account template. -.. _localization/france/fec-journals: +.. _localizations/france/fec-journals: Journals -******** +^^^^^^^^ -Journals are also checked against those already existing in Odoo to avoid duplicates, also in the -case of multiple FEC files imports. +Journals are checked against the existing ones in Odoo to avoid duplicates, even when importing +multiple FEC files. -Should a similar journal code already be present in the system, the existing one is used instead of -creating a new one. +If a journal with the same code already exists, the existing journal is used instead of creating a +new one. -New journals have their name prefixed by the string ``FEC-``. +New journals have the prefix :guilabel:`FEC-` added to their name. For example, :guilabel:`ACHATS` +becomes :guilabel:`FEC-ACHATS`. -.. example:: - `ACHATS` -> `FEC-ACHATS` - -The journals are *not* archived, the user is entitled to handle them as he wishes. +.. note:: + Journals are *not* archived, allowing the user to manage them as desired. -.. _localization/france/fec-journal-type: +.. _localizations/france/fec-journal-type: Journal type determination -************************** +^^^^^^^^^^^^^^^^^^^^^^^^^^ -The journal type is also not specified in the format (as per the accounts) and therefore it is -at first created with the default type `general`. +The journal type is not specified in the format (similar to the accounts) and is initially created +with the default type :guilabel:`general`. -At the end of the import process, the type is determined as per these rules regarding related -moves and accounts: +At the end of the import process, the journal type is determined based on the following rules +regarding related moves and accounts: -- | `bank`: Moves in these journals always have a line (debit or credit) impacting a +- | :guilabel:`bank`: Moves in these journals always include a line (debit or credit) impacting a liquidity account. - | `cash` / `bank` can be interchanged, so `bank` is set everywhere when this condition is met. -- | `sale`: Moves in these journals mostly have debit lines on receivable accounts and + | :guilabel:`cash` / :guilabel:`bank` can be interchanged, so :guilabel:`bank` is assigned when + this condition is met. +- | :guilabel:`sale`: Moves in these journals mostly have debit lines on receivable accounts and credit lines on tax income accounts. | Sale refund journal items are debit/credit inverted. -- | `purchase`: Moves in these journals mostly have credit lines on payable accounts and +- | :guilabel:`purchase`: Moves in these journals mostly have credit lines on payable accounts and debit lines on expense accounts. | Purchase refund journal items are debit/credit inverted. -- | `general`: for everything else. +- | :guilabel:`general`: Used for everything else. .. note:: - - - A minimum of three moves is necessary for journal type identification. - - A threshold of 70% of moves must correspond to a criteria for a journal type to be determined. + - A minimum of three moves is required to identify the journal type. + - A threshold of 70% of the moves must meet the criteria for a journal type to be determined. .. example:: - Suppose we are analyzing the moves that share a certain `journal_id`. + Suppose we are analyzing the moves that share a certain :guilabel:`journal_id`. +------------------------------------------------------------+-------+------------+ | Moves | Count | Percentage | @@ -270,115 +397,101 @@ moves and accounts: | **Total** | 4 | 100% | +------------------------------------------------------------+-------+------------+ - The journal `type` would be `bank`, because the bank moves percentage (75%) exceeds the threshold - (70%). + The journal :guilabel:`type` would be :guilabel:`bank`, because the bank's move percentage (75%) + exceeds the threshold (70%). -.. _localization/france/fec-partners: +.. _localizations/france/fec-partners: -Partners -******** +Contacts +^^^^^^^^ -Each partner keeps its `Reference` from the field `CompAuxNum`. +Each contact keeps its :guilabel:`Reference` from the :guilabel:`CompAuxNum` field. .. note:: - - These fields are searchable, in line with former FEC imports on the accounting expert's side for - fiscal/audit purposes. + These fields are searchable based on previous FEC imports for fiscal/audit purposes. .. tip:: + Similar and potential duplicate contacts can be merged using the Data Cleaning App. - Users can merge partners with the Data Cleaning App, where Vendors and Customers or similar - partner entries may be merged by the user, with assistance from the system that groups them by - similar entries. - -.. _localization/france/fec-moves: +.. _localizations/france/fec-moves: Moves -***** +^^^^^ -Entries are immediately posted and reconciled after submission, using the `EcritureLet` field to -do the matching between the entries themselves. +Entries are posted and reconciled immediately upon submission, with the :guilabel:`EcritureLet` +field used to match the entries. -The `EcritureNum` field represents the name of the moves. We noticed that sometimes it may not be -filled out. In this case, the field `PieceRef` is used. +The :guilabel:`EcritureNum` field represents the name of the moves, but it may sometimes be left +empty. In such cases, the :guilabel:`PieceRef` field is used instead. -.. _localization/france/fec-rounding: +.. _localizations/france/fec-rounding-issue: Rounding issues -*************** +^^^^^^^^^^^^^^^ -There is a rounding tolerance with a currency-related precision on debit and credit (i.e., 0.01 for -EUR). Under this tolerance, a new line is added to the move, named *Import rounding difference*, -targeting the accounts: +A rounding tolerance is applied based on currency precision for debit and credit amounts (i.e., 0.01 +for EUR). If the difference falls under this tolerance, a new line is added to the move, called +:guilabel:`Import rounding difference`, targeting the following accounts: - `658000` Charges diverses de gestion courante, for added debits - `758000` Produits divers de gestion courante, for added credits -.. _localization/france/fec-missing-move-name: +.. _localizations/france/fec-missing-move-name: Missing move name -***************** +^^^^^^^^^^^^^^^^^ -Should the `EcritureNum` not be filled out, it may also happen that the `PieceRef` field is also -not suited to determine the move name (it may be used as an accounting move line reference) leaving -no way to actually find which lines are to be grouped in a single move, and effectively impeding the -creation of balanced moves. +If the the :guilabel:`EcritureNum` field is not filled out and :guilabel:`PieceRef` field is not +suited to determine the move name (it may be used as an accounting move line reference), it becomes +impossible to identify which lines should be grouped into a single move, and effectively preventing +the creation of balanced moves. -One last attempt is made, grouping all lines from the same journal and date (`JournalLib`, -`EcritureDate`). Should this grouping generate balanced moves (sum(credit) - sum(debit) = 0), then -each different combination of journal and date creates a new move. +In such cases, a final attempt is made to group all lines by the same journal and date +(:guilabel:`JournalLib`, :guilabel:`EcritureDate`). If this grouping generates balanced moves +(sum(credit) - sum(debit) = 0), then each different combination of journal and date creates a new +move. .. example:: `ACH` + `2021/05/01` --> new move on journal `ACH` with name `20210501`. -Should this attempt fail, the user is prompted an error message with all the move lines that are -supposedly unbalanced. +If this attempt fails, an error message is displayed, listing all the move lines that are considered +unbalanced. -.. _localization/france/fec-partner-info: +.. _localizations/france/fec-partner-information: -Partner information -******************* +Contact information +^^^^^^^^^^^^^^^^^^^ -If a line has the partner information specified, the information is copied to the accounting move -itself if the targeted Journal is of type *payable* or *receivable*. +If a line includes contact information, it is copied to the accounting move itself, provided the +targeted journal is of type :guilabel:`payable` or :guilabel:`receivable`. -.. _localization/france/fec-partner-info-export: +.. _localizations/france/fec-export: -Export ------- +FEC Export +~~~~~~~~~~ -If you have installed the French :ref:`fiscal localization package `, -you should be able to download the FEC. To do so, go to :menuselection:`Accounting --> Reporting --> -France --> FEC`. +To download the FEC, go to :menuselection:`Accounting --> Reporting --> General Ledger`. Click the +:icon:`fa-cog` :guilabel:`(gear)` icon and select :guilabel:`FEC`. In +the :guilabel:`FEC File Generation` window, fill in the following fields: -.. tip:: +- :guilabel:`Start Date` +- :guilabel:`End Date` +- :guilabel:`Test File`: Enable this option to test the FEC file generation. +- :guilabel:`Exclude lines at 0`: Enable this option if needed. +- :guilabel:`Excluded Journals`: Select the journal(s) to exclude. - If you do not see the submenu **FEC**, go to :menuselection:`Apps`, remove the *Apps* filter, - then search for the module named **France-FEC** and make sure it is installed. +Then, click :guilabel:`Generate`. .. seealso:: - - - `Official Technical Specification (fr) - `_ - - `Test-Compta-Demat (Official FEC Testing tool) - `_ - -.. _localization/france/accounting-reports: - -French accounting reports -========================= - -If you have installed the French Accounting, you will have access to some accounting reports -specific to France: - -- Bilan comptable -- Compte de résultats -- Plan de Taxes France + - `Official Technical Specification (fr) + `_ + - `Test-Compta-Demat (Official FEC Testing tool) + `_ .. _localization/france/liasse-fiscale: Liasse fiscale -============== +-------------- The *liasse fiscale* (tax returns) is a collection of standardized financial documents that businesses must submit annually to the tax authorities. It comprehensively summarizes the company’s @@ -396,7 +509,7 @@ Publiques), follow these steps: .. _localization/france/teledec-account: Teledec account creation ------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~ To create a Teledec account, access the `Teledec account creation page `_ and fill in the :guilabel:`Adresse e-mail` field with an email address. Choose a secure password, @@ -410,7 +523,7 @@ Business Directory Identification System)` number of the company. .. _localization/france/teledec-registration: Company registration and fiscal year information ------------------------------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To register the company on Teledec, go to :guilabel:`Vos entreprises` (Your companies) and click :guilabel:`Enregistrer votre entreprise` (Register your company). Make sure to fill in the following @@ -442,7 +555,7 @@ those customized for the company’s tax return. .. _localization/france/teledec-synchronization: Odoo synchronization --------------------- +~~~~~~~~~~~~~~~~~~~~ To enable Odoo to automatically fill in the data for the :guilabel:`Liasse fiscale`, click :guilabel:`Autres actions` (Other actions) in the top-right corner and select @@ -452,12 +565,20 @@ To enable Odoo to automatically fill in the data for the :guilabel:`Liasse fisca In the :guilabel:`Synchroniser cette liasse avec Odoo` window, fill in the following information to complete the synchronization: -- :guilabel:`Nom / URL complète de la base de données ODOO`: Odoo database name or URL. To provide +- :guilabel:`Nom / URL complète de la base de données Odoo`: Odoo database name or URL. To provide the full URL of the database, enable :guilabel:`Je voudrais donner une url complète hors .odoo.com` option. - :guilabel:`Nom de l'utilisateur`: User name associated with the Odoo account. - :guilabel:`Clé API`: :ref:`API key ` generated by the Odoo instance. +.. note:: + In a multi-company setup, the following configurations are required in Odoo: + + - The user linked to the generated :ref:`API key ` must have + :ref:`access ` to the company intended for synchronization. + - This company must also be set as the user's :guilabel:`Default Company`, as Teledec always + synchronizes with the user's default company. + Next, click :guilabel:`Importer` to synch data from Odoo. In the :guilabel:`Confirmation de la synchronisation de liasse avec Odoo` window, review the amounts and make any necessary changes. Then click :guilabel:`Importer la balance` to confirm the @@ -470,187 +591,136 @@ synchronization of the *liasse fiscale* with Odoo and import the balance. To make payment and send the declaration to the tax authorities, click :guilabel:`Paiement & envoi de la déclaration`. -.. _localization/france/anti-fraud: - -Get the VAT anti-fraud certification with Odoo -============================================== +.. _localizations/france/pos: -As of January 1st 2018, a new anti-fraud legislation comes into effect -in France and DOM-TOM. This new legislation stipulates certain criteria -concerning the inalterability, security, storage and archiving of sales data. -These legal requirements are implemented in Odoo, version 9 onward, -through a module and a certificate of conformity to download. +Point of sale +============= -.. _localization/france/anti-fraud-software: +.. _localizations/france/vat-anti-fraud-certification: -Is my company required to use anti-fraud software? --------------------------------------------------- +VAT anti-fraud certification +---------------------------- -Your company is required to use an anti-fraud cash register software like -Odoo (CGI art. 286, I. 3° bis) if: +Since January 2018, new anti-fraud legislation has been in effect in France and its overseas +territories (DOM-TOM). This legislation establishes specific requirements for the integrity, +security, storage, and archiving of sales data. Odoo complies with these legal requirements by +providing a module and a downloadable certificate of conformity. -- You are taxable (not VAT exempt) in France or any DOM-TOM, -- Some of your customers are private individuals (B2C). +Anti-fraud cash register software, such as Odoo (CGI art. 286, I. 3° bis), is required for companies +taxable in France or DOM-TOM, where some customers are private individuals (B2C). This rule applies +to all company sizes, but auto-entrepreneurs exempt from VAT are unaffected. -This rule applies to any company size. Auto-entrepreneurs are exempted from -VAT and therefore are not affected. - -.. _localization/france/anti-fraud-odoo-certification: - -Get certified with Odoo ------------------------ - -Getting compliant with Odoo is very easy. +.. seealso:: + - `Frequently Asked Questions + `_ + - `Official Statement + `_ + - `Item 88 of Finance Law 2016 + `_ -Your company is requested by the tax administration to deliver a certificate -of conformity testifying that your software complies with the anti-fraud -legislation. This certificate is granted by Odoo SA to Odoo Enterprise users -`here `_. -If you use Odoo Community, you should :doc:`upgrade to Odoo Enterprise -` or contact your Odoo service provider. +.. _localizations/france/pos-odoo-certification: -In case of non-conformity, your company risks a fine of €7,500. +Odoo certification +~~~~~~~~~~~~~~~~~~ -To get the certification, just follow the following steps: +The tax administration requires all companies to provide a certificate of conformity confirming that +their software complies with anti-fraud legislation. In case of non-compliance, a €7,500 fine may be +imposed. -- If you use **Odoo Point of Sale**, :ref:`install ` the **France - VAT Anti-Fraud - Certification for Point of Sale (CGI 286 I-3 bis)** module by going to :menuselection:`Apps`, - removing the *Apps* filter, then searching for *l10n_fr_pos_cert*, and installing the module. +.. note:: + This `certificate `_ is granted by Odoo + SA to Odoo Enterprise users. -- Make sure a country is set on your company, otherwise your entries won’t be - encrypted for the inalterability check. To edit your company’s data, - go to :menuselection:`Settings --> Users & Companies --> Companies`. - Select a country from the list; Do not create a new country. -- Download the mandatory certificate of conformity delivered by Odoo SA `here `__. +To get the certification, follow these steps: -.. note:: +#. :doc:`Install ` the :guilabel:`France - VAT Anti-Fraud + Certification for Point of Sale (CGI 286 I-3 bis)` (`l10n_fr_pos_cert`) module. +#. Set the :guilabel:`Country` field on the :doc:`company record ` + to encrypt entries for the inalterability check. +#. Download the mandatory `certificate of conformity + `_ delivered by Odoo SA. - - To install the module in any system created before - December 18th 2017, you should update the modules list. - To do so, activate the :ref:`developer mode `. - Then go to the *Apps* menu and press *Update Modules List* in the top-menu. - - In case you run Odoo on-premise, you need to update your installation - and restart your server beforehand. - - If you have installed the initial version of the anti-fraud module - (prior to December 18th 2017), you need to update it. - The module's name was *France - Accounting - Certified CGI 286 I-3 bis*. - After an update of the modules list, search for - the updated module in *Apps*, select it and click *Upgrade*. - Finally, make sure the following module *l10n_fr_sale_closing* - is installed. - -.. _localization/france/anti-fraud-features: +.. _localizations/france/pos-anti-fraud-features: Anti-fraud features -------------------- +~~~~~~~~~~~~~~~~~~~ The anti-fraud module introduces the following features: -- **Inalterability**: deactivation of all the ways to cancel or modify - key data of POS orders, invoices and journal entries; -- **Security**: chaining algorithm to verify the inalterability; -- **Storage**: automatic sales closings with computation of both period - and cumulative totals (daily, monthly, annually). +- :ref:`Inalterability ` +- :ref:`Security ` +- :ref:`Storage ` -.. _localization/france/anti-fraud-inalterability: +.. _localizations/france/pos-inalterability: Inalterability -~~~~~~~~~~~~~~ +************** -All the possible ways to cancel and modify key data of paid POS orders, -confirmed invoices and journal entries are deactivated, -if the company is located in France or in any DOM-TOM. +All methods to cancel or modify key data in POS orders, invoices, and journal entries are +deactivated for companies located in France or any DOM-TOM. .. note:: + In a multi-company environment, only the documents of such companies are impacted. - If you run a multi-companies environment, only the documents of such companies are impacted. - -.. _localization/france/anti-fraud-security: +.. _localizations/france/pos-security: Security -~~~~~~~~ - -To ensure inalterability, every order or journal entry is encrypted -upon validation. -This number (or hash) is calculated from the key data of the document as -well as from the hash of the precedent documents. +******** -The module introduces an interface to test the data inalterability. -If any information is modified on a document after its validation, -the test will fail. The algorithm recomputes all the hashes and compares them -against the initial ones. In case of failure, the system points out the first +To ensure inalterability, every order or journal entry is encrypted upon validation. This number +(or hash) is calculated from the document's key data and the hash of the precedent documents. The +module introduces an interface to test the data's inalterability. The test will fail if any +information is modified on a document after its validation. The algorithm recomputes all the hashes +and compares them against the initial ones. In case of failure, the system points out the first corrupted document recorded in the system. -Users with *Manager* access rights can launch the inalterability check. -For POS orders, go to -:menuselection:`Point of Sales --> Reporting --> French Statements`. -For invoices or journal entries, -go to :menuselection:`Invoicing/Accounting --> Reporting --> French Statements`. +Only users with :doc:`administrator ` access rights can +initiate the inalterability check: -.. _localization/france/anti-fraud-storage: +- For POS orders, go to :menuselection:`Point of Sales --> Reporting --> POS Inalterability Check`; +- For journal entries, go to :menuselection:`Invoicing/Accounting --> Configuration --> Settings`. + In the :guilabel:`Reporting` section, click :guilabel:`Download the Data Inalterability Check + Report`. + +.. _localizations/france/pos-storage: Storage -~~~~~~~ +******* -The system also processes automatic sales closings on a daily, monthly -and annual basis. -Such closings distinctly compute the sales total of the period as well as -the cumulative grand totals from the very first sales entry recorded -in the system. +The system also processes automatic sales closings daily, monthly, and annually. Such closings +compute the sales total for the period and the cumulative grand totals from the very first sales +entry recorded in the system. -Closings can be found in the *French Statements* menu of Point of Sale, -Invoicing and Accounting apps. +To access closings, either go to :menuselection:`Point of Sales --> Reporting --> Sales Closings` or +:menuselection:`Invoicing/Accounting --> Reporting --> Sales Closings`. .. note:: - - - Closings compute the totals for journal entries of sales journals (Journal Type = Sales). - - - For multi-companies environments, such closings are performed by company. - - - POS orders are posted as journal entries at the closing of the POS session. - Closing a POS session can be done anytime. - To prompt users to do it on a daily basis, the module prevents from resuming - a session opened more than 24 hours ago. - Such a session must be closed before selling again. - - - A period’s total is computed from all the journal entries posted after the - previous closing of the same type, regardless of their posting date. - If you record a new sales transaction for a period already closed, - it will be counted in the very next closing. + - Closings compute the totals for journal entries of sales journals (Journal Type = Sales). + - For multi-companies environments, such closings are performed by company. + - POS orders are posted as journal entries at the closing of the POS session. Closing a POS + session can be done anytime. To prompt users to do it daily, the module prevents them from + resuming a session that was opened more than 24 hours ago. Such a session must be closed before + selling again. + - A period’s total is computed from all the journal entries posted after the previous closing of + the same type, regardless of their posting date. Recording a new sales transaction for a + period already closed will be counted in the very next closing. .. tip:: + For test & audit purposes, closings can be manually generated in :ref:`developer mode + `. To do so, go to :menuselection:`Settings --> Technical --> Scheduled Actions`. + In the scheduled actions list view, open the desired :guilabel:`Sale Closing` action and click + :guilabel:`Run manually`. - - For test & audit purposes such closings can be manually generated in the - :ref:`developer mode `. - - Then go to :menuselection:`Settings --> Technical --> Automation --> Scheduled Actions`. - -.. _localization/france/anti-fraud-responsibilities: +.. _localizations/france/pos-responsibilities: Responsibilities ----------------- - -Do not uninstall the module! If you do so, the hashes will be reset and none -of your past data will be longer guaranteed as being inalterable. +~~~~~~~~~~~~~~~~ -Users remain responsible for their Odoo instance and must use it with -due diligence. It is not permitted to modify the source code which guarantees -the inalterability of data. +Uninstalling this module will reset the security hashes. This means the system will no longer +guarantee the integrity of the past data. -Odoo absolves itself of all and any responsibility in case of changes -in the module’s functions caused by 3rd party applications not certified by Odoo. - -.. _localization/france/anti-fraud-more-info: - -More information ----------------- - -You can find more information about this legislation in the following official documents. - -.. seealso:: +Users are responsible for their Odoo system and must operate it carefully. Modifying source code +responsible for ensuring data integrity is not allowed. - - `Frequently Asked Questions - `_ - - `Official Statement - `_ - - `Item 88 of Finance Law 2016 - `_ +Odoo is not responsible for any issues with this module's functionality if caused by uncertified +third-party applications. diff --git a/content/applications/finance/fiscal_localizations/germany.rst b/content/applications/finance/fiscal_localizations/germany.rst index c25da2f013..18acdf550e 100644 --- a/content/applications/finance/fiscal_localizations/germany.rst +++ b/content/applications/finance/fiscal_localizations/germany.rst @@ -5,10 +5,6 @@ Germany Accounting ========== -.. seealso:: - :doc:`Documentation on e-invoicing's legality and compliance in Germany - <../accounting/customer_invoices/electronic_invoicing/germany>` - Chart of accounts ----------------- diff --git a/content/applications/finance/fiscal_localizations/guatemala.rst b/content/applications/finance/fiscal_localizations/guatemala.rst new file mode 100644 index 0000000000..1b9e0418bd --- /dev/null +++ b/content/applications/finance/fiscal_localizations/guatemala.rst @@ -0,0 +1,291 @@ +========= +Guatemala +========= + +.. |SAT| replace:: :abbr:`SAT (Superintendencia de Administración Tributaria)` +.. |EDI| replace:: :abbr:`EDI (Electronic Data Interchange)` +.. |UUID| replace:: :abbr:`UUID (Universally Unique Identifier)` + +.. _guatemala/intro: + +Introduction +============ + +With the Guatemalan localization, you can connect to the tax authority Superintendencia de +Administración Tributaria (SAT) to generate electronic documents with its XML, fiscal folio, and +electronic signature. + +The supported documents are: + +- :guilabel:`FACT-Factura`, +- :guilabel:`FCAM-Factura Cambiaria`, +- :guilabel:`FPEQ-Factura de Pequeño Contribuyente`, +- :guilabel:`NCRE-Credit Note`, +- :guilabel:`NDEB-Debit Note`, +- :guilabel:`NABN-Nota de Abono`, +- :guilabel:`FCAP-Factura Cambiaria Pequeño Contribuyente`, +- :guilabel:`FACT-Factura with Export Complement`. + +The localization requires an `Infile `_ account, which enables users to +generate electronic documents within Odoo. + +.. seealso:: + :doc:`Documentation on e-invoicing's legality and compliance in Guatemala + <../accounting/customer_invoices/electronic_invoicing/guatemala>` + +Glossary +-------- + +The following terms are used throughout the Guatemalan localization: + +- **SAT**: *Superintendencia de Administración Tributaria* is the government entity responsible for + enforcing tax payments in Guatemala. +- **FEL**: *Factura Electrónica en Línea* is the electronic invoicing system mandated by the SAT in + Guatemala, which requires businesses to issue and manage electronic documents in compliance with + local regulations. +- **EDI**: *Electronic Data Interchange* refers to the sending of electronic documents. +- **Infile**: is the third-party organization that facilitates the interchange of electronic + documents between companies and the Guatemalan government. +- **UUID**: *Universally Unique Identifier* is a unique alphanumeric code assigned by the SAT to + each certified electronic document in the FEL system, used for traceability and official + validation. +- **Phrases**: Type of Phrases with specific Scenario Codes are used in the Guatemalan localization + to comply with the requirements of the SAT. They should be added depending on the issuer regime, + receiver, and operation type. These phrases are used in the XML and PDF documents. +- **Establishment Code**: A unique identifier assigned by the SAT to each business establishment, + which is required for electronic invoicing. +- **Quetzal**: The official currency of Guatemala, represented by the symbol GTQ. This is the base + currency for all financial transactions in the Guatemalan localization. + +Configuration +============= + +Modules installation +-------------------- + +:ref:`Install ` the following modules to get all the features of the Guatemalan +localization: + +.. list-table:: + :header-rows: 1 + :widths: 25 25 50 + + * - Name + - Technical name + - Description + * - :guilabel:`Guatemala - Accounting` + - `l10n_gt` + - The default :doc:`fiscal localization package <../fiscal_localizations>`. It adds accounting + characteristics for the Guatemalan localization, which represent the minimum configuration + required for a company to operate in Guatemala according to the guidelines set by the |SAT|. + The module's installation automatically loads the chart of accounts and taxes. + * - :guilabel:`Guatemala Accounting EDI` + - `l10n_gt_edi` + - Includes all the technical and functional requirements to generate and validate + :doc:`Electronics Documents <../accounting/customer_invoices/electronic_invoicing>`, based on + the technical documentation published by the |SAT|. The authorized documents are :ref:`listed + above `. + +.. note:: + Odoo automatically installs the base module **Guatemala - Accounting** when a database is + installed with `Guatemala` selected as the country. However, to enable electronic invoicing, the + **Guatemala Accounting EDI** (`l10n_gt_edi`) module needs to be manually :ref:`installed + `. + +Company +------- + +To configure your company information, open the **Settings** app, scroll down to the +:guilabel:`Companies` section, click :guilabel:`Update Info`, and configure the following: + +- :guilabel:`Company Name` +- :guilabel:`Address`, including the :guilabel:`Street`, :guilabel:`City`, :guilabel:`State`, + :guilabel:`ZIP`, and :guilabel:`Country` +- :guilabel:`Tax ID`: Enter the identification number for the selected taxpayer type. +- :guilabel:`VAT Affiliation`: Select the VAT affiliation for the company, which is the type of + Regime the company belongs to. +- :guilabel:`Legal Name`: The legal name of the company, which is used in the XML and PDF documents. +- :guilabel:`Establishment Code`: A necessary part of the XML when creating an electronic document. + If this field is not set, all electronic documents will be rejected. + + To locate the :guilabel:`Establishment Code` in your `SAT account `_, + go to :menuselection:`FEL --> Administración de Establecimientos`. The list of registered + establishments is displayed along with their corresponding codes. + +.. important:: + After configuring the company in the database settings, navigate to the company's contact form + and verify that the :guilabel:`Identification Number` :guilabel:`Type` is set to :guilabel:`NIT`. + +Electronic invoicing credentials +-------------------------------- + +In Guatemala, electronic invoicing is mandatory for most businesses. Odoo connects with the +authorized provider, Infile, to generate and submit electronic documents to the |SAT| for +validation. + +Before issuing electronic documents, you must configure and connect Odoo to Infile to ensure they +are properly validated and assigned an official |UUID|. + +Infile +~~~~~~ + +Sign a service agreement directly with `Infile `_. Infile will then provide +the necessary credentials to input in Odoo. + +Odoo +~~~~ + +In Odoo, once you have completed the Infile process, navigate to :menuselection:`Accounting --> +Configuration --> Settings`, scroll down to the :guilabel:`Guatemalan Localization` section, then +follow these steps: + +#. Select the :guilabel:`Infile Web Services` environment, either :guilabel:`Test` or + :guilabel:`Production`. +#. Enter the :guilabel:`Infile Credentials`: + + - :guilabel:`Infile WS Username or Prefix` + - :guilabel:`Infile Token` + - :guilabel:`Infile Key` + +#. Click on :guilabel:`Save`. + +.. note:: + The :guilabel:`Infile Credentials` are provided by Infile and are required for both test and + production environments. If they are not available, contact Infile support. + +.. tip:: + The demo environment is for testing only and does not generate legal documents, |UUID| keys, or + fiscal folios. No Infile account or credentials are needed to use the demo environment. + +Multi-currency +~~~~~~~~~~~~~~ + +The official currency exchange rate in Guatemala is provided by the Bank of Guatemala. Odoo can +connect directly to its services and get the currency rate either automatically or manually. + +.. seealso:: + :doc:`Multi-currencies <../accounting/get_started/multi_currency>` + +Master data +----------- + +Chart of accounts +~~~~~~~~~~~~~~~~~ + +The :doc:`chart of accounts <../accounting/get_started/chart_of_accounts>` is installed by default +as part of the set of data included in the localization module, the accounts are mapped +automatically in taxes, default accounts payable, and default accounts receivable. + +Accounts can be added or deleted according to the company's needs. + +Contacts +~~~~~~~~ + +The following fields must be completed on contact forms: + +- :guilabel:`Company Name` +- :guilabel:`Address`, including the :guilabel:`Street`, :guilabel:`City`, :guilabel:`State`, + :guilabel:`ZIP`, and :guilabel:`Country` +- :guilabel:`Identification Number`: + + - :guilabel:`Type`: Select an identification type. + - :guilabel:`Number`: Required to confirm an electronic invoice. + +.. note:: + To automatically include a specific phrase in the XML and PDF of every electronic invoice for a + contact, select it in :guilabel:`Phrases` field in the :guilabel:`Sales & purchase` tab of the + contact form. + +Taxes +~~~~~ + +As part of the Guatemala localization module, taxes are automatically created with their configuration +and related financial accounts. + +Electronic invoices +=================== + +Once the database has been configured successfully, electronic documents can be created and sent. + +Once :doc:`customer invoices <../accounting/customer_invoices>` are validated, they can be sent +electronically to |SAT| via Infile, provided the following fields are completed: + +- :guilabel:`Customer`: Type the customer's information. +- :guilabel:`GT Document Type`: Select the type of document you want to create, i.e., + :guilabel:`FACT - Factura Electrónica` or :guilabel:`FCAM - Factura Cambiara`. By default, the + document type is set to :guilabel:`FACT`. +- :guilabel:`Due date`: To compute if the invoice is due now or later. +- :guilabel:`Journal`: Select the sales journal. +- :guilabel:`Products`: Specify the product(s) with the correct taxes. + +When done, click :guilabel:`Confirm`. + +.. note:: + If you need to add a specific phrase based on the transaction, go to the :guilabel:`Other Info` + tab and add the corresponding phrase in :guilabel:`GT Phrases`. These phrases are used in the XML + and PDF documents. + +.. note:: + If you need to add an addendum to the invoice, you can do so in the :guilabel:`Terms and + Conditions` field. The addendum will be included in the XML document and can be used to provide + additional information or notes related to the invoice. + +After the invoice confirmation, click :guilabel:`Send`. In the wizard that appears, make sure to +enable the :guilabel:`Send to SAT` and :guilabel:`by Email` checkboxes to send the XML to the |SAT| +through Infile's web service and the validated invoice to the client's email, and click +:guilabel:`Send`. Then, the following occurs: + +- The XML document is created. +- The |UUID| is generated. +- The XML is processed synchronously by Infile. + + - If accepted, the file is displayed in the chatter, and the email to the client with the + corresponding :file:`pdf` and :file:`xml` file is sent. + - If the file contains errors, a warning message displays the reason(s) and the email is not sent. + +.. image:: guatemala/pdf-xml-chatter-guatemala.png + :alt: EDI documents available in the chatter. + +The :guilabel:`SAT` tab then displays the following: + +- :guilabel:`Datetime`: Timestamp recorded of the XML creation. +- :guilabel:`GT Status`: Status result obtained in the |SAT| response. If the file contains errors, + a warning message displays the reason(s) and the email is not sent. +- :guilabel:`UUID`: The unique identifier assigned by the |SAT| to the electronic document. +- :guilabel:`Download Certificate`: To download the sent XML file, even if the |SAT| result was + rejected. + +.. image:: guatemala/sat-tab-electronic-document.png + :alt: EDI document record available in SAT tab. + +.. _localization/guatemala/credit-notes: + +Debit and credit notes +---------------------- + +To send a debit or credit note to Infile, first create the :ref:`debit +` or :ref:`credit note +`. + +Then, in the :guilabel:`Send` window, click :guilabel:`Send to SAT (Guatemalan EDI)` to submit it +for real-time validation. Upon successful validation, the QR code from Infile is embedded in the +debit or credit note PDF. + +Export invoices +--------------- + +Exportation invoices must meet the following conditions: + +- The customer's :guilabel:`Identification type` must be :guilabel:`VAT`, :guilabel:`Passport`, or + :guilabel:`Foreign ID`. +- The following fields must be defined in the customer invoice's :guilabel:`Other Info` tab, under + the :guilabel:`Accounting` section: + + - :guilabel:`Incoterm` + - :guilabel:`GT Phrases`: :guilabel:`Type 4 Code 1` + - :guilabel:`Consignatory Company` + +- All invoice lines must include taxes set to 0%. + +.. image:: guatemala/l10n-gt-factura-de-cliente.png + :alt: Exportation invoices main data. diff --git a/content/applications/finance/fiscal_localizations/guatemala/guatemala-exp-invoice.png b/content/applications/finance/fiscal_localizations/guatemala/guatemala-exp-invoice.png new file mode 100644 index 0000000000..2086028404 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/guatemala/guatemala-exp-invoice.png differ diff --git a/content/applications/finance/fiscal_localizations/guatemala/l10n-gt-factura-de-cliente.png b/content/applications/finance/fiscal_localizations/guatemala/l10n-gt-factura-de-cliente.png new file mode 100644 index 0000000000..5c9c40a8e3 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/guatemala/l10n-gt-factura-de-cliente.png differ diff --git a/content/applications/finance/fiscal_localizations/guatemala/pdf-xml-chatter-guatemala.png b/content/applications/finance/fiscal_localizations/guatemala/pdf-xml-chatter-guatemala.png new file mode 100644 index 0000000000..2e5fdf90c2 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/guatemala/pdf-xml-chatter-guatemala.png differ diff --git a/content/applications/finance/fiscal_localizations/guatemala/sat-tab-electronic-document.png b/content/applications/finance/fiscal_localizations/guatemala/sat-tab-electronic-document.png new file mode 100644 index 0000000000..9248500b11 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/guatemala/sat-tab-electronic-document.png differ diff --git a/content/applications/finance/fiscal_localizations/italy.rst b/content/applications/finance/fiscal_localizations/italy.rst index 74da3f9fc8..466fed7e5e 100644 --- a/content/applications/finance/fiscal_localizations/italy.rst +++ b/content/applications/finance/fiscal_localizations/italy.rst @@ -592,33 +592,22 @@ Process .. _italy/digital-signature: -Digital qualified signature -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -For invoices and bills intended for the :abbr:`PA (Public Administration)`, a **Digital Qualified -Signature** is required for all files sent through the :abbr:`SdI (Sistema di Interscambio)`. The -XML file must be certified using a certificate that is either: +Qualified electronic signature +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- a **smart card**; -- a **USB token**; -- an :abbr:`HSM (Hardware Security Module)`. +Invoices and bills intended for the :abbr:`PA (Public Administration)` must include a **qualified +electronic signature** when submitted through the :abbr:`SdI (Sistema di Interscambio)`. This +signature is automatically applied in the :abbr:`XAdES (XML Advanced Electronic Signature)` format +when the invoice's partner has a 6-digit long :guilabel:`Destination Code` (which indicates a +:abbr:`PA (Public Administration)` business). -.. warning:: - Odoo **cannot** digitally sign documents for you. When a 6-digit long :guilabel:`Codice - Destinatario` is detected, then the :abbr:`EDI (Electronic Data Interchange)` process stops, and - the invoice is set on the :guilabel:`Requires user signature` state. You can download the - document in XML, sign it with any :guilabel:`Digital Qualified Signature` provider's external - program and send it through the :abbr:`AdE (Agenzia Delle Entrate)` portal. +.. note:: + When such an invoice is transmitted to the Tax Agency, the generated `.xml` file is signed on the + Odoo servers, returned to the database, and attached to the invoice automatically. Acceptance or Refusal ~~~~~~~~~~~~~~~~~~~~~ -.. warning:: - As Odoo does not handle sending signed invoices to :abbr:`PA (Public Administration)` businesses, - these states cannot be directly triggered by Odoo. When you upload the invoice on the :abbr:`AdE - (Agenzia Delle Entrate)` portal, Odoo receives notifications about it, putting the correct - :guilabel:`SdI State` on the invoice. - After receiving the invoice through the :abbr:`SdI (Sistema di Interscambio)`, the :abbr:`PA (Public Administration)` business has 15 days to accept the invoice. If it does, then the process ends here. If the :abbr:`PA (Public Administration)` business refuses the invoice, it is still considered valid @@ -684,7 +673,7 @@ To set up the fiscal printer using the keyboard, follow these steps: #. Make sure the fiscal printer is set to its default state: printer on, start-up cycle complete, and no transaction in progress. #. Type `3333`. -#. Press :guilabel:`Chiave`. The screen displays :guilabel:`Scleta Funzione`. +#. Press :guilabel:`Chiave`. The screen displays :guilabel:`Scelta Funzione`. #. Type `34`. The screen displays :guilabel:`Web Server`. #. Press :guilabel:`Contante` 3 times until the screen displays :guilabel:`Web Server: SSL`. #. To turn the value `0` into a `1`, press :guilabel:`X`. diff --git a/content/applications/finance/fiscal_localizations/kenya.rst b/content/applications/finance/fiscal_localizations/kenya.rst index b84f1c3a14..ddb7f6b97e 100644 --- a/content/applications/finance/fiscal_localizations/kenya.rst +++ b/content/applications/finance/fiscal_localizations/kenya.rst @@ -148,20 +148,17 @@ Multi-company :doc:`../../general/companies` If you have :ref:`multiple companies `, you can centralize and manage them -all on a single Odoo database. The KRA identifies and differentiates the **main** company from -its **subsidiaries** by using IDs. Furthermore, subsidiaries are classified as **branches** of the -main company. +all on a single Odoo database. The KRA identifies and differentiates the **parent** company from +its **subsidiaries** by using IDs. Furthermore, subsidiaries are classified as :ref:`branches +` of the parent company. To configure the company's ID, open the **Settings** app, click :guilabel:`Update Info` in the -:guilabel:`Companies` section, and search for the :guilabel:`eTIMS Branch Code` field. The **main +:guilabel:`Companies` section, and search for the :guilabel:`eTIMS Branch Code` field. The **parent company** has a branch ID equal to `00` in a multi-company environment. Companies that are *not* the -main company have a branch ID other than `00` and are assigned an ID by the KRA. +parent company have a branch ID other than `00` and are assigned an ID by the KRA. -To add a branch, go to the :guilabel:`Branches` tab in the **company settings** and click -:guilabel:`Add a line`. - -To fetch the **branch ID** from the KRA for your non-main companies, ensure the main company has a -Kenyan :guilabel:`Tax ID` and the OSCU device has been :ref:`initialized `. +To fetch the **branch ID** from the KRA for your non-parent companies, ensure the parent company has +a Kenyan :guilabel:`Tax ID` and the OSCU device has been :ref:`initialized `. Then, go to the :guilabel:`Branches` tab and click :guilabel:`Populate from KRA`. .. note:: @@ -184,29 +181,29 @@ KRA sequences .. important:: Odoo invoice sequences and KRA sequences are **different**. -In Odoo, invoice sequences depend on the **main company**. Main companies can see the invoices of -branches, but branches **cannot** see the main company's invoices or those of other branches. +In Odoo, invoice sequences depend on the **parent company**. Parent companies can see the invoices +of branches, but branches **cannot** see the parent company's invoices or those of other branches. The KRA needs **independent** sequences per branch. Therefore, Odoo manages sequences individually per branch. .. example:: - If you have a main company with two branches, the invoice sequence would be the following: + If you have a parent company with two branches, the invoice sequence would be the following: - Creating an invoice on **branch 1**: INV/2024/00001; - Creating an invoice on **branch 2**: INV/2024/00002; - - Creating an invoice on the **main company**: INV/2024/00003. + - Creating an invoice on the **parent company**: INV/2024/00003. This is how Odoo manages sequences to be compliant with the KRA regulations: - Creating an invoice on **branch 1**: INV/2024/00001; - Creating an invoice on **branch 2**: INV/2024/00001; - - Creating an invoice on the **main company**: INV/2024/00001. + - Creating an invoice on the **parent company**: INV/2024/00001. Insurance ========= -For **health service providers**, you can send insurance information about the main and branch +For **health service providers**, you can send insurance information about the parent and branch companies and update it in eTIMS. To do so, go to :menuselection:`Accounting --> Configuration --> Settings`, scroll to the :guilabel:`Kenya eTIMS Integration` section, and fill in the :guilabel:`Code`, :guilabel:`Name`, and :guilabel:`Rate` fields. Click :guilabel:`Send Insurance @@ -246,9 +243,9 @@ internal operations or stock adjustments; therefore, Odoo automatically sends th of the following conditions are met: #. No contact is set for the move; -#. The contact is your main company or a branch of the main company. +#. The contact is your parent company or a branch of the parent company. -If the stock moves are **external operations** (e.g., to contacts that are not part of the main +If the stock moves are **external operations** (e.g., to contacts that are not part of the parent company or its branches), the stock moves are automatically sent *after* the invoice is sent to eTIMS. diff --git a/content/applications/finance/fiscal_localizations/malaysia.rst b/content/applications/finance/fiscal_localizations/malaysia.rst index cdb4e280ea..25ff8719f8 100644 --- a/content/applications/finance/fiscal_localizations/malaysia.rst +++ b/content/applications/finance/fiscal_localizations/malaysia.rst @@ -58,8 +58,6 @@ and select it. Then configure the following fields: - :guilabel:`TTx`: Malaysian Tourism Tax Number, if applicable - :guilabel:`Phone` -.. _malaysia/myinvois: - E-invoicing integration with MyInvois ===================================== @@ -107,7 +105,7 @@ portal to grant Odoo the **right to invoice** as an intermediary for your compan - :guilabel:`Name`: - :guilabel:`Production`: `ODOO S.A.` - - :guilabel:`Pre-production`: `OXXX_XXXXO S.A.` + - :guilabel:`Pre-production`: `OXXX_XXXXA.` #. Grant the following permissions by clicking the :icon:`fa-toggle-on` :guilabel:`(toggle-on)` icon: @@ -134,31 +132,45 @@ Configuration in Odoo .. _malaysia/myinvois/setup/odoo/einvoicing: +Company +******* + +Open the Settings app, navigate to the :guilabel:`Companies` section, and click +:guilabel:`Update Info`. Make sure the :guilabel:`Tax ID` is entered and complete the following +fields in the :guilabel:`E-invoicing` section: + + - :guilabel:`Identification`: Select the :guilabel:`ID Type` and enter the associated + :guilabel:`Identification number` used to register for the digital certificate. + - :guilabel:`Ind. Classification`: Input the 5-digit numeric code that represents the nature and + activity of the business. + Electronic invoicing ******************** Go to :menuselection:`Accounting --> Configuration --> Settings`. In the -:guilabel:`Malaysian Electronic Invoicing` section, choose the relevant :guilabel:`MyInvois mode` -based on the environment you used to register on MyInvois. +:guilabel:`Malaysian Electronic Invoicing` section, select the relevant :guilabel:`MyInvois mode` +based on the environment used for the company's MyInvois registration. Make sure to allow Odoo to process e-invoices by checking the box, then click :guilabel:`Register`. .. note:: - To change the TIN reference, click :guilabel:`Unregister`, change the company's information and - make sure the number registered on MyInvois matches, then :guilabel:`Register` again. + To change the :abbr:`TIN (tax identification number)` reference, click :guilabel:`Unregister`, + change the company's information and make sure the number registered on MyInvois matches, then + :guilabel:`Register` again. -.. _malaysia/myinvois/setup/odoo/company: +.. important:: + For taxpayers with a :abbr:`TIN (tax identification number)` starting with "IG" and a + :abbr:`ROB (registration of business)` number, combine the TIN and ROB in the **TIN:ROB** format + for the :guilabel:`Tax ID` field. -Company -******* + To register, go to :menuselection:`Accounting --> Configuration --> Settings`, and in the + :guilabel:`Malaysian Electronic Invoicing` section, click :guilabel:`Register`. Once the + registration is complete, the **:ROB** can be removed from the :guilabel:`Tax ID`. -Open the Settings app, and in the :guilabel:`Companies` section, click :guilabel:`Update Info`. Then, -in the :guilabel:`E-invoicing` section, fill in the following fields: + Additionally, remember to log into `MyTax account `_ and set the + :guilabel:`Type of Role` as :guilabel:`Business Owner`. - - :guilabel:`Identification`: The :guilabel:`ID Type` and associated :guilabel:`Identification - number` used to register for the digital certificate. - - :guilabel:`Ind. Classification`: The 5-digit numeric code that represents the nature and - activity of the business. +.. _malaysia/myinvois/setup/odoo/company: Contacts ******** @@ -181,6 +193,20 @@ All products to be included in e-invoices require a Malaysian classification cod access the :guilabel:`Product` form and in the :guilabel:`General Information` tab, fill in the :guilabel:`Malaysian classification code` field. +Malaysian tax type +****************** + +To configure a tax's :guilabel:`Malaysian Tax Type` field, go to :menuselection:`Accounting --> +Configuration --> Accounting --> Taxes` and open the relevant tax in the :guilabel:`Taxes` list +view. + +When an invoice or bill includes a tax with the :guilabel:`Malaysian Tax Type` set to +**Tax Exempt**, a :guilabel:`Tax Exemption Reason` must be specified in the :guilabel:`MyInvois` +tab before the document is sent. + +.. image:: malaysia/myinvois-tax-exemption-reason.png + :alt: MyInvois tax exemption reason + .. _malaysia/myinvois/workflow: Workflow @@ -191,23 +217,40 @@ Workflow Send invoices to MyInvois ~~~~~~~~~~~~~~~~~~~~~~~~~ -Invoices can be sent to MyInvois once they have been confirmed. To do so, follow the -:ref:`invoice sending ` steps, and in the :guilabel:`Send` window, -enable the :guilabel:`Send to MyInvois` option and click :guilabel:`Print & Send`. +Invoices can be sent to MyInvois once they have been confirmed. To do so, click +:guilabel:`Send to MyInvois`. + +Send bills to MyInvois +~~~~~~~~~~~~~~~~~~~~~~ + +Sending a bill to MyInvois is necessary when issuing an e-Invoice on behalf of a supplier. Once a +bill is confirmed, click :guilabel:`Send To MyInvois`. + +.. note:: + - In `MyInvois `_, these vendor bills are + categorized as :guilabel:`Self-billed Invoice`. + + - If a :guilabel:`Bill Reference` field is empty, Odoo's vendor bill number is used as the + MyInvois number. If a reference is entered in the :guilabel:`Bill Reference` field, that + reference is used instead. .. _malaysia/myinvois/workflow/sending/status: MyInvois status *************** -In the :guilabel:`MyInvois` tab of the invoice, the :guilabel:`MyInvois State` is updated to -:guilabel:`Valid` when the submission to MyInvois is successful. The :guilabel:`Submission UID`, -:guilabel:`MyInvois` and :guilabel:`Validation Time` are also updated. -The same information is available on MyInvois. +The current MyInvois status of an invoice or bill is shown in the :guilabel:`MyInvois State` field +within the :guilabel:`MyInvois` tab. + + - :guilabel:`Validation in Progress`: the validation is being processed by MyInvois. A blue + :guilabel:`Processing` banner is also displayed. + - :guilabel:`Valid`: it is validated by MyInvois. The :guilabel:`Submission UID`, + :guilabel:`MyInvois` and :guilabel:`Validation Time` are automatically updated with information + from MyInvois. .. note:: - If no information is received from the MyInvois portal, the :guilabel:`MyInvois State` is - :guilabel:`In Progress`. In this case, Odoo automatically checks and updates the status. + Odoo :doc:`automatically checks and updates <../../sales/subscriptions/scheduled_actions>` the + status every hour. To update it manually at any time, click :guilabel:`Update MyInvois Status`. .. _malaysia/myinvois/workflow/cancellation: @@ -215,17 +258,69 @@ Invoice cancellation ~~~~~~~~~~~~~~~~~~~~ Sent invoices can be canceled within 72 hours from :guilabel:`Validation time`. In this case, open -the invoice and click :guilabel:`Request Cancel`. In the :guilabel:`Cancel document` window, include -the cancellation :guilabel:`Reason`, then click :guilabel:`Update Invoice`. The +the invoice and click :guilabel:`Request Cancel`. In the :guilabel:`Cancel document` window, +include the cancellation :guilabel:`Reason`, then click :guilabel:`Update Invoice`. The :guilabel:`MyInvois State` is updated to :guilabel:`cancelled`. +Send credit notes to MyInvois +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Before sending a credit note, the original invoice must be successfully submitted to MyInvois. +Otherwise, the credit note's :guilabel:`MyInvois State` is updated to :guilabel:`Invalid`. + +While Odoo uses a single :guilabel:`credit note` document, MyInvois categorizes these into two +types: :guilabel:`credit note` and :guilabel:`refund note`, depending on how they are reconciled. + +- :guilabel:`MyInvois Credit Note`: This is created when an Odoo credit note is reconciled with the + original invoice. +- :guilabel:`MyInvois Refund Note`: This is created when an Odoo credit note is reconciled with a + full payment instead of the original invoice. + +.. note:: + If a credit note is reconciled with only a partial payment before being sent, it is still + categorized as a :guilabel:`credit note` in MyInvois. + +.. tip:: + To issue both a credit note and a refund note for the same original invoice: + - Create two separate credit notes in Odoo from the original invoice. + - For a MyInvois :guilabel:`Refund Note`: Register a payment before sending it. + - For a MyInvois :guilabel:`Credit Note`: Do not register a payment before sending it. + +.. note:: + The same logic applies to credit notes created from bills: if reconciled with a full payment, + the credit note becomes a :guilabel:`Self-billed Refund Note`; otherwise, it becomes a + :guilabel:`Self-billed Credit Note`. + +Send debit notes to MyInvois +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:ref:`Issue a debit note from an existing bill or invoice ` +and click :guilabel:`Send To MyInvois`. In MyInvois, it appears then as a :guilabel:`Debit Note` if +issued from an invoice or a :guilabel:`Self-billed Debit Note` from a vendor bill. + +Access invoices via QR code +--------------------------- + +When a document is successfully submitted to MyInvois, a QR code is added to its PDF version. +Scanning this code links directly to the validated document in MyInvois. + +To download the PDF from an invoice or bill: + +#. Click the :icon:`fa-cog` :guilabel:`(gear)` icon +#. Select :guilabel:`Download` +#. Choose either :guilabel:`PDF` or :guilabel:`PDF without Payment` + +.. image:: malaysia/myinvois-qr-code.png + :alt: MyInvois QR code + .. _malaysia/employment-hero: Employment Hero payroll ======================= -If your business is already up and running with :doc:`Employment Hero `, you can -use our connector as an alternative payroll solution. +If your business is already up and running with :doc:`Employment Hero +<../../hr/payroll/payroll_localizations/employment_hero>`, you can use our connector as an +alternative payroll solution. .. important:: To :ref:`configure the Employment Hero API ` for **Malaysia**, use diff --git a/content/applications/finance/fiscal_localizations/malaysia/myinvois-add-intermediary.png b/content/applications/finance/fiscal_localizations/malaysia/myinvois-add-intermediary.png index ca68b20c24..3964b5cb5f 100644 Binary files a/content/applications/finance/fiscal_localizations/malaysia/myinvois-add-intermediary.png and b/content/applications/finance/fiscal_localizations/malaysia/myinvois-add-intermediary.png differ diff --git a/content/applications/finance/fiscal_localizations/malaysia/myinvois-intermediary-active.png b/content/applications/finance/fiscal_localizations/malaysia/myinvois-intermediary-active.png index 1a20137295..9906b52a61 100644 Binary files a/content/applications/finance/fiscal_localizations/malaysia/myinvois-intermediary-active.png and b/content/applications/finance/fiscal_localizations/malaysia/myinvois-intermediary-active.png differ diff --git a/content/applications/finance/fiscal_localizations/malaysia/myinvois-qr-code.png b/content/applications/finance/fiscal_localizations/malaysia/myinvois-qr-code.png new file mode 100644 index 0000000000..30154fd35a Binary files /dev/null and b/content/applications/finance/fiscal_localizations/malaysia/myinvois-qr-code.png differ diff --git a/content/applications/finance/fiscal_localizations/malaysia/myinvois-tax-exemption-reason.png b/content/applications/finance/fiscal_localizations/malaysia/myinvois-tax-exemption-reason.png new file mode 100644 index 0000000000..8468222f62 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/malaysia/myinvois-tax-exemption-reason.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico.rst b/content/applications/finance/fiscal_localizations/mexico.rst index 471c3c239d..676444fd62 100644 --- a/content/applications/finance/fiscal_localizations/mexico.rst +++ b/content/applications/finance/fiscal_localizations/mexico.rst @@ -2,72 +2,22 @@ Mexico ====== -.. _sat-catalog: http://omawww.sat.gob.mx/tramitesyservicios/Paginas/catalogos_emision_cfdi_ - complemento_ce.htm - .. |SAT| replace:: :abbr:`SAT (Servicio de Administración Tributaria)` .. |DIOT| replace:: :abbr:`DIOT (Declaración Informativa de Operaciones con Terceros)` .. |PAC| replace:: :abbr:`PAC (Proveedor Autorizado de Certificación / Authorized Certification Provider)` .. |RFC| replace:: :abbr:`RFC (Registro Federal de Contribuyentes)` -.. |PPD| replace:: :abbr:`PPD (Pago en Parcialidades o Diferido/Payment in Installements or +.. |PPD| replace:: :abbr:`PPD (Pago en Parcialidades o Diferido/Payment in Installments or Deferred)` .. |PUE| replace:: :abbr:`PUE (Pago en una Sola Exhibición/Payment in a Single Exhibition)` .. |CFDI| replace:: :abbr:`CFDI (Comprobante Fiscal Digital por Internet)` -Webinars -======== - -A video on the Mexican localization is also available. This video covers how to implement this -localization from scratch, including how to set up the configurations, how to complete common -workflows, and provides an in-depth look at several specific use cases, as well. - -- `Video webinar of a complete demo `_. - -Introduction -============ +.. _l10n/mx/modules: -The Odoo Mexican localization modules allow for the signing of electronic invoices, according to the -specifications of the |SAT| for `version 4.0 of the CFDI `_, a legal requirement, as -of January 1, 2022. These modules also add relevant accounting reports (such as: the |DIOT|, -enables foreign trade, and the creation of delivery guides). +Modules +======= -.. note:: - In order to electronically sign any documents in Odoo, ensure the *Sign* application is - installed. - -.. seealso:: - :doc:`Documentation on e-invoicing's legality and compliance in Mexico - <../accounting/customer_invoices/electronic_invoicing/mexico>` - -Configuration -============= - -Requirements ------------- - -It is necessary to meet the following requirements before configuring the Mexican localization -modules in Odoo: - -.. _mx-requirements: - -#. Be registered in the |SAT|, with a valid |RFC|. -#. Have a `Certificate of Digital Seal `_ (CSD). -#. Choose a PAC (Proveedor Autorizado de Certificación / Authorized Certification Provider). - Currently, Odoo works with the following |PAC|\s: `Solución Factible - `_, `Quadrum (formerly Finkok) `_ and - `SW Sapien - Smarter Web `_. -#. Have knowledge and experience with billing, sales, and accounting in Odoo. This documentation - **only** contains the necessary information needed to use Odoo. - -Installing modules ------------------- - -:ref:`Install ` the following modules to get all the features of the Mexican -localization. The :doc:`Accounting <../accounting>` and *Contacts* modules are required to be -installed for this configuration: +The following modules are automatically installed with the Mexican localization: .. list-table:: :header-rows: 1 @@ -78,40 +28,29 @@ installed for this configuration: - Description * - :guilabel:`Mexico - Accounting` - `l10n_mx` - - The default :doc:`fiscal localization package <../fiscal_localizations>`, adds accounting + - The default :doc:`fiscal localization package <../fiscal_localizations>` adds accounting characteristics for the Mexican localization, such as: the most common taxes and the chart of accounts – based on `the SAT account grouping code `_. * - :guilabel:`EDI for Mexico` - `l10n_mx_edi` - Includes all the technical and functional requirements to generate and validate - :doc:`Electronics Documents <../accounting/customer_invoices/electronic_invoicing>` — based + :doc:`electronics documents <../accounting/customer_invoices/electronic_invoicing>` — based on the technical documentation published by the |SAT|. This allows you to send invoices (with or without addedums) and payment complements to the government. - * - :guilabel:`EDI v4.0 for Mexico` - - `l10n_mx_edi_40` - - Necessary to create XML documents with the correct specifications of the CFDI 4.0. * - :guilabel:`Odoo Mexican Localization Reports` - `l10n_mx_reports` - - Adapts reports for Mexico's Electronic Accounting: Chart of Accounts, Trial Balance, and + - Adapts reports for Mexico's electronic accounting: chart of accounts, trial balance, and |DIOT|. - * - :guilabel:`Mexico - Localization Reports for Closing` + * - :guilabel:`Mexico - Month 13 Trial Balance` - `l10n_mx_reports_closing` - - Necessary to create the Closing Entry (Also known as the *month 13th move*). + - Necessary to create the closing entry (also known as the *month 13 move*). * - :guilabel:`Odoo Mexican XML Polizas Export` - `l10n_mx_xml_polizas` - - Allows the export of XML files of Journal Entries for a compulsory audit. - * - :guilabel:`Odoo Mexican XML Polizas Export Edi bridge` - - `l10n_mx_xml_polizas_edi` - - Complements the module `l10n_mx_xml_polizas`. + - Allows the export of XML files of journal entries for a compulsory audit. -.. note:: - When installing a database from scratch and selecting :guilabel:`Mexico` as the country, Odoo - automatically installs the following modules: :guilabel:`Mexico - Accounting`, :guilabel:`EDI for - Mexico`, and :guilabel:`EDI v4.0 for Mexico`. - -The following modules are optional. It's recommended to install them *only* if meeting a specific -requirement. Make sure that they are needed for the business. +The following modules are optional. It's recommended to :ref:`install ` them *only* +if meeting a specific requirement for the business. .. list-table:: :header-rows: 1 @@ -122,191 +61,275 @@ requirement. Make sure that they are needed for the business. - Description * - :guilabel:`EDI for Mexico (Advanced Features)` - `l10n_mx_edi_extended` - - Adds the external trade complement to invoices: A legal requirement for selling products to - foreign countries. - * - :guilabel:`EDI v4.0 for Mexico (COMEX)` - - `l10n_mx_edi_extended_40` - - Adapts the module `l10n_mx_edi_extended` for CFDI 4.0. + - Adds the external trade complement to invoices (a legal requirement for selling products to + foreign countries). * - :guilabel:`Mexico - Electronic Delivery Guide` - `l10n_mx_edi_stock` - Lets you create a *Carta Porte*: A bill of lading that proves to the government you are sending goods between A & B with a signed electronic document. - * - :guilabel:`Electronic Delivery Guide for Mexico CFDI 4.0` - - `l10n_mx_edi_stock_40` - - Adapts the module `l10n_mx_edi_stock` for CFDI 4.0 * - :guilabel:`Odoo Mexico Localization for Stock/Landing` - `l10n_mx_edi_landing` - Allows managing customs numbers related to landed costs in electronic documents. + * - :guilabel:`CFDI 4.0 fields for sale orders` + - `l10n_mx_edi_sale` + - Adds extra fields to the :doc:`Sales <../../sales/sales>` module to comply with the Mexican + Electronic Invoicing + * - :guilabel:`Mexican Localization for the Point of Sale` + - `l10n_mx_edi_pos` + - Adds extra fields to the :doc:`Point of Sale <../../sales/point_of_sale>` module to comply + with the Mexican Electronic Invoicing + * - :guilabel:`Mexican Localization for eCommerce` + - `l10n_mx_edi_website_sale` + - Adds extra fields to the :doc:`eCommerce <../../websites/ecommerce>` module to comply with + the Mexican electronic invoicing requirements + * - :guilabel:`Employees - Mexico` + - `l10n_mx_hr` + - Adds extra fields to the :doc:`Employees <../../hr/employees>` module to comply with local + information for employees. + * - :guilabel:`Mexico - Payroll with Accounting` + - `l10n_mx_hr_payroll_account` + - Adds the required rules and parameters to manage local payroll calculation with the + :doc:`Payroll <../../hr/payroll>` app. + +.. _l10n/mx/video-tutorials: + +Video tutorials +=============== + +Videos on the Mexican localization are also available. Basic workflows and most topics covered +on this page are also available in video format, please check out the following: + +- `Odoo Smart Tutorial - Mexican localization `_ +- `Basic configurations and Youtube playlist `_ + +.. _l10n/mx/overview: + +Localization overview +===================== + +The Odoo Mexican localization modules allow for the signing of electronic invoices, according to the +specifications of the |SAT| for `version 4.0 of the CFDI `_, a legal requirement, as +of January 1, 2022. These modules also add relevant accounting reports including the |DIOT|, enable +foreign trade, and enable the creation of delivery guides. -Configure your company ----------------------- +.. note:: + In order to electronically sign any documents in Odoo, the Sign application must be installed. -After installing the correct modules, the next step is to verify that your company is configured -with the correct data. To do so, go to :menuselection:`Settings --> General Settings --> Companies`, -and select :guilabel:`Update Info` under your company name. +.. seealso:: + :doc:`Documentation on e-invoicing's legality and compliance in Mexico + <../accounting/customer_invoices/electronic_invoicing/mexico>` -Enter the full :guilabel:`Address` in the resulting form, including: :guilabel:`ZIP` code, -:guilabel:`State`, :guilabel:`Country`, and |RFC| (:guilabel:`VAT` number). +.. _l10n/mx/requirements: + +Requirements +------------ + +It is necessary to meet the following requirements before configuring the Mexican localization +modules in Odoo: + +#. Be registered in the |SAT| with a valid |RFC|. +#. Have a `Certificado de Sello Digital / Digital Seal Certificate + `_ (CSD). +#. Choose a |PAC|. Currently, Odoo works with the following |PAC|\s: `Solución Factible + `_, + `Quadrum `_, and + `SW Sapien - Smarter Web `_. -According to the requirements of the CFDI 4.0, the name of the main company contact **must** -coincide with your business name registered in the |SAT|, without the legal entity abbreviation. +.. _l10n/mx/company: -.. image:: mexico/mx-company-info.png - :alt: Main company contact requirements for a correct invoicing. +Company +------- + +After installing the correct modules, the next step is to verify that the company is configured with +the correct data. To do so, go to :menuselection:`Settings --> Users & Companies --> Companies`, and +select the company to configure. + +Enter the full :guilabel:`Address` in the resulting form, including: :guilabel:`ZIP` code, +:guilabel:`State`, :guilabel:`Country`, and |RFC| (:guilabel:`Tax ID` number). + +According to the requirements of the |CFDI| 4.0, the name of the main company contact **must** +match the business name registered in the |SAT|, without the legal entity abbreviation. This is the +same for the :guilabel:`ZIP` code. .. important:: - From a legal point of view, a Mexican company **must** use the local currency (MXN). Therefore, - Odoo does not provide features to manage an alternative configuration. If you want to manage + From a legal point of view, Mexican companies **must** use the local currency (MXN). To use another currency, let MXN be the default currency and use a :doc:`pricelist - <../../sales/sales/products_prices/prices/pricing>`, instead. + <../../sales/sales/products_prices/prices/pricing>` instead. -Next, go to :menuselection:`Settings --> Accounting --> Electronic Invoicing (MX) --> Fiscal -Regime`, then select the regime that applies to your company from the drop-down list, and click -:guilabel:`Save`. - -.. image:: mexico/mx-fiscal-regime.png - :alt: Fiscal regime configuration in the Accounting settings. +Next, go to :menuselection:`Accounting --> Settings`, and scroll to the :guilabel:`MX Electronic +invoicing` section. Under :guilabel:`Service Tax Administration (SAT)`, select the :guilabel:`Fiscal +Regime` that applies to the company from the drop-down list, and click :guilabel:`Save`. .. tip:: - If you want to test the Mexican localization, the company can be configured with a real address - within Mexico (including all fields), and add `EKU9003173C9` as the :guilabel:`VAT` and `ESCUELA - KEMPER URGATE` as the :guilabel:`Company Name`. For the :guilabel:`Fiscal Regime`, use + In order to test the Mexican localization, configure the company with a real address within + Mexico (including all fields). Add `EKU9003173C9` as the :guilabel:`Tax ID` and `ESCUELA KEMPER + URGATE` as the :guilabel:`Company Name`. For the :guilabel:`Fiscal Regime`, use :guilabel:`General de Ley Personas Morales`. +.. _l10n/mx/contacts: + Contacts -------- +.. note:: + :ref:`Install ` the Contacts application to access contact records. + To create a contact that can be invoiced, go to :menuselection:`Contacts --> Create`. Then, enter -the contact name, full :guilabel:`Address` including: :guilabel:`ZIP` code, :guilabel:`State`, -:guilabel:`Country`, and |RFC| (:guilabel:`VAT` number). +the contact name, full :guilabel:`Address` including the :guilabel:`ZIP` code, :guilabel:`State`, +:guilabel:`Country`, and |RFC| (:guilabel:`Tax ID`). .. important:: - As with your own company, all of your contacts needs to have their correct business name - registered in the |SAT|. This also applies to the :guilabel:`Fiscal Regime`, which needs to be - added in the :guilabel:`MX EDI` tab. + As with your own company, all contacts must have their correct business name registered in the + |SAT|. This also applies to the :guilabel:`Fiscal Regime`, which needs to be added in the + :guilabel:`Sales & Purchase` tab. + +.. warning:: + Having a |RFC| (:guilabel:`Tax ID`) set but no :guilabel:`Country` configured may result in + incorrect invoices. + +.. _l10n/mx/taxes: Taxes ----- -Some additional configurations for factor type and tax objects need to be added to the sales taxes -in order to properly sign invoices. +In order to properly sign invoices, set the :ref:`Factor Type ` and :ref:`Tax +Object ` fields on sales taxes. + +.. _l10n/mx/factor-type: Factor type ~~~~~~~~~~~ -The *Factor Type* field is pre-loaded in the default taxes. If new taxes are created, you need to -make sure to configure this field. To do so, go to :menuselection:`Accounting --> Configuration --> -Taxes`, then enable the :guilabel:`Factor Type` field in the :guilabel:`Advanced Options` tab for -all records, with the :guilabel:`Tax Type` set as :guilabel:`Sales`. +Both the :guilabel:`SAT Tax Type` and :guilabel:`Factor Type` fields are pre-loaded in the default +taxes. If new taxes are created, these fields must be set. To do so, go to +:menuselection:`Accounting --> Configuration --> Taxes`, then fill both fields in the +:guilabel:`Advanced Options` tab for all tax records, with the :guilabel:`Tax Type` set as +:guilabel:`Sales`. -.. image:: mexico/mx-factor-type.png - :alt: Factor Type Sales tax type configuration. +Odoo supports four groups of :guilabel:`SAT Tax Types`: :guilabel:`IVA`, :guilabel:`ISR`, +:guilabel:`IEPS`, and :guilabel:`Local Taxes`. .. tip:: Mexico manages two different kinds of 0% VAT to accommodate two scenarios: - - *0% VAT* set the :guilabel:`Factor Type` as :guilabel:`Tasa` - - *VAT Exempt* set the :guilabel:`Factor Type` as :guilabel:`Exento` + - For *0% VAT*, set the :guilabel:`Factor Type` as :guilabel:`Tasa` + - For *VAT Exempt*, set the :guilabel:`Factor Type` as :guilabel:`Exento` + +.. _l10n/mx/tax-object: Tax object ~~~~~~~~~~ -One requirement of the CFDI 4.0 is that the resulting XML file needs (or does not need) to break -down the taxes of the operation. There are three different possible values that are added in the XML -file: +One requirement of the CFDI 4.0 is that the resulting XML file handles the breakdown of taxes of the +operation in accordance with the regulation. There are three different possible values that are +added in the XML file: -- `01`: Not subject to tax - this value is added automatically if your invoice line doesn't contain +- `01`: Not subject to tax: This value is added automatically if the invoice line doesn't contain any taxes. -- `02`: Subject to tax - this is the default configuration of any invoice line that contains taxes. -- `03`: Subject to tax and not forced to break down - this value can be triggered on-demand for - certain customers to replace the value 02. - -To use the `03` value, navigate to :menuselection:`Contacts --> your customer's invoice --> MX EDI -tab`, and activate the :guilabel:`No Tax Breakdown` checkbox. +- `02`: Subject to tax: This is the default configuration of any invoice line that contains taxes. +- `03`: Subject to tax and not forced to break down: This value can be triggered on demand for + certain customers to replace the value `02`. -.. image:: mexico/mx-tax-breakdown.png - :alt: No Tax Breakdown option on the MX EDI tab of the customer's invoice. +To use the `03` value for a contact, navigate to the contact's :guilabel:`Sales & Purchase` tab, and +activate the :guilabel:`No Tax Breakdown` checkbox under the :guilabel:`Fiscal Information` section. .. important:: The :guilabel:`No Tax Breakdown` value applies **only** to specific fiscal regimes and/or taxes. Consult your accountant first to see if it is needed for your business before making any modification. +.. _l10n/mx/tax-config: + Other tax configurations ~~~~~~~~~~~~~~~~~~~~~~~~ -When registering a payment, Odoo will carry out the movement of taxes from the *Cash Basis -Transition Account* to the account set in the :guilabel:`Definition` tab. For such movement, a tax -base account will be used: (`Base Imponible de Impuestos en Base a Flujo de Efectivo`) in the -journal entry when reclassifying taxes. **Do not delete this account**. - -If you create a new tax in :menuselection:`Accounting --> Configuration --> Taxes`, you need to add -the correct :guilabel:`Tax Grids` for it (`IVA`, `ISR` or `IEPS`). Odoo **only** supports these -three groups of taxes. +The Mexican Localization uses :doc:`cash basis taxes <../../finance/accounting/taxes/cash_basis>`. +When registering a payment, Odoo carries out the movement of taxes from the *Cash Basis Transition +Account* to the account set in the :guilabel:`Definition` tab of the tax record set on the invoice +or bill line. For such movement, a tax base account is used: (:guilabel:`899.01.99 Base Imponible de +Impuestos en Base a Flujo de Efectivo`) in the journal entry when reclassifying taxes. **Do not +delete this account**. -.. image:: mexico/mx-taxes-config.png - :alt: Tax accounts available for Odoo. +.. _l10n/mx/products: Products -------- To configure products, go to :menuselection:`Accounting --> Customers --> Products`, then select a -product to configure, or :guilabel:`Create` a new one. In the :guilabel:`Accounting` tab, and in the +product to configure, or :guilabel:`Create` a new one. In the :guilabel:`Accounting` tab, in the :guilabel:`UNSPSC Product Category` field, select the category that represents the product. The process can be done manually, or through :doc:`a bulk import <../../essentials/export_import_data>`. .. note:: - All products need to have an |SAT| code associated with them in order to prevent validation + All products need to have a |SAT| code associated with them in order to prevent validation errors. +.. _l10n/mx/e-invoicing-overview: + Electronic invoicing -------------------- +.. _l10n/mx/pac: + PAC credentials ~~~~~~~~~~~~~~~ -After you have processed your `Private Key (CSD) +After processing your `Private Key (CSD) `_ with the |SAT|, you **must** register directly with the :ref:`PAC ` of -your choice before you start creating invoices from Odoo. +certifica>`_ with the |SAT|, you **must** register directly with the :ref:`PAC +` of your choice before you start creating invoices from Odoo. -Once you've created your account with any of these providers, go to :menuselection:`Settings --> -Accounting --> Electronic Invoicing (MX)`. Under the :guilabel:`MX PAC` section, enter the name of -your |PAC| with your credentials (:guilabel:`PAC username` and :guilabel:`PAC password`). +Once you've created your account with any of these providers, go to :menuselection:`Accounting --> +Configuration --> Settings` and navigate to the :guilabel:`MX Electronic invoicing` section. Under +the :guilabel:`Authorized Certification Provider (PAC)` section, enter the name of your |PAC| with +your credentials (:guilabel:`PAC username` and :guilabel:`PAC password`). .. image:: mexico/mx-pac-account.png :alt: Configuring PAC credentials from the Accounting settings. .. tip:: - If you do not have credentials, but want to test the electronic invoicing, you can activate the - :guilabel:`MX PAC test environment` checkbox, and select :guilabel:`Solucion Factible` as the - |PAC|. You do not need to add a username or password for a test environment. + To test the electronic invoicing without credentials, activate the :guilabel:`MX PAC + test environment` checkbox, and select :guilabel:`Solucion Factible` as the :guilabel:`PAC`. It + is not required to add a username or password for a test environment. + +.. _l10n/mx/certifications: .cer and .key certificates ~~~~~~~~~~~~~~~~~~~~~~~~~~ The `digital certificates of the company `_ must be uploaded within -the :guilabel:`MX Certificates` section. To do so, navigate to :menuselection:`Settings --> -Accounting --> Electronic Invoicing (MX)`. Under the :guilabel:`MX Certificates` section, select -:guilabel:`Add a line`, and a window will open. Click :guilabel:`Create`, and from there, upload -your digital :guilabel:`Certificate` (:file:`.cer` file), your :guilabel:`Certificate Key` -(:file:`.key` file), and your :guilabel:`Certificate Password`. To finish, click on :guilabel:`Save -& Close`. +the :guilabel:`Certificates` section. To do so, navigate to :menuselection:`Settings --> +General Settings --> Certificates and Keys`. + +Under :guilabel:`Manage your certificates`, click the :icon:`fa-right-arrow` :guilabel:`Keys` link +to access the :guilabel:`Keys` list view. Click :guilabel:`Create`, upload the digital +:guilabel:`Key file` (:file:`.key` file), add a :guilabel:`Name` to the key, and enter the +:guilabel:`Private key password`. -.. image:: mexico/mx-certificates.png - :alt: Certificate and key upload inputs. +From :menuselection:`Settings --> General Settings --> Certificates and Keys`, select +:guilabel:`Certificates` to access the :guilabel:`Certificate` list view. Click :guilabel:`Create`, +upload the digital :guilabel:`Certificate` (:file:`.cer` file), add a :guilabel:`Name` to the +certificate, and select the :guilabel:`Private Key` created on the previous step from the drop-down +menu. + +.. note:: + The :guilabel:`Certificate Password` and :guilabel:`Public Key` fields on :guilabel:`Certificate` + records are optional. .. tip:: - If you still do not have one of the contracted |PAC|\s and you want to test electronic invoicing, - you can use the following |SAT| test certificates: + In order to test the electronic invoicing, + the following |SAT| test certificates are provided: - :download:`Certificate ` - :download:`Certificate Key ` - **Password**: ``12345678a`` -Workflows -========= +Accounting +========== + +.. _l10n/mx/e-invoicing: Electronic invoicing -------------------- @@ -315,6 +338,8 @@ The invoicing process in Odoo is based on `Annex 20 `_ version 4.0 of electronic invoicing of the |SAT|. +.. _l10n/mx/invoices: + Customer invoices ~~~~~~~~~~~~~~~~~ @@ -324,23 +349,28 @@ flow <../accounting/customer_invoices>`. While the document is in draft mode, changes can be made to it (the correct :guilabel:`Payment Way` or :guilabel:`Usage` that the customer might require can be added, for example.) -After you :guilabel:`Confirm` the customer invoice, a blue message appears stating: :guilabel:`The -invoice will be processed asynchronously by the following E-invoicing service: CFDI (4.0)`. +After clicking on :guilabel:`Confirm` in the customer invoice, click on the :guilabel:`Send` button +to process the invoice with the government. Make sure that the :guilabel:`CFDI` checkbox is marked. + +.. image:: mexico/mx-send-cfdi.png + :alt: CFDI Checkbox -Pressing the :guilabel:`Process Now` button sends the document to the government so it can be -signed. After receiving the signed document back from the government, the :guilabel:`Fiscal Folio` -field appears on the document, and the XML file is attached in the chatter. +After receiving the signed document back from the government, the :guilabel:`Fiscal Folio` field +appears on the document, and the XML file appears both in the |CFDI| tab and attached in the +chatter. + +If an email address is configured on the customer contact record, marking the :guilabel:`by Email` +and :guilabel:`CFDI` checkboxes sends both the XML and PDF files together. + +To download the PDF file locally, click the :guilabel:`Print` button. .. tip:: - If you click :guilabel:`Retry` in the :guilabel:`SAT status` field on the invoice, you can - confirm if the XML file is valid in the |SAT|. + When clicking :guilabel:`Update SAT`, the :guilabel:`SAT status` field on the invoice will + confirm if the XML file is **Validated** in the |SAT|. - If you are in a testing environment, you will always receive the message :guilabel:`Not Found`. + On a testing environment, the message :guilabel:`Not Found` will always come up. -To send the signed invoice to your client by mail, you can send both the XML and PDF files together, -directly from Odoo, by clicking the :guilabel:`Send & Print` button. You can also download the PDF -file to your computer, by clicking the :guilabel:`Print` button, and selecting the desired print -option. +.. _l10n/mx/credit-notes: Credit notes ~~~~~~~~~~~~ @@ -354,42 +384,39 @@ to be a relation between a credit note and an invoice through the fiscal folio. Because of this requirement, the field :guilabel:`CFDI Origin` adds this relation with a `01|`, followed by the fiscal folio of the original invoice. -.. image:: mexico/mx-creating-credit-note.png - :alt: Example CFDI Origin number. - .. tip:: For the :guilabel:`CFDI Origin` field to be automatically added, use the :guilabel:`Add Credit Note` button from the invoice, instead of creating it manually. -Payment complements -~~~~~~~~~~~~~~~~~~~ +.. _l10n/mx/payments: + +Payments +~~~~~~~~ + +.. _l10n/mx/payment-policy: Payment policy ************** -One addition of the Mexican localization is the :guilabel:`Payment Policy` field. According to -the SAT documentation, there are two types of payments: +One addition of the Mexican localization is the :guilabel:`Payment Policy` field. `According to +the SAT documentation `_, +there are two types of payments: -- `PUE` (Pago en una Sola Exhibición/Payment in a Single Exhibition) -- `PPD` (Pago en Parcialidades o Diferido/Payment in Installements or Deferred) +- :guilabel:`PUE` (Pago en una Sola Exhibición/Payment in a Single Exhibition) +- :guilabel:`PPD` (Pago en Parcialidades o Diferido/Payment in Installements or Deferred) - .. seealso:: - :doc:`../../inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs` - -The difference lies in the *Due Date* or *Payment Terms* of the invoice. +The difference lies in the :guilabel:`Due Date` or +:doc:`../accounting/customer_invoices/payment_terms` of the invoice. To configure |PUE| invoices, navigate to :menuselection:`Accounting --> Customers --> Invoices`, -and either select an invoice :guilabel:`Due Date` within the same month, or choose a payment term -that does not imply changing the due month (immediate payment, 15 days, 21 days, all falling within -the current month). +and either select an invoice :guilabel:`Due Date` within the same month, or choose +:guilabel:`Payment terms` that do not imply changing the due month (i.e., :guilabel:`Immediate +Payment`, or :guilabel:`15 Days` or :guilabel:`21 Days`, as long as they fall within the current +month). .. image:: mexico/mx-pue-payment.png :alt: Example of an invoice with the PUE requirements. -.. tip:: - Some :guilabel:`Payment Terms` are already installed by default, and can be managed from - :menuselection:`Accounting --> Configuration --> Payment Terms`. - To configure |PPD| invoices, navigate to :menuselection:`Accounting --> Customers --> Invoices`, and select an invoice with a :guilabel:`Due Date` after the first day of the following month. This also applies if your :guilabel:`Payment Term` is due in the following month. @@ -397,54 +424,55 @@ applies if your :guilabel:`Payment Term` is due in the following month. .. image:: mexico/mx-ppd-payment.png :alt: Example of an invoice with the PPD requirements. -.. important:: - Because the |PPD| policy implies that an invoice is not going to get paid at the moment, the - correct :guilabel:`Payment Way` for the |PPD| invoices is :guilabel:`99 - Por Definir` (To - define). +.. _l10n/mx/payment-flow: Payment flow ************ -In both cases, the payment process in Odoo :doc:`is the same <../accounting/customer_invoices>`, the -main difference being payments related to |PPD| invoices trigger the creation of a document type "P" -(Pago). +In both cases, the payment process in Odoo :doc:`is the same <../accounting/payments>`, the main +difference being payments related to |PPD| invoices, by law, need to be sent to the government as a +document type "P" (Pago). -If a payment is related to a |PUE| invoice, it can be registered with the wizard, and be associated -with the corresponding invoice. To do so, navigate to :menuselection:`Accounting --> Customers --> -Invoices`, and select an invoice. Then, click the :guilabel:`Register Payment` button. The invoice -status changes to :guilabel:`In Payment`, since the payment is effectively validated when it is bank -reconciled. +If a payment is related to a |PUE| invoice, it can be registered through the payment popup, and be +associated with the corresponding invoice. To do so, navigate to :menuselection:`Accounting --> +Customers --> Invoices`, and select an invoice. Then, click the :guilabel:`Pay` button to open the +payment popup, set the :guilabel:`Payment Way` and any other fields, and click :guilabel:`Create +Payment`. .. seealso:: - :doc:`../accounting/bank/reconciliation` + - :doc:`../accounting/payments` + - :doc:`../accounting/bank/reconciliation` -While this process is the same for PPD invoices, the addition of the creating an :doc:`electronic +While this process is the same for PPD invoices, the addition of creating an :doc:`electronic document <../accounting/customer_invoices/electronic_invoicing>` means some additional requirements are needed to correctly send the document to the |SAT|. -From an invoice, you need to confirm the specific :guilabel:`Payment Way` where you received the -payment. Because of this, the :guilabel:`Payment Way` field **cannot** be set as `99 - Por Definir -(To Define)`. - -If you are going to add a bank account number in the :guilabel:`Accounting` tab of a customer's -contact card, it must have a valid account number. +From a legal perspective, PPD invoices **must** include the specific :guilabel:`Payment Way` that +the payment was received. Because of this, the :guilabel:`Payment Way` field **cannot** be set as +:guilabel:`To Define`, thus the field will become invisible when selecting it. .. note:: - The exact configurations are in the `Anexo 20 of the SAT - `_. Usually, the - :guilabel:`Bank Account` needs to be 10 or 18 digits for transfers, 16 for credit or debit cards. + - If a bank account number is required, add it in the :guilabel:`Accounting` tab of a customer's + contact record. + - The exact configurations are in the `Anexo 20 of the SAT + `_. Usually, the + :guilabel:`Bank Account` needs to be 10 or 18 digits for transfers, 16 for credit or debit + cards. + +If a fully-reconciled payment is related to an invoice with a :guilabel:`Fiscal Folio`, the +:guilabel:`Update Payments` appears. Click the :guilabel:`Update Payments` button to send the +**payment complement** XML file to the government automatically and display it in the |CFDI| tab in +both the invoice and the payment. -If a payment is related to a signed invoice with the :guilabel:`Payment Policy` `PPD`, Odoo -generates the corresponding payment complement automatically, once you click :guilabel:`Process -Now`. +.. tip:: + While it is a bad fiscal practice, the |PUE| payments can also be sent to the government, however + it is required to click :guilabel:`Force CFDI` in the :guilabel:`CFDI` tab for this. -.. image:: mexico/mx-signed-complement.png - :alt: CFDI (4.0) E-invoicing service process payment now message. +Similar to an invoice or credit note, the PDF and XML can be sent to the final customer. To do so, +click the :icon:`fa-cog` :guilabel:`(gear)` icon to open the actions drop-down menu and select +:guilabel:`Send receipt by email`. -.. warning:: - A payment in MXN **cannot** be used to pay multiple invoices in USD. Instead, the payment should - be separated into multiple payments, using the :guilabel:`Register Payment` button on the - corresponding invoices. +.. _l10n/mx/invoice-cancellations: Invoice cancellations ~~~~~~~~~~~~~~~~~~~~~ @@ -453,7 +481,7 @@ It is possible to cancel the EDI documents sent to the |SAT|. According to the ` `_, since January 1st, 2022, there are two requirements for this: -- With all cancellation requests, you **must** specify a *cancellation reason*. +- All cancellation requests require a *cancellation reason*. - After 24 hours from the invoice creation, the client must be asked to approve the cancellation. If there is no response within 72 hours, the cancellation is processed automatically. @@ -466,18 +494,23 @@ Invoice cancellations can be made for one of the following reasons: To initiate a cancellation, go to :menuselection:`Accounting --> Customers --> Invoices`, select the posted invoice to cancel, and click :guilabel:`Request Cancel`. Then, refer to the -:ref:`localizations/mexico/01-invoice-cancellation` or -:ref:`localizations/mexico/02-03-04-invoice-cancellation` sections, depending on the cancellation -reason. +:ref:`l10n/mx/01-invoice-cancellation` or :ref:`l10n/mx/02-03-04-invoice-cancellation` sections, +depending on the cancellation reason. .. tip:: Alternatively, request a cancellation from the :guilabel:`CFDI` tab by clicking :guilabel:`Cancel` on the line item. -.. _localizations/mexico/01-invoice-cancellation: +.. note:: + - If a cancellation is requested on a locked period, the CFDI will be cancelled but not the + accounting entry. + - If the client rejects the cancellation, the invoice cancellation line item is removed from the + :guilabel:`CFDI` tab. + +.. _l10n/mx/01-invoice-cancellation: -Cancellation reason 01 - Invoice issued with errors (with related document) -*************************************************************************** +Cancellation reason 01 +********************** #. In the :guilabel:`Request CFDI Cancellation` pop-up window, select :guilabel:`01 - Invoice issued with errors (with related document)` from the :guilabel:`Reason` field and click @@ -498,14 +531,12 @@ The invoice cancellation is then generated with a reason line item in the :guila :alt: Canceled invoice line item in the CFDI tab. .. note:: - - If the client rejects the cancellation, the invoice cancellation line item is removed from the - :guilabel:`CFDI` tab. - - When using the *01 - Invoice issued with errors (with related document)* cancellation reason, - the `04|` prefix may appear in the :guilabel:`Fiscal Folio` field. This is an internal prefix - used by Odoo to complete the cancellation and **does not** mean that the cancellation reason - was *04 - Nominative operation related to the global invoice*. + When using the :guilabel:`01 - Invoice issued with errors (with related document)` cancellation + reason, the `04|` prefix appears in the :guilabel:`Fiscal Folio` field. This is an internal + prefix used by Odoo to complete the cancellation and **does not** mean that the cancellation + reason was :guilabel:`04 - Nominative operation related to the global invoice`. -.. _localizations/mexico/02-03-04-invoice-cancellation: +.. _l10n/mx/02-03-04-invoice-cancellation: Cancellation reasons 02, 03, and 04 *********************************** @@ -517,106 +548,475 @@ Upon doing so, the invoice cancellation is generated with a reason line item in tab. .. note:: - If the client rejects the cancellation, the invoice cancellation line item is removed from the - :guilabel:`CFDI` tab. + If the :guilabel:`SAT Status` goes back to **Validated** it could be due to one of these three + reasons: + + - The invoice is labeled as *No Cancelable* in the `SAT Website `_. + due to the fact that it has a valid related document: Either another invoice linked with the + :guilabel:`CFDI Origin` field or a Payment Complemement. If so, you need to cancel any other + related document first. + - The cancellation request is still being processed by the |SAT|. If so, wait a few minutes and + try again. + - The final customer needs to reject or accept the cancellation request in their + `Buzón Tributario + `_. This + can take up to 72 hours and, in case that the cancellation requests gets rejected, you will + need to repeat the process again. + +.. seealso:: + `Tool to validate Mexican Electronic Documents (CFDI) status + `_ + +For the cancellation reasons **02**, **03** and **04**, the :guilabel:`Create Replacement Invoice` +button is replaced by a :guilabel:`Confirm` button that requests the cancellation immediately. + +Both the current :guilabel:`State` and :guilabel:`Cancellation Reason` can be found in the +:guilabel:`CFDI` tab. + +.. image:: mexico/mx-invoice-cancellation-reason-tab.png + :alt: Old invoice with CFDI Origin. + +.. _l10n/mx/payment-cancellations: Payment cancellations ********************* -It is also possible to cancel *Payment Complements*. For this, go to the payment, via -:menuselection:`Accounting --> Customers --> Payments`, and select :guilabel:`Request EDI -Cancellation`. As with invoices, a blue button will appear. Click :guilabel:`Process now`, and the -document will be sent to the |SAT|. After a few seconds, you can click :guilabel:`Retry` to confirm -the current |SAT| status. +To cancel :ref:`payment complements `, go to the :guilabel:`CFDI` tab of the +related invoice and click :guilabel:`Cancel` on the line of the payment complement. -Finally, the payment status is moved to :guilabel:`Cancelled`. +Like with invoices, go to the payment and click :guilabel:`Update SAT` in order to change the +:guilabel:`SAT Status` and :guilabel:`Status` to :guilabel:`Cancelled`. .. note:: - Just like invoices, when you create a new *Payment Complement*, you can add the relation of the + Just like invoices, when creating a new payment complement, you can add the relation of the original document, by adding a `04|` plus the fiscal folio in the :guilabel:`CFDI Origin` field. + This action cancels the invoice and marks the :guilabel:`Reason` as :guilabel:`01 - Invoice + issued with errors (with related document)`. + +.. _l10n/mx/special-use-cases: Invoicing special use cases ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -CFDI to public -************** - -If the customer you are selling goods or services to does not require an invoice, a *CFDI to Public* -has to be created. - -If you use the :guilabel:`Customer` name `PUBLICO EN GENERAL`, an error will be triggered. This is a -main change in the CFDI 4.0 that requires invoices with that specific name to need additional -fields, which Odoo does not currently support. So, for a *CFDI to Public* to be created, you need to -add any name to your customer that is **not** `PUBLICO EN GENERAL`. (For example: `CLIENTE FINAL`). - -In addition to this, it is required that the :guilabel:`ZIP` code of your company is added, the -generic |RFC| is set as `XAXX010101000`, and the :guilabel:`Fiscal Regime` of your customer must be -set as: `Sin obligaciones fiscales`. - -.. image:: mexico/mx-cfdi-to-public.png - :alt: CFDI to Public Customer field configuration. +.. _l10n/mx/multicurrency: Multicurrency ************* -The main currency in Mexico is MXN. While this is mandatory for all Mexican companies, it is -possible to send and receive invoices (and payments) in different currencies. To enable the use of -:doc:`multicurrency <../accounting/get_started/multi_currency>`, navigate to the -:menuselection:`Accounting --> Settings --> Currencies`, and set :guilabel:`Mexican Bank` as the -:guilabel:`Service` in the :guilabel:`Automatic Currency Rates` section. Then, set the -:guilabel:`Interval` field to the frequency you wish to update the exchange rates. +The :guilabel:`Main Currency` in Mexico is MXN. While this is mandatory for all Mexican companies, +it is possible to send and receive invoices (and payments) in different currencies. To enable the +use of :doc:`multicurrency <../accounting/get_started/multi_currency>`, navigate to the +:menuselection:`Accounting --> Configuration --> Currencies`, and set :guilabel:`[MX] Bank of +Mexico` as the :guilabel:`Service` in the :guilabel:`Automatic Currency Rates` section. Then, set +the :guilabel:`Interval` field to the frequency you wish to update the exchange rates. This way, the XML file of the document will have the correct exchange rate, and the total amount, in both the foreign currency and in MXN. -It is highly recommended to use :doc:`a bank account for each currency +It is highly recommended to use separate :doc:`bank accounts for each currency <../accounting/bank/foreign_currency>`. .. note:: - The only currencies that automatically update their exchange rate daily are: USD, EUR, GBP, and - JPY. + The only currencies that automatically update their exchange rate daily are: USD, EUR, GBP, JPY + and CNY. + +.. _l10n/mx/discounts: + +Discounts +********* + +By law, electronic documents sent to the government cannot have negative lines, as this can trigger +errors. Therefore, when using :doc:`Gift Cards +<../../sales/sales/products_prices/ewallets_giftcards>` or :doc:`Loyalty Programs +<../../sales/sales/products_prices/loyalty_discount>`, the subsequent negative lines will be +translated in the XML as if they were regular :doc:`Discounts +<../../sales/sales/products_prices/prices/pricing/>`. + +In order to set this up, navigate to :menuselection:`Sales --> Products --> Products` and create a +product `Discounts`, make sure that it has a valid :guilabel:`Tax` (usually :guilabel:`IVA` at +`16%`). + +After this, create and sign the invoice via CFDI, and add the `Discounts` product at the bottom. In the XML +the discount should be subtracted from the first invoice line available, Odoo will try to subtract +from each line the total amount in order until all the discount has been applied. + +.. tip:: + A `Discount` and `UNSPSC Product Category` for each product variant related to :guilabel:`Gift + Cards` or :guilabel:`Loyalty Programs` have to be created. -.. image:: mexico/mx-multicurrency-1.png - :alt: Multi-currency configuration in the Accounting settings. +.. _l10n/mx/down-payments: Down payments ************* -There can be cases where you receive a payment in advance from a customer that needs to be applied -to an invoice later. In order to do this in Odoo, it is required to properly link invoices to each -other with the :guilabel:`CFDI Origin` field. To do so, it is necessary to have the :doc:`Sales -<../../sales>` app installed. +A common practice in Mexico is the usage of :doc:`down payments +<../../sales/sales/invoicing/down_payment>`. It's usage primarily consists of cases where you receive +a payment for a good or service where either the product or the price (or both) hasn't been +determinated at the moment. + +The |SAT| allows two diferent ways to handle this process: both of them involve linking all invoices +to each other with the :guilabel:`CFDI Origin` field. + +.. note:: + For this process, the :doc:`Sales <../../sales>` app must be installed. .. seealso:: `The official documentation for registration of down payments in Mexico - `_. + `_. -First, navigate to the :menuselection:`Sales` app to create a product `Anticipo` and configure it. -The :guilabel:`Product Type` must be :guilabel:`Service`, and use the :guilabel:`UNSPSC Category` -must be: `84111506 Servicios de facturación`. +Configuration +^^^^^^^^^^^^^ + +First, navigate to :menuselection:`Sales --> Products --> Products` to create a product `Anticipo` +and configure it. The :guilabel:`Product Type` must be :guilabel:`Service`, and use the +:guilabel:`UNSPSC Category` :guilabel:`84111506 Servicios de facturación`. Then, go to :menuselection:`Sales --> Settings --> Invoicing --> Down Payments`, and add the *Anticipo* product as the default. -Create a sales order with the total amount, and create a down payment (either using a percentage or -fixed amount). Then, sign the document, and :guilabel:`Register the Payment`. +.. _l10n-mx/down-payment-method-a: + +Method A +^^^^^^^^ + +This method consists of creating a down payment invoice, creating a invoice for the total amount, +and finally, creating a credit note for the total of the down payment. + +First, create a sales order with the total amount, and create a down payment from it (either using a +percentage or fixed amount). Then, sign the document via CFDI, and register the payment. When the time comes for the customer to get the final invoice, create it again from the same sales -order. In the :guilabel:`Create Invoices` wizard, select :guilabel:`Regular Invoice`, and uncheck -:guilabel:`Deduct down payments`. +order. In the :guilabel:`Create Invoice` popup, select :guilabel:`Regular Invoice`. Make sure to +delete the line that contains the product *Anticipo*. + +.. tip:: + When using down payments with the Mexican localization, make sure that the :guilabel:`Invoicing + Policy` of the products are :guilabel:`Ordered quantities`. Otherwise a customer credit note will + be created. -Then, copy the :guilabel:`Fiscal Folio` from the first invoice, and paste it into the -:guilabel:`CDFI Origin` of the second invoice, adding the prefix `07|` before the value. Then, sign -the document. +Then, copy the :guilabel:`Fiscal Folio` from the down payment invoice, and paste it into the +:guilabel:`CDFI Origin` of the final invoice, adding the prefix `07|` before the value and sign +the document via CFDI. -After this, create a credit note for the first invoice. Copy the :guilabel:`Fiscal Folio` from the -second invoice, and paste it in the :guilabel:`CFDI Origin` of the credit note, adding the prefix -`07|`. Then, sign the document. +Finally, create a credit note for the first invoice. Copy the :guilabel:`Fiscal Folio` from the +final invoice, and paste it in the :guilabel:`CFDI Origin` of the credit note, adding the prefix +`07|`. Then, sign the document via CFDI. With this, all electronic documents are linked to each other. The final step is to fully pay the new invoice. At the bottom of the new invoice, you can find the credit note in the :guilabel:`Outstanding credits` - add it as payment. Finally, register the remaining amount with the -:guilabel:`Register Payment` wizard. +:guilabel:`Pay` popup. + +In the sales order, all three documents should appear as "In Payment". + +Method B +^^^^^^^^ + +Another, simpler way to fulfill |SAT| requirements involves creating only the down payment invoice, +and a second invoice for the remnant. This method involves the fact that negative lines are treated +as discounts. + +For this, follow the same process as :ref:`Method A `, up until the +creation of the final invoice. Do not delete the line that contains the *Anticipo* and instead +rename the other products :guilabel:`Description` to include the text `CFDI por remanente de un +anticipo`. Don't forget to add the :guilabel:`Fiscal Folio` of the down payment invoice in the +:guilabel:`CDFI Origin` of the final invoice, adding the prefix `07|`. + +Finally, sign the final invoice via CFDI. + +.. _l10n/mx/xml-reader: + +XML reader +********** + +In certain occasions, such as when you are creating invoices in another software or in the |SAT| +directly, you would want to upload the invoices in Odoo. The XML Reader allows you to retrieve the +data from an XML file. To do this, navigate to :menuselection:`Accounting --> Customers --> +Invoices` and, in the list view, click the :guilabel:`Upload` button to select any number of XML +files, and draft invoices will be automatically created. This can work also by dragging the files +from your computer and dropping them in the view. + +The draft invoices will retrieve the :guilabel:`Customer information` (if it doesn't exist, new ones +will be created), the :guilabel:`Product Lines` (only if products with the same name already exist) +and will calculate all taxes and additional fields exclusive to the Mexican Localization. The import +information will appear in the chatter. + +.. warning:: + Depending on where the invoice was created, XML files could have different values from the total + calculated in Odoo. **Always** double-check any document uploaded this way. + +:guilabel:`Customer Invoices` created this way will be able to create **payment complements** and to +be canceled at any time. If you use the :guilabel:`Print` button, the PDF document will have all the +corresponding information. + +This can be done for :guilabel:`Vendor Bills` too. + +.. tip:: + + To retrieve the :guilabel:`Fiscal Folio`, drag and drop XML files for already created draft + invoices. + +.. _l10n/mx/cfdi: + +CFDI to public +************** + +The Mexican government requires that any goods or services that are sold must be backed up by +an invoice. If the customer does not require an invoice or has no |RFC|, a +*CFDI to Public* has to be created also known as a "nominative" invoice. + +A contact must be created and it must have a particular name. +If the :guilabel:`CFDI to Public` checkbox in either a sales order or an invoice is checked, the +final XML will override the data in the invoice contact and will add the following characteristics: + +- |RFC|: **XAXX010101000** if it is a national customer or **XEXX010101000** if it is a foreign + customer +- :guilabel:`ZIP` code: The same code of the company +- :guilabel:`Usage`: S01 - Without Fiscal Effects + +.. image:: mexico/mx-cfdi-to-public.png + :alt: CFDI to Public Checkbox + +.. important:: + If your contact :guilabel:`Country` is empty, the final invoice is considered as a *CFDI to + Public* for national customers. A non-blocking warning will be displayed before signing the + document. + +If the final customer doesn't share any details, create a generic :guilabel:`Customer`. The name +cannot be `PUBLICO EN GENERAL` or an error will be triggered (it can be, for example, `CLIENTE +FINAL`). + +.. seealso:: + `Regla 2.7.1.21 Expedición de comprobantes en operaciones con el público en general. + `_. + +.. _l10n/mx/global-invoice: + +Global invoice +************** + +If by the end of a certain period of time (that can vary from daily to bimonthly, depending of your +company's legal needs and preferences) and the customer still has sales that weren't marked as +regular invoices or individual *CFDI to Public* invoices, the |SAT| allows for the creation of a +single invoice that can contain all operations, known as a *global invoice*. + +.. note:: + For this process, the :doc:`Sales <../../sales/sales>` app must be installed. + +.. seealso:: + `Guía de llenado del CFDI global `_ + +Sales flow +^^^^^^^^^^ + +First, it is necessary to create a special :guilabel:`Journal` created in :menuselection:`Accounting +--> Configuration --> Journals` with the purpose of keeping a separate sequence. + +Then, make sure that all the sales orders that need to be signed have the following configurations: + +- :guilabel:`CFDI to Public` checkbox enabled +- :guilabel:`Invoice Status` marked as :guilabel:`To Invoice` + +After this, go to :menuselection:`Sales --> To Invoice --> Orders to Invoice`, select all relevant +sales orders and press :guilabel:`Create Invoices`. Make sure to disable the :guilabel:`Consolidated +Billing` checkbox and click :guilabel:`Create Draft Invoice`. + +Odoo will redirect to a list of invoices. Select all of them and in the :icon:`fa-gear` +:guilabel:`Actions` drop-down menu select :guilabel:`Post entries`. Select all posted invoices again +and go back to the :icon:`fa-gear` :guilabel:`Actions` drop-down menu to select :guilabel:`Create +Global Invoice`. + +In the wizard, select the :guilabel:`Periodicity` indicated by a professional accountant and press +:guilabel:`Create`. All invoices should be signed under the same XML file, with the same +:guilabel:`Fiscal Folio`. + +.. tip:: + - Click :guilabel:`Show` in the :guilabel:`CFDI` tab to display a list with all related invoices. + - Click :guilabel:`Cancel` in the :guilabel:`CFDI` tab to cancel the global invoice in both the + |SAT| and Odoo. + +.. note:: + Global invoices created this way won't have a **PDF** in them as their information is already + within Odoo and is not to be seen by a customer. + +.. _l10n/mx/reporting: + +Electronic accounting (reporting) +--------------------------------- + +For Mexico, `Electronic Accounting +`_ refers to the +obligation to keep accounting records and entries through electronic means, and to enter accounting +information on a monthly basis, through the |SAT| website. + +It consists of three main XML files: + +#. The updated list of the chart of accounts that is currently in use +#. A monthly trial balance, plus a closing entry report, also known as: *Trial Balance Month 13* +#. An export of the journal entries in the general ledger (optional except in the case of a + compulsory audit) + +The resulting XML files follow the requirements of the `Anexo Técnico de Contabilidad Electrónica +1.3 `_. + +In addition to this, it is possible to generate the `DIOT +`_: a report of vendors' journal entries that involve IVA taxes that can be +exported in a TXT file. + +.. note:: + In order to use these reports, the following modules must be installed: + + - :guilabel:`Odoo Mexican Localization Reports` `l10n_mx_reports` + - :guilabel:`Mexico - Month 13 Trial Balance` `l10n_mx_reports_closing` + - :guilabel:`Odoo Mexican XML Polizas Export` `l10n_mx_xml_polizas` + +The *chart of accounts* and the *Trial Balance Month 13* reports can be found in +:menuselection:`Accounting --> Reporting --> Trial Balance`. The *DIOT* report can be found in +:menuselection:`Accounting --> Reporting --> Tax Report`. + +.. important:: + The specific characteristics and obligations of the reports that you send might change according + to your fiscal regime. Always contact your accountant before sending any documents to the + government. + +.. _l10n_mx/chart-of-accounts: + +Chart of accounts +~~~~~~~~~~~~~~~~~ + +The :doc:`chart of accounts <../accounting/get_started/chart_of_accounts>` in Mexico follows a +specific pattern based on |SAT|'s' `Código agrupador de cuentas +`_. + +It is possible to create any account, as long as it respects |SAT|'s encoding group: the pattern is +`NNN.YY.ZZ` or `NNN.YY.ZZZ`. + +.. example:: + Some examples are `102.01.99` or `401.01.001`. + +When a new account is created in :menuselection:`Accounting --> Configuration --> Chart of +Accounts`, with the |SAT| encoding group pattern, the correct grouping code appears in +:guilabel:`Tags`, and the account appears in the *COA* report. + +Once all accounts are created, make sure the correct :guilabel:`Tags` are added as these mark the +nature of the account. + +.. note:: + It is not advised use any pattern that ends a section with a 0 (such as `100.01.01`, `301.00.003` + or `604.77.00`). This triggers errors in the report. By default Odoo will mark the accounts as + yellow if the numbering will cause issue later on, this is to prevent reports from providing + inaccurate data. + +Once everything is set up, go to :menuselection:`Accounting --> Reporting --> Trial Balance`, and +click the :guilabel:`COA SAT (XML)` button to generate an XML file containing all of the accounts. +This XML file is ready to upload to the |SAT| website. + +.. _l10n/mx/trial-balance: + +Trial balance +~~~~~~~~~~~~~ + +The trial balance reports the initial balance, credit, and total balance of your accounts, provided +that you added their correct :ref:`encoding group `. + +To generate an XML file of the trial balance, go to :menuselection:`Accounting --> Reporting --> +Trial Balance`, select the date, and click the :icon:`fa-cog` :guilabel:`(action menu)`, then select +:guilabel:`SAT (XML)`. + +.. image:: mexico/mx-reports-trial-balance.png + :alt: Trial balance report. + +.. note:: + Odoo does not generate the *Balanza de Comprobación Complementaria*. + +.. _l10n/mx/month-13: + +Month 13 +******** + +An additional report is the *Month 13*: a closing balance sheet that shows any adjustments or +movements made in the accounting to close the year. + +To generate this XML document, navigate to :menuselection:`Accounting --> Accounting --> Journal +Entries`, and create a new document. Here, add all amounts to modify, and balance the debit and/or +credit of each one. + +After this is done, go to the :guilabel:`Other Info` tab and check the :guilabel:`Month 13 Closing` +field. If needed, go to :menuselection:`Accounting --> Reporting --> Trial Balance` and select the +date :guilabel:`Month 13`, where it is possible to see the the total amount of the year, plus all +the additions of the journal entry. To generate the XML file, click the :icon:`fa-cog` +:guilabel:`(action menu)`, then select :guilabel:`SAT (XML)`. + +.. _l10n/mx/general-ledger: + +General ledger +~~~~~~~~~~~~~~ + +By law, all transactions in Mexico must be recorded digitally. Since Odoo automatically creates all +the underlying journal entries of all invoices and payments, simply exporting the general ledger +complies with |SAT|'s audits and/or tax refunds. + +.. tip:: + The report can be filtered by period or by journal, depending on the need. + +To create the XML, go to :menuselection:`Accounting --> Reporting --> General Ledger`, click +:icon:`fa-cog` :guilabel:`(action menu)`, then click :guilabel:`XML (Polizas)`. Then, select among +four :guilabel:`Export` types: + +- :guilabel:`Tax audit` +- :guilabel:`Audit certification` +- :guilabel:`Return of goods` +- :guilabel:`Compensation` + +For :guilabel:`Tax audit` or :guilabel:`Audit certification`, add the :guilabel:`Order Number` +provided by the |SAT|. For :guilabel:`Return of goods` or :guilabel:`Compensation`, add the +:guilabel:`Process Number`, also provided by the |SAT|. + +.. note:: + To see this report without sending it, use `ABC6987654/99` for the :guilabel:`Order + Number` or `AB123451234512` for the :guilabel:`Process Number`. + +.. _l10n/mx/diot: + +DIOT report +~~~~~~~~~~~ + +The DIOT (Declaración Informativa de Operaciones con Terceros / *Informative Declaration of +Operations with Third Parties*) is an additional obligation with the |SAT|, where the current status +of creditable and non-creditable payments, withholdings, import taxes, and refunds of VAT from your +vendor bills are provided to the |SAT|. + +.. note:: + Since July 2025 the new 2025 version of the report is available. + +Unlike other reports, the |DIOT| is uploaded to a software provided by the |SAT| that contains the +A-29 form. In Odoo, you can download the records of your transactions as a TXT file that can be +uploaded to the form, avoiding direct capture of this data. + +The transactions file contains the total amount of your payments registered in vendor bills, broken +down into the corresponding types of IVA. The :guilabel:`VAT` and :guilabel:`Country` is mandatory +for all vendors. + +To download the |DIOT| report as a TXT file, go to :menuselection:`Accounting --> Reports --> Tax +Return`. Select the desired month, click :icon:`fa-cog` :guilabel:`(action menu)`, and select +:guilabel:`DIOT (TXT)`. + +.. image:: mexico/mx-reports-diot.png + :alt: DIOT (TXT) download button. + +.. important:: + It is required to fill in the :guilabel:`Type of Operation` field in the :guilabel:`Accounting` + tab of each vendor to prevent validation errors. Make sure that foreign customers have their + :guilabel:`Country` set. + + .. image:: mexico/mx-reports-diot-contact.png + :alt: DIOT information on a vendor contact. + + Selecting :guilabel:`87 - Global Operations` will cause the final TXT file to merge all vendors + that are part of the global operations under one generic VAT: *XAXX010101000*. + +.. _l10n/mx/external-trade: External trade -------------- @@ -627,17 +1027,19 @@ PDF, to invoices with a foreign customer according to `SAT regulations - The specific address of the receiver and the sender - The addition of a :guilabel:`Tariff Fraction` that identifies the type of product -- The correct :guilabel:`Incoterm` (International Commercial Terms), among others (*certificate of - origin* and *special units of measure*). +- The correct :doc:`../accounting/customer_invoices/incoterms` (International Commercial Terms) +- And more, such as the *certificate of origin* and *special units of measure* This allows the correct identification of exporters and importers, in addition to expanding the description of the merchandise sold. -Since January 1, 2018, external trade is a requirement for taxpayers, who carry export operations of -type A1. While the current CFDI is 4.0, the external trade is currently on version 1.1 +Since January 1, 2018, external trade is a requirement for taxpayers who carry export operations of +type A1. While the current CFDI is 4.0, the external trade is currently on version 2.0. -In order to use this feature, the modules :guilabel:`l10n_mx_edi_extended` and -:guilabel:`l10n_mx_edi_extended_40` have to be installed. + +.. note:: + In order to use this feature, the :guilabel:`EDI for Mexico (Advanced Features)` + `l10n_mx_edi_extended` module must be installed. .. important:: Before installing, make sure your business needs to use this feature. Consult your accountant @@ -650,22 +1052,20 @@ Contacts ******** To configure your company contact for external trade, navigate to :menuselection:`Accounting --> -Customers --> Customers`, and select your :guilabel:`Company`. While the CFDI 4.0 requirements ask -you to add a valid :guilabel:`ZIP` code in your contact, the external trade complement adds the -requirement that your :guilabel:`City` and the :guilabel:`State` must also be valid. All three -fields must coincide with the `Official SAT Catalog `_, or you will receive an error. +Customers --> Customers`, remove the default :guilabel:`Customer Invoices` filter, and select your +:guilabel:`Company` name. While the CFDI 4.0 requirements require adding a valid :guilabel:`ZIP` +code in the company contact record, the external trade complement adds the requirement that the +:guilabel:`City` and the :guilabel:`State` must also be valid. All three fields must coincide with +the `Official SAT Catalog for Carta Porte +`_, +or it will produce an error. .. warning:: - Add the :guilabel:`City` and :guilabel:`State` in the company's *contact*, not in the company - itself. You can find your company's contact in :menuselection:`Accounting --> Customers --> - Customers`. - -The fields :guilabel:`Locality` and :guilabel:`Colony Code` are optional and can be added in the -company directly in :menuselection:`Settings --> General Settings --> Companies`. These two fields -have to coincide with the data in the |SAT|. + Add the :guilabel:`City` and :guilabel:`State` in the company's *contact record*, not in the + company record itself. -.. image:: mexico/mx-external-trade-rescompany.png - :alt: Optional external trade company fields. +On the contact record, the optional fields :guilabel:`Locality` and :guilabel:`Colony Code` can also +be filled. These two fields also have to coincide with the data in the |SAT|. To configure the contact data for a foreign receiving client, navigate to :menuselection:`Accounting --> Customers --> Customers`, and select the foreign client's contact. The contact must have the @@ -673,19 +1073,15 @@ following fields completed to avoid errors: #. The entire company :guilabel:`Address`, including a valid :guilabel:`ZIP` code and the foreign :guilabel:`Country`. -#. The format of the foreign :guilabel:`VAT` (tax identification number, for example: Colombia - `123456789-1`) -#. In the :guilabel:`MX EDI` tab, you need to address if the customer receives goods for a period of - time temporarily (:guilabel:`Temporary`) or permanently (:guilabel:`Definitive`). +#. The foreign :guilabel:`RFC` (tax identification number), in the correct format (for example: + Colombia `123456789-1`) +#. In the :guilabel:`Sales & Purchase` tab, to activate the :guilabel:`Needs external trade?` + checkbox. .. important:: - If the new contact was created by duplicating another existing contact from Mexico, make sure to - delete any carried over information from the :guilabel:`Fiscal Regime` field. In addition, do not - enable the :guilabel:`No Tax Breakdown` option. Selecting this option hides mandatory fields that - are required for external trade contact configuration. -.. image:: mexico/mx-external-trade-customer-contact.png - :alt: Required external trade customer fields. + Do not enable the :guilabel:`No Tax Breakdown` option for External Trade customers. Selecting + this option hides mandatory fields that are required for external trade contact configuration. .. note:: In the resulting XML and PDF files, the :guilabel:`VAT` is automatically replaced by the generic @@ -694,14 +1090,15 @@ following fields completed to avoid errors: Products ******** -All products involved with external trade have four fields that are required, two of them exclusive -to external trade. +All products involved with external trade have four additional fields that are required, two of +which are exclusive to external trade. -#. The :guilabel:`Internal Reference` of the product is in the :guilabel:`General Information` tab. -#. The :guilabel:`Weight` of the product must be more than `0`. +#. The :guilabel:`Reference` of the product must be set in the :guilabel:`General Information` tab. +#. The :guilabel:`Weight` of the product in the :guilabel:`Inventory` tab must be more than `0`. #. The `correct `_ :guilabel:`Tariff - Fraction` of the product in the :guilabel:`Accounting` tab. -#. The :guilabel:`UMT Aduana` corresponds to the :guilabel:`Tariff Fraction`. + Fraction` of the product must be set in the :guilabel:`Accounting` tab for external trade. +#. The :guilabel:`UMT Aduana` in the :guilabel:`Accounting` tab must be set and correspond to the + :guilabel:`Tariff Fraction` for external trade. .. image:: mexico/mx-external-trade-product.png :alt: Required external trade product fields. @@ -716,173 +1113,183 @@ Invoicing flow ~~~~~~~~~~~~~~ Before creating an invoice, it is important to take into account that external trade invoices -require to convert the amounts of your product into USD. Therefore, :doc:`multicurrency -<../accounting/get_started/multi_currency>` **must** be enabled and *USD* **must** be activated in -the :guilabel:`Currencies` section. The correct :guilabel:`Service` to run is :guilabel:`Mexican -Bank`. +require converting product prices into a foreign currency such as USD. Therefore, +:doc:`multicurrency <../accounting/get_started/multi_currency>` **must** be enabled with the foreign +currency activated in the :guilabel:`Currencies` section. The correct :guilabel:`Service` to run is +:guilabel:`[MX] Bank of Mexico`. To convert product prices, create a :doc:`pricelist +<../../sales/sales/products_prices/prices/pricing>` in the foreign currency. Then, with the correct exchange rate set up in :menuselection:`Accounting --> Settings --> -Currency`, the only fields left are :guilabel:`Incoterm` and the optional :guilabel:`Certificate -Source` in the :guilabel:`Other Info` tab. +Currency`, set the :guilabel:`Incoterm` and the optional :guilabel:`Certificate Source` fields in +the invoice's :guilabel:`Other Info` tab. -.. image:: mexico/mx-external-trade-other-info.png - :alt: External trade Other Info tab of a product. +Finally, confirm the invoice with the same process as a regular invoice, and click the +:guilabel:`Send` button to sign it via CFDI. -Finally, sign the invoice with the same process as a regular invoice, and click the -:guilabel:`Process Now` button. +.. _l10n/mx/pos: -Delivery guide --------------- +Point of sale +============= -A `Carta Porte `_ is a bill of -lading: a document that states the type, quantity, and destination of goods being carried. +The :doc:`Point of sale <../../sales/point_of_sale>` adaptation of the Mexican Localization enables +the creation of invoices that comply with the |SAT| requirements directly in the **POS session**, +with the added benefit of creating receipt tickets that allow *self-invoicing* in a special portal +and creating global invoices. -On December 1st, 2021, version 2.0 of this CFDI was implemented for all transportation providers, -intermediaries, and owners of goods. Odoo is able to generate a document type "T" (Traslado), which, -unlike other documents, is created in a delivery order instead of an invoice or payment. +.. _l10n/mx/pos/flow: -Odoo can create XML and PDF files with (or without) ground transport, and can process materials that -are treated as *Dangerous Hazards*. +Point of sale flow +------------------ -In order to use this feature, the modules :guilabel:`l10n_mx_edi_extended`, -:guilabel:`l10n_mx_edi_extended_40`, :guilabel:`l10n_mx_edi_stock` and -:guilabel:`l10n_mx_edi_stock_40` have to be installed. +Other than the standard :doc:`Point of Sale configuration +<../../sales/point_of_sale/configuration>`, the only requirement for the Mexican localization is the +additional fact that each payment method needs to be configured with a correct :guilabel:`Payment +Way`. -In addition to this, it is necessary to have the :doc:`Inventory -<../../inventory_and_mrp/inventory>` and :doc:`Sales <../../sales/sales>` apps installed, as well. +.. tip:: + By default Odoo creates preconfigured payment methods for cash, credit card, and debit card. -.. important:: - Odoo does not support Carta Porte type document type "I" (Ingreso), air, or marine transport. - Consult your accountant first if this feature is needed before doing any modifications. +While selling on the **Point of Sale**, click the :guilabel:`Customer` button to either create or +select a customer. Here it is possible to review customer invoicing information (such as the |RFC| +or :guilabel:`Fiscal Regime`) and even modify it directly inside the session. -Configuration -~~~~~~~~~~~~~ +After selecting a customer, tick the :icon:`fa-file-text-o` :guilabel:`Invoice` checkbox. This opens +a menu to select the :guilabel:`Usage` and to define if it is an invoice to the public. Click +confirm, select the payment method, and then click validate to complete the order. The PDF is then +downloaded and it is possible to send the invoice via mail to the final customer alongside the +receipt. -Odoo manages two different types of CFDI: +.. tip:: + To create invoices from orders, go to the :guilabel:`Orders` menu, select the order, click + :guilabel:`Load Order`, and tick the :icon:`fa-file-text-o` :guilabel:`Invoice` checkbox. This + opens the same menu for the :guilabel:`Usage` and :guilabel:`CFDI to Public`. -- **No Federal Highways**: Is used when the *Distance to Destination* is `less than 30 KM - `_. -- **Federal Transport**: Is used when the *Distance to Destination* exceeds 30 KM. +.. image:: mexico/mx-pos.png + :alt: Invoice Configuration for Point of Sale. -Other than the standard requirements of regular invoicing (The |RFC| of the customer, the UNSPSC -code, etc.), if you are using *No Federal Highways*, no external configuration is needed. +To sign a credit note automatically, tick the :icon:`fa-file-text-o` :guilabel:`Invoice` checkbox +when processing a :ref:`refund `. -For *Federal Transport*, several configurations have to be added to contacts, vehicle setups, and -products. Those configurations are added to the XML and PDF files. +.. note:: + Credit notes for returned products will contain the relation type :guilabel:`03 - Devolución de + mercancía sobre facturas o traslados previos`. -Contacts and vehicles -********************* +.. important:: + - In the Mexican localization, positive and negative lines in a **POS** session cannot be mixed. + - If a |SAT| validation error occurs customer will get a :doc:`Pro-Forma + <../../sales/sales/invoicing/proforma>` invoice instead. -Like the external trade feature, the :guilabel:`Address` in both the company and the final customer -must be complete. The :guilabel:`ZIP` code, :guilabel:`City`, and :guilabel:`State` must coincide -with the `Official SAT Catalog for Carta Porte _`. +.. _l10n/mx/pos/portal: -.. tip:: - The field, :guilabel:`Locality`, is optional for both addresses. +Self-invoicing portal +--------------------- -.. image:: mexico/mx-delivery-guide-contacts.png - :alt: Delivery guide contact configuration. +If the final customer is not sure if they want to have their invoice generated at the exact moment +of the sale, it is possible to give them the option of creating a receipt with either a QR code or a +URL. To do so, follow these steps: -.. important:: - The origin address used for the delivery guide is set in :menuselection:`Inventory --> - Configuration --> Warehouses Management --> Warehouses`. While this is set as the company address - by default, you can change it according to your correct warehouse address. +#. Go to :menuselection:`Point of Sale --> Configuration`. +#. Select the :guilabel:`Point of Sale`. +#. Scroll to the :guilabel:`Bills & Receipts` section. +#. Enable :guilabel:`Self-service invoicing`. +#. Set the :guilabel:`Print` field to :guilabel:`QR code`, :guilabel:`URL`, or :guilabel:`QR code + + URL`. -Another addition to this feature is the :guilabel:`Vehicle Setups` menu found in -:menuselection:`Inventory --> Settings --> Mexico`. This menu lets you add all the information -related to the vehicle used for the delivery order. +Customers who scan this QR code or follow the URL will access to a menu where they can add their +fiscal information, including the *Usage* and *Fiscal Regime* once they enter the five digit code +that is also provided on the receipt. -All fields are mandatory to create a correct delivery guide. +.. seealso:: + :doc:`../../sales/point_of_sale/receipts_invoices` -.. tip:: - The fields, :guilabel:`Vehicle Plate Number` and :guilabel:`Number Plate`, must contain between - 5 to 7 characters. +.. _l10n/mx/pos/global-invoice: -In the :guilabel:`Intermediaries` section, you must add the operator of the vehicle. The only -mandatory fields for this contact are the :guilabel:`VAT` and :guilabel:`Operator Licence`. +Global invoice +-------------- -.. image:: mexico/mx-delivery-guide-vehicle.png - :alt: Delivery guide vehicle configuration. +As with regular sales orders, global invoices can also be created from a POS session. -Products -******** +For this, make sure not to select a customer or the invoice option in the payment menu and go to +:menuselection:`Point of Sale --> Orders --> Orders`. There, select all the orders to invoice, click +:icon:`fa-cog` :guilabel:`Actions` and select :guilabel:`Create Global Invoice`. -Similar to regular invoicing, all products must have a :guilabel:`UNSPSC category`. In addition to -this, there are two extra configurations for products involved in delivery guides: +Like with sales orders, choose the correct :guilabel:`Periodicity` and press :guilabel:`Create`. -- The :guilabel:`Product Type` must be set as :guilabel:`Storable Product` for stock movements to be - created. -- In the :guilabel:`Inventory` tab, the field :guilabel:`Weight` should have more than `0`. +This attaches an XML file to each of the selected orders. The XML files can be downloaded by going +to the :guilabel:`CFDI` tab. If needed, it is possible to cancel the invoice from the same tab. -.. warning:: - Creating a delivery guide of a product with the value `0` will trigger an error. As the - :guilabel:`Weight` has been already stored in the delivery order, it is needed to return the - products, and create the delivery order (and delivery guide) again with the correct amounts. +If eventually any of the orders that are part of the global invoice need to be addressed to a +customer, it is still possible to send an invoice by entering a new POS session, clicking the +:icon:`fa-bars` :guilabel:`(drop-down menu)`, then click :guilabel:`Orders`. Change the +:guilabel:`All active orders` filter to :guilabel:`Paid`, select the order, and click the +:icon:`fa-file-text-o` :guilabel:`Invoice` button. -.. image:: mexico/mx-delivery-guide-products.png - :alt: Delivery guide product configuration. +.. note:: + Global invoices, just as regular invoices, can only be grouped by physical address. That is + determined by the address set on the POS invoice journal, so when attempting to invoice two + addresses a warning will come up to warn the user of the error. -Sales and inventory flow -~~~~~~~~~~~~~~~~~~~~~~~~ +.. _l10n/mx/ecommerce: -To create a delivery guide, first, you need to create and confirm a sales order from -:menuselection:`Sales --> Sales Order`. This generates a :guilabel:`Delivery` smart button. Click -it, and :guilabel:`Validate` the transfer. +eCommerce +========= -After the status is set to :guilabel:`Done`, you can edit the transfer, and select the -:guilabel:`Transport Type` (either :guilabel:`No Federal Highways` or :guilabel:`Federal -Transport`). +The eCommerce adaptation of the Mexican Localization provides and extra step to create invoices that +comply with the |SAT| requirements on :doc:`eCommerce <../../websites/ecommerce>` by retrieving +the customer data after the **Checkout** and even allowing for the signature of **automatic +invoices** after the payment is processed, as well as sending customers the files via email and +granting them access to retrieve their PDF & XML files from their own customer portal. -If your delivery guide has the type :guilabel:`No Federal Highways`, you can save the transfer, and -then click :guilabel:`Generate Delivery Guide`. The resulting XML can be found in the chatter. +.. _l10n/mx/ecommerce/flow: -.. note:: - Other than the :guilabel:`UNSPSC` in all products, delivery guides that use :guilabel:`No Federal - Highways` do not require any special configuration to be sent to the government. +eCommerce flow +-------------- -If your delivery guide has the type, :guilabel:`Federal Transport`, the tab :guilabel:`MX EDI` -appears. There, enter a value in :guilabel:`Distance to Destination (KM)` bigger than `0`, and -select the :guilabel:`Vehicle Setup` used for this delivery. +During the regular checkout process, a new :guilabel:`Invoicing Info` step appears, where it is +possible to request an invoice or not. If :guilabel:`No` is selected, a **CFDI to Public** is +created,. If :guilabel:`Yes` is selected, the :guilabel:`RFC`, :guilabel:`Fiscal Regime`, +and :guilabel:`Usage` are required in order to get all information in the sales order, where its +status will change to :guilabel:`To Invoice`. -.. image:: mexico/mx-delivery-guide-federal-transport.png - :alt: Delivery guide MX EDI tab configuration. +.. important:: + Make sure to add a :guilabel:`UNSPSC code` to the :ref:`shipping product + `. -Dangerous hazards -***************** +If you enable the :guilabel:`Automatic Invoicing` in :menuselection:`Settings --> Website --> +Invoicing`, the electronic document will be signed automatically. -Certain values in the :guilabel:`UNSPSC Category` are considered in the `official SAT catalog -`_ as *dangerous -hazards*. These categories need additional considerations when creating a delivery guide with -:guilabel:`Federal Transport`. +.. _l10n/mx/subscriptions: -First, select your product from :menuselection:`Inventory --> Products --> Products`. Then, in the -:guilabel:`Accounting` tab, the fields :guilabel:`Hazardous Material Designation Code (MX)` and -:guilabel:`Hazardous Packaging (MX)` must be filled with the correct code from the |SAT| catalog. +Subscriptions +============= -.. image:: mexico/mx-delivery-guide-hazards-designation.png - :alt: Delivery guide hazardous material product required fields. +While handling subscriptions, all the sales fields are used to create the recurrent invoices. These +are automatically signed and sent via email with the PDF and XML attached with no additional manual +actions required. -In :menuselection:`Inventory --> Settings --> Mexico --> Vehicle Setup`, the data from the -:guilabel:`Environment Insurer` and :guilabel:`Environment Insurance Policy` has to be filed, as -well. After this, continue with the regular process to create a delivery guide. +.. _l10n/mx/inventory: -.. image:: mexico/mx-delivery-guide-hazards-environment.png - :alt: Delivery Guide environment insurer required fields. +Inventory +========= + +.. _l10n/mx/inventory/customs: Customs numbers --------------- A *customs declaration* (Pedimento Aduanero) is a fiscal document that certifies that all -contributions to the fiscal entity (the |SAT|) has been paid for, including the import/export of +contributions to the fiscal entity (the |SAT|) have been paid for, including the import/export of goods. According to the `Annex 20 `_ of -CFDI 4.0, in documents where the invoiced goods come from a first-hand import operation, the field, -:guilabel:`Customs Number`, needs to be added to all lines of products involved with the operation. +CFDI 4.0, in documents where the invoiced goods come from a first-hand import operation, the +:guilabel:`Customs Number` field, needs to be added to all lines of products involved with the +operation. -To do so, the module :guilabel:`l10n_mx_edi_landing` must be installed, in addition to the -:doc:`Inventory <../../inventory_and_mrp/inventory>`, :doc:`Purchase -<../../inventory_and_mrp/purchase>` and :doc:`Sales <../../sales/sales>` apps. +.. note:: + To do so, the :guilabel:`Odoo Mexico Localization for Stock/Landing` `l10n_mx_edi_landing` module + must be installed, in addition to the :doc:`Inventory <../../inventory_and_mrp/inventory>`, + :doc:`Purchase <../../inventory_and_mrp/purchase>`, and :doc:`Sales <../../sales/sales>` apps. .. important:: Do not confuse this feature with external trade. The customs numbers are directly related to @@ -894,21 +1301,26 @@ Configuration In order to track the correct customs number for a specific invoice, Odoo uses :doc:`landed costs <../../inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs>`. Go to -:menuselection:`Inventory --> Configuration --> Settings --> Valuation`. Make sure that -:guilabel:`Landed Costs` is activated. +:menuselection:`Inventory --> Configuration --> Settings`, and in the :guilabel:`Valuation` section, +make sure that :guilabel:`Landed Costs` is activated. -Begin by creating a *service*-type product called, `Pedimento`. In the :guilabel:`Purchase` tab, +Begin by creating a **service-type** product called, `Pedimento`. In the :guilabel:`Purchase` tab, activate :guilabel:`Is a Landed Cost`, and select a :guilabel:`Default Split Method`. -Then, configure the *storable products* that hold the customs numbers. To do so, create the storable -products, and make sure the :guilabel:`Product Category` has the following configuration. +Then, configure the **goods-type** products that hold the customs numbers. To do so, create the +products, and make sure the :guilabel:`Product Category` has the following configuration: - :guilabel:`Costing Method`: Either :guilabel:`FIFO` or :guilabel:`AVCO` - :guilabel:`Inventory Valuation`: :guilabel:`Automated` -- :guilabel:`Stock Valuation Account`: :guilabel:`115.01.01 Inventario` +- :guilabel:`Stock Valuation Account`: :guilabel:`115.01.01 Inventory` - :guilabel:`Stock Journal`: :guilabel:`Inventory Valuation` -- :guilabel:`Stock Input Account`: :guilabel:`115.05.01 Mercancías en tránsito` -- :guilabel:`Stock Output Account`: :guilabel:`115.05.01 Mercancías en tránsito` +- :guilabel:`Stock Input Account`: :guilabel:`115.05.01 Goods in transit` +- :guilabel:`Stock Output Account`: :guilabel:`115.05.01 Goods in transit` + +.. note:: + Setting the :guilabel:`Inventory Valuation` to :guilabel:`Automated` requires first enabling the + feature. Go to :menuselection:`Accounting --> Configuration --> Settings`, and in the + :guilabel:`Stock Valuation` section, enable :guilabel:`Automatic Accounting`. .. image:: mexico/mx-landing-configuration.png :alt: Storable products general configuration. @@ -919,192 +1331,203 @@ products, and make sure the :guilabel:`Product Category` has the following confi Purchase and sales flow ~~~~~~~~~~~~~~~~~~~~~~~ -After you configure your product, follow the standard :doc:`purchase flow +After configuring the product, follow the standard :doc:`purchase flow <../../inventory_and_mrp/purchase>`. Create a purchase order from :menuselection:`Purchase --> Orders --> Purchase Order`. Then, confirm the order to display a :guilabel:`Receipt` smart button. Click on the :guilabel:`Receipt` smart -button to :guilabel:`Validate` the receipt. +button and :guilabel:`Validate` the receipt. -Go to :menuselection:`Inventory --> Operations --> Landed Costs`, and create a new record. Add the -transfer that you just created, and both: the product `Pedimento` and :guilabel:`Customs number`. +Go to :menuselection:`Inventory --> Operations --> Landed Costs`, and create a new record. In the +:guilabel:`Transfer`, add the receipt that was just validated, add the :guilabel:`Customs number` +and in the :guilabel:`Additional Costs` tab, add the :guilabel:`Pedimento` product. -Optionally, you can add a cost amount. After this, validate the landed cost. Once -:guilabel:`Posted`, all products related to that receipt have the customs number assigned. +Optionally, it is possible to add a cost amount. After this, :guilabel:`Validate` the landed cost. +Once :guilabel:`Posted`, all products related to that receipt have the customs number assigned. .. warning:: - You can only add the *Pedimentos* number **once**, so be careful when associating the correct - number with the transfer(s). + The :guilabel:`Pedimento Number` field is not editable once it is set, so be careful when + associating the correct number with the transfer(s). .. image:: mexico/mx-landing-inventory.png :alt: Customs number on a landed costs Inventory record. -Now, create a sales order, and confirm it. This should trigger a :guilabel:`Delivery` smart button. -Validate it. +Next, create a sales order and confirm it. Click on the :guilabel:`Delivery` smart button that +appears, and :guilabel:`Validate` the delivery order. -Finally, create an invoice from the sales order, and confirm it. The invoice line related to your -product has a customs number in it. This number should match the customs number added in the -*Landed Costs* record you created earlier. +Finally, :ref:`create an invoice from the sales order `, and confirm it. +The invoice line related to the product has a customs number on it. This number matches the customs +number added in the landed cost record created earlier. .. image:: mexico/mx-landing-invoice.png :alt: Customs number on confirmed sales order product. -Electronic accounting ---------------------- +.. _l10n/mx/inventory/delivery-guide: -For Mexico, `Electronic Accounting -`_ refers to the -obligation to keep accounting records and entries through electronic means, and to enter accounting -information on a monthly basis, through the |SAT| website. +Delivery guide +-------------- -It consists of three main XML files: +A `Carta Porte `_ is a bill of +lading: a document that states the type, quantity, and destination of goods being carried. -#. The updated list of the chart of accounts that you are currently using. -#. A monthly trial balance, plus a closing entry report, also known as: *Trial Balance Month 13*. -#. Either optional, or for a compulsory audit, an export of the journal entries in your general - ledger. +On July 17th, 2024, version 3.1 of this |CFDI| was implemented for all transportation providers, +intermediaries, and owners of goods. Odoo is able to generate a document type "T" (Traslado), which, +unlike other documents, is created in a delivery order instead of an invoice or payment. -The resulting XML files follow the requirements of the `Anexo Técnico de Contabilidad Electrónica -1.3 `_. +Odoo can create XML and PDF files with (or without) ground transport, and can process materials that +are treated as *Dangerous Hazards*. -In addition to this, you can generate the `DIOT -`_: A report of vendor's journal entries that involve IVA taxes that can be -exported in a :file:`.txt` file. +.. note:: + In order to use this feature, the :guilabel:`Mexico - Electronic Delivery Guide` + `l10n_mx_edi_stock` module must be installed. -In order to use these reports, the modules :guilabel:`l10n_mx_reports`, -:guilabel:`l10n_mx_reports_closing`, :guilabel:`l10n_mx_xml_polizas` and -:guilabel:`l10n_mx_xml_polizas_edi` have to be installed, as well as the :doc:`Accounting -<../accounting/get_started>`. + Additionally, it is necessary to have the :doc:`Inventory <../../inventory_and_mrp/inventory>` + and :doc:`Sales <../../sales/sales>` apps installed. .. important:: - The specific characteristics and obligations of the reports that you send might change according - to your fiscal regime. Always contact your accountant before sending any documents to the - government. + Odoo does not support Carta Porte type document type "I" (Ingreso), air, or marine transport. + Consult your accountant first if this feature is needed before doing any modifications. -.. _l10n_mx/chart-of-accounts: +Configuration +~~~~~~~~~~~~~ -Chart of accounts -~~~~~~~~~~~~~~~~~ +Odoo manages two different types of CFDI type "T". Both can be created from either :doc:`incoming +shipments or delivery orders +<../../inventory_and_mrp/inventory/shipping_receiving/daily_operations>`. -The :doc:`chart of accounts <../accounting/get_started/chart_of_accounts>` in México follows a -specific pattern based on |SAT|'s' `Código agrupador de cuentas -`_. +- :guilabel:`No Federal Highways` is used when the :guilabel:`Distance to Destination` is `less + than 30 km + `_. +- :guilabel:`Federal Transport` is used when the :guilabel:`Distance to Destination` exceeds 30 km. -You can create any account, as long as it respects |SAT|'s encoding group: the pattern is -`NNN.YY.ZZ` or `NNN.YY.ZZZ`. +Other than the standard requirements of regular invoicing (the |RFC| of the customer, the UNSPSC +code, etc.), if you are using *No Federal Highways*, no external configuration is needed. -.. example:: - Some examples are `102.01.99` or `401.01.001`. +For *Federal Transport*, several configurations have to be added to contacts, vehicle setups, and +products. Those configurations are then included in the XML and PDF files. -When a new account is created in :menuselection:`Accounting --> Configuration --> Chart of -Accounts`, with the |SAT| encoding group pattern, the correct grouping code appears in -:guilabel:`Tags`, and your account appears in the *COA* report. +Contacts and vehicles +********************* -Once you create all your accounts, make sure the correct :guilabel:`Tags` are added. +Like the external trade feature, the :guilabel:`Address` in both the company and the final customer +must be complete. The :guilabel:`ZIP` code, :guilabel:`City`, and :guilabel:`State` must coincide +with the `Official SAT Catalog for Carta Porte +`_. -.. note:: - You cannot use any pattern that ends a section with a 0 (such as `100.01.01`, `301.00.003` or - `604.77.00`). This triggers errors in the report. +.. tip:: + The field, :guilabel:`Locality`, is optional for both addresses. -Once everything is set up, go to :menuselection:`Accounting --> Reporting --> Trial Balance`, -click the :icon:`fa-caret-down` (:guilabel:`down arrow`) next to the :guilabel:`PDF` button, and -select :guilabel:`COA SAT (XML)`. This generates an XML file with your accounts, which you can -upload directly to the |SAT| website. +.. important:: + The origin address used for the delivery guide is set in :menuselection:`Inventory --> + Configuration --> Warehouses`. While this is set as the company address by default, you can + change it to your correct warehouse address. -Trial balance -~~~~~~~~~~~~~ +Another addition to this feature is the :guilabel:`Vehicle Setups` menu found in +:menuselection:`Inventory --> Settings --> Vehicle Setups`. This menu lets you add all the +information related to the vehicle used for the delivery order. -The trial balance reports the initial balance, credit, and total balance of your accounts, provided -that you added their correct :ref:`encoding group `. +All fields are mandatory to create a correct delivery guide. -To generate this report in an XML format, go to :menuselection:`Accounting --> Reporting --> -Trial Balance`. Select the month you want to download in the calendar, then click the -:icon:`fa-caret-down` (:guilabel:`down arrow`) next to the :guilabel:`PDF` button, and select -:guilabel:`SAT (XML)`. +.. tip:: + The fields, :guilabel:`Vehicle Plate Number` and :guilabel:`Number Plate`, must contain between + 5 and 7 characters. -.. image:: mexico/mx-reports-trial-balance.png - :alt: Trial balance report. +In the :guilabel:`Intermediaries` section, add the operator of the vehicle. The only mandatory +fields for this contact are the :guilabel:`VAT` and :guilabel:`Operator Licence`. -.. note:: - Odoo does not generate the *Balanza de Comprobación Complementaria*. +.. image:: mexico/mx-delivery-guide-vehicle.png + :alt: Delivery guide vehicle configuration. -Month 13 trial balance -********************** +Products +******** -The *Month 13* report is a closing balance sheet that shows any adjustments or movements made in the -accounting to close the year. +Similar to regular invoicing, all products must have a :guilabel:`UNSPSC category`. In addition to +this, there are two extra configurations for products involved in delivery guides: -To generate it, proceed as follows: +- The :guilabel:`Product Type` must be set as :guilabel:`Storable Product` for stock movements to be + created. +- In the :guilabel:`Inventory` tab, the field :guilabel:`Weight` must be more than `0`. -#. Go to :menuselection:`Accounting --> Accounting --> Journal Entries` and create a new entry for - all the amounts to be changed, balancing the debit and/or credit of each one. -#. In the :guilabel:`Other Info` tab, enable the :guilabel:`Month 13 Closing` option. -#. Go to :menuselection:`Accounting --> Reporting --> Trial Balance`, click the calendar, and select - :guilabel:`Month 13`. -#. Click the :icon:`fa-caret-down` (:guilabel:`down arrow`) next to the :guilabel:`PDF` button, and - select :guilabel:`SAT (XML)`. +.. warning:: + Creating a delivery guide of a product with the value `0` will trigger an error. As the + :guilabel:`Weight` has been already stored in the delivery order, it is needed to return the + products and create the delivery order (and delivery guide) again with the correct amounts. -.. image:: mexico/mx-reports-trial-balance-13-report.png - :alt: Trial Balance Month 13 report. +Sales and inventory flow +~~~~~~~~~~~~~~~~~~~~~~~~ -General ledger -~~~~~~~~~~~~~~ +To create a delivery guide, first, first create and confirm a sales order from :menuselection:`Sales +--> Sales Order`. Click the :guilabel:`Delivery` smart button that is generated, and +:guilabel:`Validate` the transfer. -By law, all transactions in Mexico must be recorded digitally. Since Odoo automatically creates all -the underlying journal entries of your invoicing and payments, you can export your journal entries -to comply with |SAT|'s audits and/or tax refunds. +After the status is set to :guilabel:`Done`, you can edit the transfer, and select the +:guilabel:`Transport Type` in the :guilabel:`Additional Info` tab. + +If using the :guilabel:`No Federal Highways` :guilabel:`Transport Type`, save the transfer, and then +click :guilabel:`Generate Delivery Guide`. The resulting XML can be found in the chatter. + +.. note:: + Other than the :guilabel:`UNSPSC` on all products, delivery guides that use :guilabel:`No Federal + Highways` do not require any special configuration to be sent to the government. + +If using the :guilabel:`Federal Transport` :guilabel:`Transport Type`, the tab :guilabel:`MX EDI` +appears. There, enter a value in :guilabel:`Distance to Destination (KM)` greater than `0`, and +select the :guilabel:`Vehicle Setup` used for this delivery. + +Finally, add a :guilabel:`Gross Vehicle Weight` and click :guilabel:`Generate Delivery Guide`. .. tip:: - You can filter by period, or by journal, according to your current needs. + Delivery Guides can also be created from :guilabel:`Receipts`, either from the Inventory app or + by the standard flow of the Purchase app. -To create the XML, go to :menuselection:`Accounting --> Reporting --> General Ledger`, click the -:icon:`fa-caret-down` (:guilabel:`down arrow`) next to the :guilabel:`PDF` button, and select -:guilabel:`XML (Polizas)`. In the :guilabel:`XML Polizas Export Options` window, choose between four -different :guilabel:`Export` types: +Dangerous hazards +***************** -- :guilabel:`Tax audit` -- :guilabel:`Audit certification` -- :guilabel:`Return of goods` -- :guilabel:`Compensation` +Certain values in the :guilabel:`UNSPSC Category` are considered in the `official SAT catalog +`_ as *dangerous +hazards*. These categories need additional considerations when creating a delivery guide with +:guilabel:`Federal Transport`. -For :guilabel:`Tax audit` or :guilabel:`Audit certification`, you need to write the -:guilabel:`Order Number` provided by the |SAT|. For :guilabel:`Return of goods`, or -:guilabel:`Compensation`, you need to write your :guilabel:`Process Number`, also provided by the -|SAT|. +First, select the product from :menuselection:`Inventory --> Products --> Products`. Then, in the +:guilabel:`Accounting` tab, fill the :guilabel:`Hazardous Material Designation Code` and +:guilabel:`Hazardous Packaging` fields with the correct code from the |SAT| catalog. -.. note:: - If you want to see this report without sending it, use `ABC6987654/99` for :guilabel:`Order - Number` and `AB123451234512` for :guilabel:`Process Number`. +.. image:: mexico/mx-delivery-guide-hazards-designation.png + :alt: Delivery guide hazardous material product required fields. -DIOT report -~~~~~~~~~~~ +.. important:: + There exists the possibility that a :guilabel:`UNSPSC Category` may or may not be a dangerous + hazard (for example *01010101*). If it is not dangerous, enter `0` in the :guilabel:`Hazardous + Material Designation Code` field. -The DIOT (Declaración Informativa de Operaciones con Terceros / *Informative Declaration of -Operations with Third Parties*) is an additional obligation with the |SAT|, where the current status -of creditable and non-creditable payments, withholdings, and refunds of VAT from your vendor bills, -are provided to the |SAT|. +In :menuselection:`Inventory --> Settings --> Vehicle Setup`, complete the :guilabel:`Environment +Insurer` and :guilabel:`Environment Insurance Policy` well. After this, continue with the regular +process to create a delivery guide. -Unlike other reports, the |DIOT| is uploaded to a software provided by the |SAT| that contains the -A-29 form. In Odoo, you can download the records of your transactions as a :file:`.txt` file that -can be uploaded to the form, avoiding direct capture of this data. +Imports and Exports +******************* -The transactions file contains the total amount of your payments registered in vendor bills, broken -down into the corresponding types of IVA. The :guilabel:`VAT` and :guilabel:`Country` is mandatory -for all vendors. +If your Carta Porte is for international operations (for exports), some additional fields need to be +taken into account. -To generate the |DIOT| report, go to :menuselection:`Accounting --> Reporting --> Tax Reports`. -Select the month you want to download in the calendar, then click the :icon:`fa-caret-down` -(:guilabel:`down arrow`) next to the :guilabel:`PDF` button to select :guilabel:`Report: DIOT (MX)` -and download the :file:`.txt` file. +First, make sure that all relevant :guilabel:`Products` have the following configuration: -.. image:: mexico/mx-reports-diot-example.png - :alt: A Vendor Bill that is In Payment. +- :guilabel:`UNSPSC Category` cannot be :guilabel:`01010101 Does not exist in the catalog`. +- :guilabel:`Tariff Fraction` and :guilabel:`UMT Aduana` must be set, similar to the + :ref:`external trade ` flow. +- :guilabel:`Material Type` must be set. -.. important:: - You need to fill the :guilabel:`L10N Mx Type of Operation` field in the :guilabel:`Accounting` - tab of each one of your vendors to prevent validation errors. Make sure that your foreign - customers have their country set up for :guilabel:`L10N Mx Nationality` to appear automatically. +Then, when creating a :guilabel:`Delivery Guide` from a delivery or receipt, fill the following +fields: - .. image:: mexico/mx-reports-diot-contact.png - :alt: DIOT information on a vendor contact. +- :guilabel:`Customs Regimes` +- :guilabel:`Customs Document Type` +- :guilabel:`Customs Document Identification` + +Then, when creating a :guilabel:`Delivery Guide` for a receipt where the :guilabel:`Customs Document +Type` is :guilabel:`Pedimento`, two new fields appear: :guilabel:`Pedimento Number` and +:guilabel:`Importer`. + +.. tip:: + The field :guilabel:`Pedimento Number` should follow the pattern `xx xx xxxx xxxxxxx`. For + example, `15 48 3009 0001235`. diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-certificates.png b/content/applications/finance/fiscal_localizations/mexico/mx-certificates.png deleted file mode 100644 index fe7a5b588e..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-certificates.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-cfdi-to-public.png b/content/applications/finance/fiscal_localizations/mexico/mx-cfdi-to-public.png index f88a264c38..87b6b7f9c9 100644 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-cfdi-to-public.png and b/content/applications/finance/fiscal_localizations/mexico/mx-cfdi-to-public.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-company-info.png b/content/applications/finance/fiscal_localizations/mexico/mx-company-info.png deleted file mode 100644 index 2dd200934f..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-company-info.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-creating-credit-note.png b/content/applications/finance/fiscal_localizations/mexico/mx-creating-credit-note.png deleted file mode 100644 index 34163b86c5..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-creating-credit-note.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-contacts.png b/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-contacts.png deleted file mode 100644 index c277e2fb25..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-contacts.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-federal-transport.png b/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-federal-transport.png deleted file mode 100644 index 4310b34036..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-federal-transport.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-hazards-designation.png b/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-hazards-designation.png index 1daa32e5c5..f6040d6719 100644 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-hazards-designation.png and b/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-hazards-designation.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-hazards-environment.png b/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-hazards-environment.png deleted file mode 100644 index d91beec23f..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-hazards-environment.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-products.png b/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-products.png deleted file mode 100644 index a880ea7298..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-products.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-vehicle.png b/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-vehicle.png index 23637fc892..33bd604483 100644 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-vehicle.png and b/content/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-vehicle.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-external-trade-customer-contact.png b/content/applications/finance/fiscal_localizations/mexico/mx-external-trade-customer-contact.png deleted file mode 100644 index 9c42944410..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-external-trade-customer-contact.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-external-trade-other-info.png b/content/applications/finance/fiscal_localizations/mexico/mx-external-trade-other-info.png deleted file mode 100644 index 6a7862f936..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-external-trade-other-info.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-external-trade-product.png b/content/applications/finance/fiscal_localizations/mexico/mx-external-trade-product.png index e38dd9dea0..51e6dbb01c 100644 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-external-trade-product.png and b/content/applications/finance/fiscal_localizations/mexico/mx-external-trade-product.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-external-trade-rescompany.png b/content/applications/finance/fiscal_localizations/mexico/mx-external-trade-rescompany.png deleted file mode 100644 index 12e058fa76..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-external-trade-rescompany.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-factor-type.png b/content/applications/finance/fiscal_localizations/mexico/mx-factor-type.png deleted file mode 100644 index a71ed20b0a..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-factor-type.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-fiscal-regime.png b/content/applications/finance/fiscal_localizations/mexico/mx-fiscal-regime.png deleted file mode 100644 index 9897792197..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-fiscal-regime.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-invoice-cancellation-reason-01.png b/content/applications/finance/fiscal_localizations/mexico/mx-invoice-cancellation-reason-01.png index 0a56205c1e..3d996a242e 100644 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-invoice-cancellation-reason-01.png and b/content/applications/finance/fiscal_localizations/mexico/mx-invoice-cancellation-reason-01.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-invoice-cancellation-reason-tab.png b/content/applications/finance/fiscal_localizations/mexico/mx-invoice-cancellation-reason-tab.png new file mode 100644 index 0000000000..b0c3c26002 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/mexico/mx-invoice-cancellation-reason-tab.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-landing-configuration-category.png b/content/applications/finance/fiscal_localizations/mexico/mx-landing-configuration-category.png index 9a73f72c41..7e92a71cfb 100644 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-landing-configuration-category.png and b/content/applications/finance/fiscal_localizations/mexico/mx-landing-configuration-category.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-landing-configuration.png b/content/applications/finance/fiscal_localizations/mexico/mx-landing-configuration.png index 05ba958bd0..01fbac9912 100644 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-landing-configuration.png and b/content/applications/finance/fiscal_localizations/mexico/mx-landing-configuration.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-landing-inventory.png b/content/applications/finance/fiscal_localizations/mexico/mx-landing-inventory.png index 8c866debae..cb1d4f3eae 100644 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-landing-inventory.png and b/content/applications/finance/fiscal_localizations/mexico/mx-landing-inventory.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-landing-invoice.png b/content/applications/finance/fiscal_localizations/mexico/mx-landing-invoice.png index 2fa7200181..ec85ec9add 100644 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-landing-invoice.png and b/content/applications/finance/fiscal_localizations/mexico/mx-landing-invoice.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-multicurrency-1.png b/content/applications/finance/fiscal_localizations/mexico/mx-multicurrency-1.png deleted file mode 100644 index f1833de90a..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-multicurrency-1.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-pac-account.png b/content/applications/finance/fiscal_localizations/mexico/mx-pac-account.png index c71116af8e..56aacd23ba 100644 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-pac-account.png and b/content/applications/finance/fiscal_localizations/mexico/mx-pac-account.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-pos.png b/content/applications/finance/fiscal_localizations/mexico/mx-pos.png new file mode 100644 index 0000000000..71ae61dc7e Binary files /dev/null and b/content/applications/finance/fiscal_localizations/mexico/mx-pos.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-ppd-payment.png b/content/applications/finance/fiscal_localizations/mexico/mx-ppd-payment.png index 1f6a64fb01..529c3e613c 100644 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-ppd-payment.png and b/content/applications/finance/fiscal_localizations/mexico/mx-ppd-payment.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-pue-payment.png b/content/applications/finance/fiscal_localizations/mexico/mx-pue-payment.png index 36d778133c..19d2fbfc83 100644 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-pue-payment.png and b/content/applications/finance/fiscal_localizations/mexico/mx-pue-payment.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-reports-diot-contact.png b/content/applications/finance/fiscal_localizations/mexico/mx-reports-diot-contact.png index 97fb8cd93a..168cebf554 100644 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-reports-diot-contact.png and b/content/applications/finance/fiscal_localizations/mexico/mx-reports-diot-contact.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-reports-diot-example.png b/content/applications/finance/fiscal_localizations/mexico/mx-reports-diot-example.png deleted file mode 100644 index 83ba6dcc74..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-reports-diot-example.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-reports-diot.png b/content/applications/finance/fiscal_localizations/mexico/mx-reports-diot.png new file mode 100644 index 0000000000..a4150d9ec7 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/mexico/mx-reports-diot.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-reports-trial-balance-13-report.png b/content/applications/finance/fiscal_localizations/mexico/mx-reports-trial-balance-13-report.png deleted file mode 100644 index 99fdc3d9f0..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-reports-trial-balance-13-report.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-reports-trial-balance.png b/content/applications/finance/fiscal_localizations/mexico/mx-reports-trial-balance.png index 0f2857b391..8a2b591d64 100644 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-reports-trial-balance.png and b/content/applications/finance/fiscal_localizations/mexico/mx-reports-trial-balance.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-send-cfdi.png b/content/applications/finance/fiscal_localizations/mexico/mx-send-cfdi.png new file mode 100644 index 0000000000..375697be59 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/mexico/mx-send-cfdi.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-signed-complement.png b/content/applications/finance/fiscal_localizations/mexico/mx-signed-complement.png deleted file mode 100644 index afaa5b1584..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-signed-complement.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-tax-breakdown.png b/content/applications/finance/fiscal_localizations/mexico/mx-tax-breakdown.png deleted file mode 100644 index d77add1e76..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-tax-breakdown.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-taxes-config.png b/content/applications/finance/fiscal_localizations/mexico/mx-taxes-config.png deleted file mode 100644 index 57fc49ed66..0000000000 Binary files a/content/applications/finance/fiscal_localizations/mexico/mx-taxes-config.png and /dev/null differ diff --git a/content/applications/finance/fiscal_localizations/new_zealand.rst b/content/applications/finance/fiscal_localizations/new_zealand.rst index b8485748f6..50987dc755 100644 --- a/content/applications/finance/fiscal_localizations/new_zealand.rst +++ b/content/applications/finance/fiscal_localizations/new_zealand.rst @@ -2,13 +2,364 @@ New Zealand =========== +.. _localizations/new_zealand/modules: + +Modules +======= + +The following modules related to the New Zealand localization are available: + +.. list-table:: + :widths: 25 25 50 + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`New Zealand - Accounting` + - `l10n_nz` + - Installed by default when the accounting fiscal localization package is set to New Zealand. + This module also installs the remittance advice report module. + * - :guilabel:`Employment Hero NZ Payroll` + - `l10n_employment_hero` + - This module synchronizes all pay runs from Employment Hero with Odoo's journal entries. + * - :guilabel:`EFT Batch Payment` + - `l10n_nz_eft` + - This module allows businesses to streamline bulk payments like payroll and vendor payments. + Each bank has its specific format for these transactions. + +.. note:: + The localization’s core modules are installed automatically with the localization. The rest can + be manually :doc:`installed `. + +.. _localizations/new_zealand/loc-specifics: + +Localization overview +===================== + +- :doc:`../accounting/get_started/chart_of_accounts`: a predefined structure tailored to New + Zealand accounting standards +- :doc:`../accounting/taxes/fiscal_positions`: automated tax adjustments based on customer or + supplier registration status +- :ref:`localizations/new_zealand/taxes-gst` +- :ref:`localizations/new_zealand/reporting` + +.. _localizations/new_zealand/taxes-gst: + +Taxes and GST +------------- + +The default taxes impact the +:doc:`GST report<../../../applications/finance/accounting/reporting/tax_returns>`, which can be +accessed through :menuselection:`Accounting --> Reporting --> Tax Return` + +The standard **Goods and Service Tax** (GST) rate is 15%, but different rates and exemptions exist +for specific categories of goods and services. + +.. seealso:: + :doc:`GST report<../../../applications/finance/accounting/reporting/tax_returns>` + +.. _localizations/new_zealand/tax-mapping: + +Tax mapping +~~~~~~~~~~~ + +Within the New Zealand localization package, tax names encompass the tax rate as an integral part +of their naming convention. + +.. seealso:: + :doc:`Taxes documentation <../../../applications/finance/accounting/taxes>` + +These are the taxes in Odoo. + +.. list-table:: + :widths: 25 25 25 25 + :header-rows: 1 + + * - GST name + - Description + - Label on invoices + - GST Type + * - 15% + - Sale (15%) + - GST Sales (15%) + - Sales + * - 15% + - Purch (15%) + - GST Purchases (15%) + - Purchases + * - 0% EX + - Zero/Export (0%) Sale + - Zero Rated (Export) Sales + - Sales + * - 0% F + - Zero/Import (0%) Purch + - GST Free Purchases + - Purchases + * - 0% TPS + - Purch (Imports Taxable) + - Purchase (Taxable Imports) - Tax Paid Separately + - Purchases + * - 100% ONLY + - GST Only - Imports + - GST Only on Imports + - Purchases + +.. _localizations/new_zealand/reporting: + +Reporting +--------- + +.. _localizations/new_zealand/gst-report: + +GST report +~~~~~~~~~~ + +The **Goods and Services Tax (GST) report** is a critical tax reporting requirement for businesses +registered for GST. The GST return is used to report and remit GST to the **Inland Revenue +Department (IRD)**. + +.. image:: new_zealand/GST_report.png + :alt: GST Report. + +The base and tax amounts are collected from the **GST**, which is pre-configured in Odoo to align +with GST Return requirements (Boxes 1-15). The **GST** can also be manually configured for special +use cases, such as specific GST treatments (e.g., zero-rating for exported agricultural goods). +Once the **GST** setup for each account is complete, Odoo automatically categorizes journal items +into the appropriate boxes. This ensures the **GST** return is accurate and fully reflects the +business's financial activities. + +.. seealso:: + :doc:`Taxes documentation <../../../applications/finance/accounting/taxes>` + +.. _localizations/new_zealand/gst-closing: + +Closing the GST report +********************** + +The :ref:`tax return periodicity ` must be set up before submitting the +:ref:`tax return ` (**GST report**) to the **IRD**. + +.. seealso:: + :doc:`Year-end closing documentation + <../../../applications/finance/accounting/reporting/year_end>` + +Before closing the entry for the first time, enable the :doc:`developer mode +<../../../applications/general/developer_mode>` and go to :menuselection:`Accounting --> +Configuration --> Tax Groups` to set the default **GST payable account** and **GST receivable +account**. + +Once the **GST payable** and **GST receivable** accounts are set up, the **Tax Return** report +generates an accurate journal closing entry automatically, balancing the GST balance with the GST +clearing account. + +The balance between **GST receivable** and **payable** is set against the tax clearing account +defined on the tax group. The amount to be paid to or received from **IRD** can then be reconciled +with a bank transaction. + +.. important:: + The **GST** report is not submitted directly to the **IRD**. Instead, Odoo + automatically calculates the required values for each section, providing options to audit + and review the data for a clearer understanding of its history. Businesses can then + submit these values to the `IRD portal `_. + +.. _localizations/new_zealand/remittance-advice: + +Remittance advice +~~~~~~~~~~~~~~~~~ + +A remittance advice is a document used as proof of payment to a business. To access it, go to +:menuselection:`Accounting --> Vendors --> Payments` and select the payment(s). Then click +:icon:`fa-print` :guilabel:`Print` and select :guilabel:`Payment Receipt`. + +.. image:: new_zealand/remitance_advice_new.png + :alt: Remittance Advice. + +.. _localizations/new_zealand/accounting: + +Accounting +========== + +.. _localizations/new_zealand/e-invoicing: + +E-invoicing +----------- + +Odoo allows :ref:`electronic invoicing ` settings to be +configured per contact. + +.. image:: new_zealand/peppol_contact_new.png + :alt: Peppol Contact. + +.. important:: + Validating an invoice or credit note for a contact on the PEPPOL network will download a + compliant XML file that can be manually uploaded to the PEPPOL network. Odoo is currently in the + process of becoming an access point for the ANZ region. + +.. seealso:: + `PEPPOL requirements `_ + +.. _localizations/new_zealand/eft-batch-payments: + +EFT batch payments +------------------ + +An :abbr:`EFT (electronic funds transfer)` batch file is a digital format used to facilitate bulk +payment processing for businesses. It allows companies to consolidate multiple inbound and outbound +payments into a single electronic file. This process is commonly used by businesses handling +multiple payments at once, such as payroll or payments to multiple suppliers. + +.. _localizations/new_zealand/eft-configuration: + +Configuration +~~~~~~~~~~~~~ + +.. _localizations/new_zealand/eft-settings: + + #. :ref:`Install ` the :guilabel:`EFT Batch Payment` module (`l10n_nz_eft`). + #. Go to :menuselection:`Accounting --> Configuration --> Settings`. In the + :guilabel:`Customer Payments` section, enable :guilabel:`Batch Payments`. + +.. seealso:: + :doc:`../../../applications/finance/accounting/payments/batch` + +.. _localizations/new_zealand/eft-bank-journal: + +Bank journal +************ + +Go to :menuselection:`Accounting --> Configuration --> Journals` to configure the bank **journal**. +In the :guilabel:`Journal Entries` tab, enter the :guilabel:`Account Number` and click +:guilabel:`Create and edit...`. In the :guilabel:`Create Account Number` window, fill in the +:guilabel:`Bank` and enable :guilabel:`Send Money` to set the bank account as trusted. The +:guilabel:`Currency` field is optional. + +.. _localizations/new_zealand/eft-contacts: + +Contacts' bank accounts +*********************** + +To add banking information for a contact, navigate to +:menuselection:`Accounting --> Customers --> Customers`, +:menuselection:`Accounting --> Vendors --> Vendors`, or access the contact directly through the +**Contacts** app. Select the relevant contact, then open the :guilabel:`Accounting` tab. Under the +:guilabel:`Bank Accounts` section, click :guilabel:`Add a line` to enter the required details. + +- :guilabel:`Account Number` +- :guilabel:`Bank` +- :guilabel:`Account Holder` (it will automatically be selected for that contact) +- :guilabel:`Send Money` must be **enabled**. + +.. _localizations/new_zealand/eft-generate: + +Generate an EFT file +~~~~~~~~~~~~~~~~~~~~ + +Go to :menuselection:`Accounting --> Customers --> Invoices` +or :menuselection:`Accounting --> Vendors --> Bills`. Select the invoices/bills to be paid from the +list and click :guilabel:`Pay`. In the :guilabel:`Payment Method` field, select +:guilabel:`New Zealand EFT` and click :guilabel:`Create Payment`. + +.. note:: + The :guilabel:`Group Payment` checkbox is optional. This option appears only if there are + multiple invoices or bills from the same contact. + +In the payments window, the required EFT information for each payment, such as +:guilabel:`Particulars` and :guilabel:`Analysis Code`, can be entered as needed. + +.. note:: + The same payment information can be found under :menuselection:`Accounting --> Customers --> + Payments` or :menuselection:`Accounting --> Vendors --> Payments`. + +Then, return to the **payments** list view, select the payments needing to be batched, and click +:guilabel:`Create Batch`. + +In the **batch payment** window, fill in the following fields: + +- :guilabel:`EFT file format` +- :guilabel:`Payment Reference` +- :guilabel:`Payment Particulars` + +.. image:: new_zealand/batch_payment_view.png + :alt: Batch Payement. + +Then, click :guilabel:`Validate`. Odoo will generate the EFT file in the chatter. Click on the file +to preview or download it. + +.. important:: + Each bank has its specific format requirements for EFT batch payments. Make sure to choose the + correct EFT file format. Some banks may also require the completion of additional fields, such + as :guilabel:`Direct Debit Information` and :guilabel:`Dishonour Account`. + +.. seealso:: + :doc:`Batch paments by bank deposit documentation + <../../../applications/finance/accounting/payments/batch>` + +.. _localizations/new_zealand/XXXXXX: + +Industry-specific features +========================== + +.. _localizations/new_zealand/starshipit: + +Starshipit shipping +------------------- + +`Starshipit `_ is a shipping service operator that facilitates the +integration of Australasian shipping couriers with Odoo. + +.. seealso:: + - `Starshipit webinar recording `_ + - :doc:`Starshipit shipping <../../../applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping>` + +.. _localizations/new_zealand/buynow-paylater: + +Buy Now, Pay Later solutions +---------------------------- + +**Buy Now, Pay Later** solutions are popular payment methods for e-shops. Some of these solutions +are available via the `Stripe `_ and +`AsiaPay payment `_ providers. + +.. seealso:: + - :doc:`AsiaPay Payment Provider documentation <../../../applications/finance/payment_providers/asiapay>` + - :doc:`Stripe Payment Provider documentation <../../../applications/finance/payment_providers/stripe>` + +.. _localizations/new_zealand/pos-terminals: + +Point of Sale terminals +----------------------- + +To have a direct connection between Odoo and a PoS terminal, a :doc:`Stripe terminal +<../../../applications/sales/point_of_sale/payment_methods/terminals/stripe>` is needed. Odoo +supports the **EFTPOS** payment solution. + +.. note:: + A Stripe payment terminal is not needed to use Odoo as the main POS system. The only drawback + of not using Stripe is that cashiers must manually enter the final payment amount on the + terminal. + +.. seealso:: + - :doc:`Stripe Payment Provider documentation <../../../applications/finance/payment_providers/stripe>` + - `Stripe.com Dashboard `_ + - `Stripe.com Docs: Terminal `_ + +.. _new-zealand/payroll: + +Payroll +======= + .. _new-zealand/employment-hero: -Employment Hero payroll -======================= +Employment Hero integration +--------------------------- + +If your business is already up and running with `Employment Hero `_, +the connector can be used as an alternative payroll solution. -If your business is already up and running with :doc:`Employment Hero `, you can -use our connector as an alternative payroll solution. +The Employment Hero module automatically synchronises payslip accounting entries (e.g., expenses, +social charges, liabilities, taxes) from **Employment Hero** to Odoo. Payroll administration is +still done in **Employment Hero**; only the **journal entries** are recorded in Odoo. .. important:: To :ref:`configure the Employment Hero API ` for **New Zealand**, diff --git a/content/applications/finance/fiscal_localizations/new_zealand/GST_report.png b/content/applications/finance/fiscal_localizations/new_zealand/GST_report.png new file mode 100644 index 0000000000..1433bf4275 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/new_zealand/GST_report.png differ diff --git a/content/applications/finance/fiscal_localizations/new_zealand/batch_payment_view.png b/content/applications/finance/fiscal_localizations/new_zealand/batch_payment_view.png new file mode 100644 index 0000000000..35fdc2800e Binary files /dev/null and b/content/applications/finance/fiscal_localizations/new_zealand/batch_payment_view.png differ diff --git a/content/applications/finance/fiscal_localizations/new_zealand/peppol_contact_new.png b/content/applications/finance/fiscal_localizations/new_zealand/peppol_contact_new.png new file mode 100644 index 0000000000..ba91caed37 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/new_zealand/peppol_contact_new.png differ diff --git a/content/applications/finance/fiscal_localizations/new_zealand/remitance_advice_new.png b/content/applications/finance/fiscal_localizations/new_zealand/remitance_advice_new.png new file mode 100644 index 0000000000..a118aa7d10 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/new_zealand/remitance_advice_new.png differ diff --git a/content/applications/finance/fiscal_localizations/singapore.rst b/content/applications/finance/fiscal_localizations/singapore.rst index 16f418fb3c..a305fce4e1 100644 --- a/content/applications/finance/fiscal_localizations/singapore.rst +++ b/content/applications/finance/fiscal_localizations/singapore.rst @@ -17,9 +17,9 @@ Payments` section, activate the :guilabel:`QR Codes` feature. PayNow bank account configuration --------------------------------- -Go to :menuselection:`Contacts --> Configuration --> Bank Accounts` and select the bank account for -which you want to activate PayNow. Set the :guilabel:`Proxy Type` and fill in the :guilabel:`Proxy -Value` field depending on the type you chose. +Go to :menuselection:`Contacts --> Configuration --> Bank Accounts` and select the bank account to +activate PayNow. Set the :guilabel:`Proxy Type` and fill in the :guilabel:`Proxy Value` field +depending on the chosen type. .. important:: - The account holder's country must be set to `Singapore` on its contact form. @@ -59,10 +59,11 @@ generate the PayNow QR code. Employment Hero payroll ======================= -If your business is already up and running with :doc:`Employment Hero `, you can -use our connector as an alternative payroll solution. +If your business is already up and running with :doc:`Employment Hero +<../../hr/payroll/payroll_localizations/employment_hero>`, you can use our connector as an +alternative payroll solution. .. important:: To :ref:`configure the Employment Hero API ` for **Singapore**, - use the following value as :guilabel:`Payroll URL`: `https://apisg.yourpayroll.io/`. + use the following value as :guilabel:`Payroll URL`: `HTTPS://apisg.yourpayroll.io/`. diff --git a/content/applications/finance/fiscal_localizations/spain.rst b/content/applications/finance/fiscal_localizations/spain.rst index 54c7da56ea..0c9b799f80 100644 --- a/content/applications/finance/fiscal_localizations/spain.rst +++ b/content/applications/finance/fiscal_localizations/spain.rst @@ -98,6 +98,104 @@ If you wish to have any amount input in the :guilabel:`II` section (from boxes : Repeat this operation for all contacts related to the **agriculture** industry. + +.. _localizations/spain/veri-factu: + +Veri*Factu +========== + +.. note:: + Producers of Veri*Factu billing systems must self-certify their compliance with the regulations. + :download:`Download Odoo's "declaración responsable"` + +**Veri*Factu** is an e-Invoicing system used by the Spanish Tax Agency. It is mandatory for most +taxpayers in Spain, except for those who use the SII system or are under a regional tax regime +(i.e., TicketBai). + +Odoo allows :ref:`invoices ` and Point of Sale :ref:`orders +` to be automatically sent to the tax authorities. + +.. _localizations/spain/veri-factu-configuration: + +Configuration +------------- + +To enable **Veri\*Factu**, follow these steps: + +#. Open the Settings app to make sure your company's :guilabel:`Country` and :guilabel:`Tax ID` are + correctly set in the :ref:`Companies ` section. +#. :ref:`Install ` the :guilabel:`Spain - Veri*Factu (l10n_es_edi_verifactu)` + module. +#. Go to :menuselection:`Accounting --> Configuration --> Settings`, scroll to the + :guilabel:`Veri\*Factu` section, check the :guilabel:`Enable Veri*Factu` option, and click + :icon:`oi-arrow-right` :guilabel:`Manage certificates` to add a certificate. +#. In the :guilabel:`Certificates for Veri\*Factu` list view, click :guilabel:`New`. +#. Click :guilabel:`Upload your file`, then select a certificate file and enter the + :guilabel:`Password` needed to open the certificate (if there is one). + +.. note:: + - At least one certificate has to be uploaded. + - By default Veri*Factu is in testing mode. The data is sent to test servers + and is not considered official. When official data can be sent to the production servers, go to + the :guilabel:`Veri\*Factu` section in the :guilabel:`Settings` and disable :guilabel:`Test + Environment`. + +.. _localizations/spain/veri-factu-invoices: + +Invoices +-------- + +Once an :doc:`invoice <../../finance/accounting/customer_invoices>` is confirmed, it can be +:ref:`sent `. In the :guilabel:`Send` window, the Veri*Factu option is +available if Veri*Factu has been enabled. + +Click :guilabel:`Send` to generate a JSON file containing the invoice details. This file is stored +as a Veri*Factu document. In the :guilabel:`Veri*Factu` tab, all corresponding documents are +listed by their creation date and current status. + +.. tip:: + To download a JSON file, click on its document in the :guilabel:`Veri*Factu` tab. Then, in + the :guilabel:`Open: Veri*Factu Documents` window, click the link in the :guilabel:`JSON` field. + +.. note:: + - The document should be sent to the :abbr:`AEAT (Agencia Estatal de Administración Tributaria)` + immediately. However, it may be delayed due to mandatory waiting periods between submissions + required by the :abbr:`AEAT (Agencia Estatal de Administración Tributaria)`. In such cases, + the document is automatically sent the next time a scheduled action runs. + - A Veri\*Factu **QR code** appears on the invoice PDF. Scan this code to verify that the invoice + has been received and recognized by the :abbr:`AEAT (Agencia Estatal de Administración + Tributaria)`. + +.. _localizations/spain/veri-factu-orders: + +Point of sale orders +-------------------- + +Once an order has been :ref:`paid `, a JSON file containing the order details is +generated. This file is stored as a Veri*Factu document. + +Go to :menuselection:`Point of Sale --> Orders --> Orders`. In the :guilabel:`Orders` list view, +select the relevant order. In the :guilabel:`Veri*Factu` tab, all the corresponding documents are +listed by their creation date and current status. + +.. tip:: + To download a JSON file, click on its document in the :guilabel:`Veri*Factu` tab. Then, in + the :guilabel:`Open: Veri*Factu Documents` window, click the link in the :guilabel:`JSON` field. + +.. note:: + - The document should be sent to the :abbr:`AEAT (Agencia Estatal de Administración Tributaria)` + immediately. However, it may be delayed due to mandatory waiting periods between submissions + required by the :abbr:`AEAT (Agencia Estatal de Administración Tributaria)`. In such cases, + the document is automatically sent the next time a scheduled action runs. + +If an invoice is generated for an order during the payment process, the Veri*Factu document is +:ref:`created and sent for the invoice ` instead. + +.. note:: + A Veri\*Factu **QR code** appears on the order receipt, even if an invoice is created for the + order. Scan this code to verify that the invoice has been received and recognized by the + :abbr:`AEAT (Agencia Estatal de Administración Tributaria)` + TicketBAI ========= diff --git a/content/applications/finance/fiscal_localizations/spain/declaracion_responsable.pdf b/content/applications/finance/fiscal_localizations/spain/declaracion_responsable.pdf new file mode 100644 index 0000000000..f9a9613e6c Binary files /dev/null and b/content/applications/finance/fiscal_localizations/spain/declaracion_responsable.pdf differ diff --git a/content/applications/finance/fiscal_localizations/united_kingdom.rst b/content/applications/finance/fiscal_localizations/united_kingdom.rst index 699ad1a8fa..02e2ef1cf1 100644 --- a/content/applications/finance/fiscal_localizations/united_kingdom.rst +++ b/content/applications/finance/fiscal_localizations/united_kingdom.rst @@ -247,8 +247,9 @@ Export File` if you need a new Bacs file for that batch payment. Employment Hero payroll ======================= -If your business is already up and running with :doc:`Employment Hero `, you can -use our connector as an alternative payroll solution. +If your business is already up and running with :doc:`Employment Hero +<../../hr/payroll/payroll_localizations/employment_hero>`, you can use our connector as an +alternative payroll solution. .. important:: To :ref:`configure the Employment Hero API ` for **United diff --git a/content/applications/finance/fiscal_localizations/united_states.rst b/content/applications/finance/fiscal_localizations/united_states.rst index 85f9c683d7..170834b6f5 100644 --- a/content/applications/finance/fiscal_localizations/united_states.rst +++ b/content/applications/finance/fiscal_localizations/united_states.rst @@ -249,7 +249,8 @@ tax calculations when items are sold, purchased, and invoiced in the database. .. important:: AvaTax is available for integration with databases/companies that have locations in the United - States and Canada. Reference the :ref:`avatax/fiscal_country` documentation for more information. + States and Canada. Reference the :ref:`accounting/avatax/fiscal_country` documentation for more + information. .. seealso:: Refer to the documentation articles below to integrate and configure an AvaTax account with an diff --git a/content/applications/finance/fiscal_localizations/vietnam.rst b/content/applications/finance/fiscal_localizations/vietnam.rst index 908e67e2c0..d49a91f1fa 100644 --- a/content/applications/finance/fiscal_localizations/vietnam.rst +++ b/content/applications/finance/fiscal_localizations/vietnam.rst @@ -255,7 +255,7 @@ Enable :guilabel:`Include Reference` to include the invoice number in the QR cod .. important:: - The account holder's country must be set to `Vietnam`, and their city must be specified on the contact form. - - The :ref:`account number ` and bank must be set on the + - The :ref:`account number ` and bank must be set on the :guilabel:`Bank` journal. .. seealso:: diff --git a/content/applications/finance/payment_providers.rst b/content/applications/finance/payment_providers.rst index 4f8afd973c..9793771d99 100644 --- a/content/applications/finance/payment_providers.rst +++ b/content/applications/finance/payment_providers.rst @@ -147,12 +147,13 @@ Online payment providers - * - :doc:`Xendit ` - Odoo or the provider's website - - |V| + - |V| * - - - .. |V| replace:: ✔ +.. [*] Refer to the :doc:`Xendit documentation ` for more information. .. note:: - Each provider has its own specific configuration flow, depending on which feature is @@ -451,7 +452,7 @@ entries. We recommend you ask your accountant for advice. By default, the :guilabel:`Bank Account` defined for the :ref:`payment journal ` is used, but you can also specify an :ref:`outstanding account -` for each payment provider to separate the provider's +` for each payment provider to separate the provider's payments from other payments. .. image:: payment_providers/bank_journal.png diff --git a/content/applications/finance/payment_providers/sdd.rst b/content/applications/finance/payment_providers/sdd.rst index 61d17eab87..1faaf04af3 100644 --- a/content/applications/finance/payment_providers/sdd.rst +++ b/content/applications/finance/payment_providers/sdd.rst @@ -9,8 +9,8 @@ facilitates standardized and simplified electronic payments in euros across part SEPA Direct Debit (SDD) is a payment provider that allows future payments to be collected from customers' bank accounts based on a signed :ref:`SEPA Direct Debit mandate -`. This mandate authorizes the recipient to automatically -initiate one-time or :doc:`recurring ` payments using |sdd|. +`. This is particularly useful for recurring payments based on a +:doc:`subscription `. .. important:: To use the SEPA Direct Debit (SDD) payment provider and create :ref:`SEPA Direct Debit mandates @@ -21,7 +21,12 @@ initiate one-time or :doc:`recurring ` paymen :guilabel:`Creditor Identifier` must be defined in the :ref:`Accounting or Invoicing settings `. -To configure **SEPA Direct Debit**: +.. _sdd/configuration: + +Configuration +============= + +To configure **SEPA Direct Debit**, follow these steps: #. :ref:`Navigate to the SEPA Direct Debit payment provider `. #. In the :guilabel:`Configuration` tab, select whether the memo or :guilabel:`Communication` to be @@ -60,16 +65,19 @@ Customers selecting |sdd| as a payment method are prompted to enter their IBAN t The |sdd| mandate is then automatically created in :guilabel:`Draft` based on the provided IBAN. To validate the information, customers must confirm each new mandate with a successful bank transfer of -the expected amount **using the specified payment reference (communication)**. Once this initial -payment is received and reconciled, the mandate is automatically validated and updated to the -:guilabel:`Active` status. Once a mandate is active, it is reused for all subsequent payments made -with the |sdd| payment method. You can then collect them by :ref:`uploading them to your online -banking interface `. +the expected amount **using the specified payment reference (communication)** defined in the +:ref:`SEPA Direct Debit payment provider's form `. Once this initial payment is +received and :doc:`reconciled <../accounting/bank/reconciliation>`, the mandate is automatically +validated and updated to the :guilabel:`Active` status. Once a mandate is active, it is reused for +all subsequent payments made with the |sdd| payment method. You can then collect them by +:ref:`uploading them to your online banking interface `. .. seealso:: :doc:`../accounting/payments/batch_sdd` .. note:: - |sdd| is also available as a payment method through other providers, such as :doc:`stripe`, - :doc:`adyen`, and :doc:`buckaroo`. In these cases, |sdd| mandates are handled externally by the - payment provider. + - Mandates are automatically :ref:`closed ` 36 months + after the date of the last collection. + - |sdd| is also available as a payment method through other providers, such as + :doc:`adyen`, :doc:`buckaroo`, and :doc:`stripe`. In these cases, |sdd| mandates are handled + externally by the payment provider. diff --git a/content/applications/finance/payment_providers/worldline.rst b/content/applications/finance/payment_providers/worldline.rst index 9ab8bbb419..c0f1d75b91 100644 --- a/content/applications/finance/payment_providers/worldline.rst +++ b/content/applications/finance/payment_providers/worldline.rst @@ -19,7 +19,7 @@ not require frequent password updates like regular accounts. To create an **API user**, proceed as follows: -#. Log into your `Worldline Merchant Portal `_, +#. Log into your `Worldline Merchant Portal `_, 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: @@ -30,7 +30,10 @@ To create an **API user**, proceed as follows: #. Enable :guilabel:`Special user for API`. .. tip:: - If you have already set up a user, make sure it is activated without any error. + - If you have already set up a user, make sure it is activated without any error. + - To test the payment flow with Worldline, use their `test environment + `_ together with the :ref:`test mode + `. .. _worldline/set-up: diff --git a/content/applications/finance/payment_providers/xendit.rst b/content/applications/finance/payment_providers/xendit.rst index e0647f0a48..81179c3ed4 100644 --- a/content/applications/finance/payment_providers/xendit.rst +++ b/content/applications/finance/payment_providers/xendit.rst @@ -7,16 +7,19 @@ several Southeast Asian countries. It allows businesses to accept credit cards a local payment methods. .. note:: - Credit card payments are processed through Odoo, while all other payment methods are handled via - Xendit's website. + * Credit card payments are processed through Odoo, while all other payment methods are handled + via Xendit's website. + * Xendit supports card payment tokenization, provided the customer has requested Merchant + Initiated Transaction (MIT) from `Xendit Support `_. .. _payment_providers/xendit/configure_dashboard: Configuration on the Xendit Dashboard ===================================== -#. Create a Xendit account if necessary and log in to the `Xendit Dashboard - `_. +#. `Create a Xendit account + `_ if necessary + and log in to the `Xendit Dashboard `_. #. Check your account mode in the top left corner of the page. Use the :guilabel:`Test Mode` to try the integration without charging your customers. Switch to :guilabel:`Live Mode` once you are ready to accept payments. diff --git a/content/applications/general.rst b/content/applications/general.rst index 494420b936..c23cc7021c 100644 --- a/content/applications/general.rst +++ b/content/applications/general.rst @@ -7,7 +7,6 @@ General settings general/apps_modules general/users general/companies - general/multi_company general/iot general/email_communication general/integrations diff --git a/content/applications/general/companies.rst b/content/applications/general/companies.rst index b2cf8d7379..65b85afe88 100644 --- a/content/applications/general/companies.rst +++ b/content/applications/general/companies.rst @@ -4,252 +4,187 @@ Companies ========= -A centralized management environment allows an administrator to select multiple companies -simultaneously, and set their specific warehouses, customers, equipment, and contacts. It provides -the ability to generate reports of aggregated figures without switching interfaces, which -facilitates daily tasks, and enhances the overall management process. +In Odoo, a company is an individual business entity that operates independently, with its own legal +identity, financial records, and specific operational settings. -.. warning:: - Enabling multi-company functionality in an Odoo database on a *Standard* plan automatically - triggers an upsell to the *Custom* plan. This does not apply to databases on the *One-App Free* - plan. - - - **For yearly or multi-year contracts**: An upsell order is created with a 30-day limit. - - **For monthly contracts**: The subscription automatically switches to the *Custom* plan and - the new rate is applied when the next bill is generated. - - For more information, refer to `Odoo's pricing page `_ or - contact your account manager. - -To create a new company, navigate to :menuselection:`Settings app --> Companies section`, and click -:guilabel:`Manage Companies`. Then, click :guilabel:`New` to create a new company. - -Proceed to fill out the new company form that appears. +.. seealso:: + - :ref:`general/companies/branches` + - :doc:`Multi-company ` -.. tip:: - To archive a company, navigate to :menuselection:`Settings app --> Companies section --> Manage - Companies`. Then, tick the checkbox to the left of the company to be archived. If the - :guilabel:`Companies` page is not in list view, click the :guilabel:`≣ (four bars)` icon, located - in the top-right corner of the page. +.. _general/companies/configuration: - After selecting the appropriate company, click the :guilabel:`⚙️ Actions` icon, and select - :guilabel:`Archive` from the resulting drop-down menu. +Configuration +============= - To ensure all records related to the archived company are archived, contact Odoo's `Support Team - `_. +To set up a company, follow these steps: - Should a record not be archived, there is a risk of reactivating the archived company, and - creating the upsell again. +#. :ref:`Configure the company details `. +#. :ref:`Manage users and their access rights `. +#. :ref:`Customize the document layout `. -.. _companies/manage: +.. _general/companies/company: -Manage companies and records -============================ +Company +------- -Go to :menuselection:`Settings app --> Companies section --> Manage Companies`. Then, either click -:guilabel:`New`, and fill in the form with the company's information, or select a pre-existing -company to edit it. +To create a company, open the Settings app, navigate to the :guilabel:`Companies` section, and click +:icon:`oi-arrow-right` :guilabel:`Manage Companies`. In the :guilabel:`Companies` list view, click +:guilabel:`New` and configure the following fields: -.. image:: companies/company-info.png - :align: center - :alt: Overview of a new company's form in Odoo. +- :guilabel:`Company Name` +- :guilabel:`Address` +- :guilabel:`Tax ID`: tax identification number. +- :guilabel:`LEI`: legal entity identifier. +- :guilabel:`Company ID`: company's registry number, if different from :guilabel:`Tax ID` +- :ref:`Currency ` +- :guilabel:`Phone` and :guilabel:`Mobile` +- :guilabel:`Email` +- :guilabel:`Website` +- :guilabel:`Email Domain` +- :guilabel:`Color` -.. tip:: - Activate the :ref:`developer mode ` to set social media accounts and - company-specific email parameters. See this documentation on - :doc:`../marketing/social_marketing` and :doc:`email_communication`. +Upload the company's logo and :guilabel:`Save`. - Companies also have a :guilabel:`Parent Company` set on the company form in :ref:`developer mode - `. +.. note:: + - Alternatively, it is possible to create a company by going to :menuselection:`Settings --> + Users & Companies --> Companies`. + - The company's :guilabel:`General information` may vary based on the :doc:`fiscal localization + <../finance/fiscal_localizations>`. -Switch between companies ------------------------- +.. _general/companies/users: -Switch between (or select) multiple companies, by clicking on the company name, located in the -far-right corner of the header menu, anywhere throughout the database. Tick the checkboxes next to -the desired company name(s) to activate them. The highlighted company represents the current -environment that is in use. To switch environments, click on the desired company name. +Users +----- -.. example:: - In the example below, the user has access to eight companies, two are activated, and the - environment the database is in belongs to: *My Company (San Francisco)*. +After setting up a company, add :doc:`users ` and configure their :ref:`access +` and :doc:`access rights `. - .. image:: companies/multi-companies-menu-dashboard.png - :align: center - :alt: View of the companies menu through the main dashboard in Odoo. +.. seealso:: + :ref:`Users in multi-company environment ` -Share records -------------- +.. _general/companies/document-layout: -Data (such as, products, contacts, and equipment) can be shared, or set to be shown for a specific -company only. To do so, on their forms, choose between: +Document layout +--------------- -- *A blank field*: the record is shared within all companies. -- *Adding a company*: the record is visible to users logged in to that specific company. +Configure the :ref:`default layout ` for all company documents. -.. image:: companies/product-form-company.png - :align: center - :alt: View of a product's form emphasizing the company field in Odoo Sales. +.. _general/companies/branches: -When an environment is selected from the top menu, along with an additional company, records are -shared between the two companies. +.. _general/branches: Branches ======== -Branches are available to add to a company. Branches can be added by navigating to -:menuselection:`Settings app --> Companies section --> Manage Companies`. Then, select the desired -company from the list. From the company detail form, open the :guilabel:`Branches` tab. To add a -branch, click :guilabel:`Add a line`, and fill out the :guilabel:`Create Branches` pop-up form that -appears. - -.. image:: companies/add-branch.png - :align: center - :alt: Add a branch to a company with branches and add a line highlighted. - -.. tip:: - Activate the :ref:`developer mode ` to set social media accounts and - company-specific email system parameters. See this documentation on - :doc:`../marketing/social_marketing` and :doc:`email_communication`. - - Branches also have a :guilabel:`Parent Company` set on the branch form in :ref:`developer mode - `. Accounting and fiscal localizations for the branch are set on the - :guilabel:`Parent Company`. To do so, select the company from the *company selector* in the top - menu, and go to :menuselection:`Settings app --> Accounting --> Fiscal Localization`. - -.. danger:: - If the database is on the standard *Paid* pricing plan, adding a branch to a company triggers an - upsell. Since adding one or more branches turns the database into a multi-company setup, it - will need to switch to the *Custom* pricing plan. This does not affect databases on the *One-app - free* plan. - - For more information on pricing, see `Odoo's pricing `_ page. +Branches represent subdivisions within a company, such as regional offices or departments, that +operate under a common parent company. They support hierarchical company structures through +:ref:`configurable settings `, enabling +:ref:`comprehensive or branch-specific views ` with +flexible :ref:`access control `, :ref:`entity-specific or +shared record visibility `, and customizable +:ref:`reporting `. -.. _general/employee-access: - -Employee access -=============== - -Once companies are created, manage the employees' :doc:`Access Rights ` for -*Multi Companies*. - -To access the *Access Rights*, navigate to :menuselection:`Settings app --> Users section --> Manage -Users`. - -From the :guilabel:`Users` page, select a user from the list to modify. Then, either change the -fields for :guilabel:`Allowed Companies` or :guilabel:`Default Company`. - -Multiple companies can be set for :guilabel:`Allowed Companies`, and *only one* can be set as the -:guilabel:`Default Company`. - -.. image:: companies/access-rights-multi-companies.png - :align: center - :alt: View of an user form emphasizing the multi companies field under the access rights tabs - in Odoo. +.. note:: + Independent subsidiaries should be created as additional companies, not branches. -If an administrator has multiple companies activated on the database, and is editing a record, the -editing occurs on the record's related company. +.. seealso:: + - :doc:`Multi-company ` + - :ref:`Branch accounting ` -.. example:: - If editing a sale order issued under `JS Store US`, while working on the `JS Store Belgium` - environment, the changes are applied under `JS Store US` (the company from which the sale order - was issued). +.. _general/companies/branches/configuration: -When creating a record, the company taken into account is: +Configuration +------------- -- The current company selected in the company selector, in the upper-right hand of the screen (the - one that is highlighted/active) +Each branch is linked to its parent company but may contain different or specific information, such +as its address or logo. A branch can be a parent company of branches at a lower level to create a +multi-level architecture. -**OR** +.. important:: + - Clarify the company's structure and hierarchy before creating companies and branches in Odoo. A + company defined as a parent cannot be converted into a branch later, as doing so may result in + :doc:`access rights ` issues. + - Always create the parent company first. -- No company is set (because none is set on the product and contact forms, for example) +To create a branch, follow these steps in the Settings app: -**OR** +#. Navigate to the :guilabel:`Companies` section, click :icon:`oi-arrow-right` :guilabel:`Manage + Companies`, or go to :menuselection:`Settings --> Users & Companies --> Companies`. +#. In the :guilabel:`Companies` list view, open the desired parent company form. +#. In the :guilabel:`Branches` tab, click :guilabel:`Add a line` and fill in the :ref:`General + Information ` fields in the :guilabel:`Create Branches` window. -- The company set is the company linked to the document (the same as if a record is being edited) +To create branches from a branch and create a multi-level architecture, click :guilabel:`Add a line` +in the new branch's :guilabel:`Branches` tab. -Document format -=============== +.. tip:: + Activate the :ref:`developer mode ` to set :doc:`social media accounts + <../marketing/social_marketing>` and company-specific :doc:`email ` system + parameters. -To set document formats according to each company, *activate* and *select* the respective company, -and, under the :menuselection:`Settings app --> Companies section`, click on :guilabel:`Configure -Document Layout` and edit the information as needed. +.. warning:: + Adding a branch to a company enables :doc:`multi-company ` functions. -.. image:: companies/document-layout.png - :align: center - :alt: View of the settings page emphasizing the document layout field in Odoo. +.. _general/companies/branches/consolidated-view: -:guilabel:`Company Details` can be edited on the document layout. By default, this field is -populated from the company information listed, when navigating here: :menuselection:`Settings app ---> Companies section --> Manage Companies`, and select a company from the list. +Comprehensive or branch-specific view +------------------------------------- -.. _general/inter-company: +.. note:: + Selecting the parent company automatically links all its branches, while selecting a branch + connects to that branch only. To switch between them, use the :ref:`company selector + `. -Inter-company transactions -========================== +All configurations, except for :ref:`accounting ` settings inherited from the +parent company, must be set individually per branch. This allows for branch-specific setups such as +:doc:`loyalty programs <../sales/point_of_sale/pricing/loyalty>`, :doc:`price lists +<../sales/point_of_sale/pricing/pricelists>`, or :doc:`inventory locations +<../inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations>`. -First, activate the :ref:`developer mode `. Then, make sure each one of the -companies is properly set in relation to: +.. _general/companies/branches/user-access: -- :doc:`Chart of Accounts <../finance/accounting/get_started/chart_of_accounts>` -- :doc:`Taxes <../finance/accounting/taxes>` -- :doc:`Fiscal Positions <../finance/accounting/taxes/fiscal_positions>` -- :doc:`Journals <../finance/accounting/bank>` -- :doc:`Fiscal Localizations <../finance/fiscal_localizations>` -- :doc:`Pricelists <../sales/sales/products_prices/prices/pricing>` +User access +~~~~~~~~~~~ -Next, navigate to :menuselection:`Settings app --> Companies section --> Manage Companies`. Then, -select the desired company from the list. On the company form, select the :guilabel:`Inter-Company -Transactions` tab, on the individual company's detail form. +Like in a multi-company environment, parent companies and branches support flexible :ref:`user +access ` control and :doc:`access rights `. User access +can be granted or restricted at the parent company level, the branch level, or both. For example, a +user can be limited to a specific branch, while an administrator with access to the parent company +can manage all associated branches. -With the respective company activated and selected, choose one of the following :guilabel:`Rule` -options: +.. _general/companies/branches/shared-records: -- :guilabel:`Do not synchronize`: do not synchronize any inter-company transactions. -- :guilabel:`Synchronized invoice/bills`: generates a bill/invoice when a company confirms a - bill/invoice for the selected company. -- :guilabel:`Synchronize Sales Order`: generates a drafted sales order using the selected company - warehouse, when a sales order is confirmed for the selected company. If, instead of a drafted - sales order, it should be validated, enable :guilabel:`Automatic Validation`.\* -- :guilabel:`Synchronize Purchase Order`: generates a drafted purchase order using the selected - company warehouse, when a purchase order is confirmed for the selected company. If, instead of a - drafted purchase order, it should be validated, enable :guilabel:`Automatic Validation`.\* -- :guilabel:`Synchronize Sales and Purchase Order`: generates a drafted purchase/sales order using - the selected company warehouse, when a sales/purchase order is confirmed for the selected company. - If, instead of a drafted purchase/sales order, it should be validated, enable :guilabel:`Automatic - Validation`.\* +Shared records +~~~~~~~~~~~~~~ - \* The given option needs to be selected, so :guilabel:`Automatic Validation` appears in the - configuration. +In Odoo, some records are, by default, either specific to a single entity or shared across the +parent company and all its branches. -.. image:: companies/inter-company-transactions.png - :align: center - :alt: View of the settings page emphasizing the inter company transaction field in Odoo. +When creating a quotation, invoice, or vendor bill, the active company or branch is automatically +selected and displayed in the :guilabel:`Company` field. If the active company is the parent company +or one of its branches, then records specifically linked to that entity are accessible only within +that entity and will only be visible when the company or branch is selected using the :ref:`company +selector `. -.. note:: - Products **must** be configured as :guilabel:`Can be sold` and shared between the companies. See - :doc:`../inventory_and_mrp/inventory/product_management/configure/type`. +In contrast, some records, such as :ref:`products or contacts +`, are not tied to any particular entity and are +shared by default across the parent company and all its branches. However, they can be restricted to +a single entity by setting the appropriate value in the :guilabel:`Company` field, if needed. -.. example:: - :guilabel:`Synchronize invoice/bills`: an invoice posted on `JS Store Belgium`, for `JS Store - US`, automatically creates a vendor bill, and generates a drafted purchase/sales order using the - selected company warehouse, when a sales/purchase order is confirmed for the selected company. - If, instead of a drafted purchase/sales order, it should be validated, enable - :guilabel:`Automatic Validation`. +.. seealso:: + :ref:`Branches accounting ` - :guilabel:`Synchronize sales/purchase order`: when a sale order for `JS Store US` is confirmed on - `JS Store Belgium`, a purchase order on `JS Store Belgium` is automatically created (and - confirmed, if the :guilabel:`Automatic Validation` feature was enabled). +.. _general/companies/branches/reporting: -.. tip:: - Remember to test all workflows as a user *other* than the administrator. +Reporting +~~~~~~~~~ -.. seealso:: - - :doc:`Multi-company Guidelines <../../developer/howtos/company>` - - :doc:`../finance/accounting/get_started/multi_currency` +All :doc:`reports <../finance/accounting/reporting>` can be generated for the parent company alone +or with its branches, based on :ref:`user access `. .. toctree:: :titlesonly: + companies/multi_company companies/digest_emails companies/email_template diff --git a/content/applications/general/companies/access-rights-multi-companies.png b/content/applications/general/companies/access-rights-multi-companies.png deleted file mode 100644 index b42d9062c1..0000000000 Binary files a/content/applications/general/companies/access-rights-multi-companies.png and /dev/null differ diff --git a/content/applications/general/companies/add-branch.png b/content/applications/general/companies/add-branch.png deleted file mode 100644 index 550df91efb..0000000000 Binary files a/content/applications/general/companies/add-branch.png and /dev/null differ diff --git a/content/applications/general/companies/company-info.png b/content/applications/general/companies/company-info.png deleted file mode 100644 index c6e43bf708..0000000000 Binary files a/content/applications/general/companies/company-info.png and /dev/null differ diff --git a/content/applications/general/companies/document-layout.png b/content/applications/general/companies/document-layout.png deleted file mode 100644 index 61a5bd2161..0000000000 Binary files a/content/applications/general/companies/document-layout.png and /dev/null differ diff --git a/content/applications/general/companies/multi-companies-menu-dashboard.png b/content/applications/general/companies/multi-companies-menu-dashboard.png deleted file mode 100644 index 40c663812b..0000000000 Binary files a/content/applications/general/companies/multi-companies-menu-dashboard.png and /dev/null differ diff --git a/content/applications/general/companies/multi_company.rst b/content/applications/general/companies/multi_company.rst new file mode 100644 index 0000000000..d9279c08f9 --- /dev/null +++ b/content/applications/general/companies/multi_company.rst @@ -0,0 +1,190 @@ +============= +Multi-company +============= + +.. seealso:: + :ref:`Branches ` + +.. |mcd| replace:: multi-company database + +In Odoo, multiple companies can be configured under one database. This allows some data to be shared +among companies while maintaining some separation between entities. + +A centralized management environment allows authorized users to select multiple companies +simultaneously and set their specific warehouses, customers, equipment, and contacts. It also +generates reports of aggregated figures without switching interfaces, facilitating daily tasks and +enhancing the overall management process. + +.. warning:: + Enabling multi-company functionality in an Odoo database on a *Standard* plan automatically + triggers an upsell to the *Custom* plan. This does not apply to databases on the *One-App Free* + plan. + + - **For yearly or multi-year contracts**: An upsell order is created with a 30-day limit. + - **For monthly contracts**: The subscription automatically switches to the *Custom* plan and + the new rate is applied when the next bill is generated. + + For more information, refer to `Odoo's pricing page `_ or + contact your account manager. + +.. _general/multi-company/configuration: + +Configuration +============= + +Open the Settings app, navigate to the :guilabel:`Companies` section, and click +:icon:`oi-arrow-right` :guilabel:`Manage Companies`. Then, click :guilabel:`New` and :ref:`fill in +the form with the company's information ` or select an existing company +to edit it. + +.. note:: + Alternatively, it is possible to create a company by going to :menuselection:`Settings --> Users + & Companies --> Companies`. + +.. tip:: + To archive a company, follow these steps: + + #. In the Settings app, navigate to the :guilabel:`Companies` section and click + :icon:`oi-arrow-right` :guilabel:`Manage Companies`. + #. In the :guilabel:`Companies` list view, select the company to be archived. + #. Click the :icon:`fa-cog` :guilabel:`Actions` menu and select :guilabel:`Archive`. + #. Click :guilabel:`Archive` to confirm. + +.. _general/multi-company/multi-company-environment: + +Multi-company environment +========================= + +In a multi-company environment, users are granted :ref:`access to one or more companies +`, and :ref:`data +` is created or modified based on its intended +use within that structure. + +.. _general/multi-company/user-access: + +User access +----------- + +A multi-company environment allows flexible control over :ref:`user access ` +and :doc:`access rights <../users/access_rights>` that can be granted or restricted as needed. + +.. _general/multi-company/company-selector: + +Company selector +---------------- + +To switch between (or select) multiple companies, follow these steps: + +#. Click the company selector in the top-right corner of the header menu. +#. In the drop-down list, select the checkboxes next to the desired companies. +#. The highlighted company indicates the current active environment. +#. To switch to another company, click its name in the list of selected companies. + +.. example:: + In the example below, the user can access six companies, two of which are selected. The current + active company is *My Company (San Francisco)*. + + .. image:: multi_company/multi-companies-menu-dashboard.png + :alt: View of the companies menu through the main dashboard in Odoo. + +.. _general/multi-company/shared-and-unshared-records: + +Shared and company-specific records +----------------------------------- + +Data, such as products, contacts, and equipment can either be shared across companies or restricted +to a specific company by setting the :guilabel:`Company` field on the relevant records: + +- either leave the field blank to make it accessible to all companies; +- or select the company to make it visible to users logged in to that specific company. + +Records specifically linked to a particular company are accessible only within that entity. For +instance, quotations, invoices, and vendor bills associated with a company are visible only when +logged into that company, and the corresponding company is automatically selected by default and +displayed in the :guilabel:`Company` field. + +In a |mcd|, new products and contacts are shared across companies by default. To restrict them to a +specific company, set the :guilabel:`Company` field on the record's form. + +.. _general/multi-company/inter-company-transactions: + +Inter-company transactions +========================== + +The :guilabel:`Inter-Company Transactions` feature allows one company in the database to sell or +purchase goods and services from another company within the same database. Depending on the +configuration settings, counterpart documents for orders and invoices can be automatically generated +and synchronized. + +.. warning:: + To handle inter-company transactions correctly, :doc:`general + <../../finance/accounting/get_started>` and specific configurations must be set properly, + including :doc:`fiscal positions <../../finance/accounting/taxes/fiscal_positions>` and + :doc:`localizations <../../finance/fiscal_localizations>`. + +To activate inter-company transactions, select the relevant company in the :ref:`company selector +`, open the Settings app, navigate to the +:guilabel:`Companies` section, enable :guilabel:`Inter-Company Transactions`, and :guilabel:`Save`. +Then, select the option(s) to create a counterpart for the selected company: + +- :guilabel:`Generate Bills and Refunds`: Generate a bill/refund when a company confirms an + invoice/credit note for the selected company. To generate a validated bill/refund, select + :guilabel:`Create and validate`. +- :guilabel:`Generate Sales Orders`: Generate a quotation (drafted sales order) when a sales order + is confirmed for the selected company. To generate a validated sales order instead of a quotation, + select :guilabel:`Create and validate`. +- :guilabel:`Generate Purchase Orders`: Generate a request for quotation (drafted purchase order) + using the selected company warehouse in the :guilabel:`Use Warehouse` field when a purchase order + is confirmed for the selected company. To generate a validated purchase order instead of a request + for quotation, select :guilabel:`Create and validate`. + +.. note:: + For inter-company transactions, the :ref:`products must be shared + ` among the involved companies. + +.. example:: + :guilabel:`Generate Bills and Refunds`: when an invoice for :guilabel:`Customer` `JS Store US` is + posted on `JS Store Belgium`, a vendor bill is automatically created in `JS Store US`. + + :guilabel:`Generate Sales Orders`: when a sales order for :guilabel:`Customer` `JS + Store US` is confirmed on `JS Store Belgium`, a purchase order on `JS Store US` is automatically + created (and confirmed if the :guilabel:`Create and validate` option is selected). + +.. seealso:: + - :doc:`Multi-company Guidelines <../../../developer/howtos/company>` + - :doc:`../../finance/accounting/get_started/multi_currency` + +.. _general/multi-company/use-cases: + +Use cases +========= + +.. _general/multi-company/use-cases-multinational-companies: + +Multinational companies +----------------------- + +A multinational retail chain operating in the United States and Canada must manage transactions in +USD and CAD. + +Since each country has its own tax laws and regulations, using Odoo’s multi-company feature is +highly beneficial. + +This setup allows for inter-company transactions, which is essential for managing cross-border +inventory transfers. It also simplifies the sales process by enabling customers transactions in +their local currency. + +.. _general/multi-company/use-cases-seperate-processes: + +Separate processes +------------------ + +A small furniture company is launching a new product line that requires separate procurement, +inventory, and manufacturing workflows. These new products differ significantly from the existing +catalog. To manage this efficiently, the company is considering using the multi-company feature to +manage the new line as a separate business entity. + +However, creating a completely new company might add unnecessary complexity to the database. +Instead, the company can leverage existing features such as :doc:`analytic accounting +<../../finance/accounting/reporting/analytic_accounting>` and multiple warehouses to manage the new +product line without complicating overall operations. diff --git a/content/applications/general/companies/multi_company/multi-companies-menu-dashboard.png b/content/applications/general/companies/multi_company/multi-companies-menu-dashboard.png new file mode 100644 index 0000000000..540e11e243 Binary files /dev/null and b/content/applications/general/companies/multi_company/multi-companies-menu-dashboard.png differ diff --git a/content/applications/general/companies/product-form-company.png b/content/applications/general/companies/product-form-company.png deleted file mode 100644 index 675cb49158..0000000000 Binary files a/content/applications/general/companies/product-form-company.png and /dev/null differ diff --git a/content/applications/general/email_communication/email_domain.rst b/content/applications/general/email_communication/email_domain.rst index 96d4c04c5f..e2e37311f9 100644 --- a/content/applications/general/email_communication/email_domain.rst +++ b/content/applications/general/email_communication/email_domain.rst @@ -149,4 +149,7 @@ gives a full overview of the content and configuration in one sent email. Mail-T used to configure records for other, lesser-known providers. .. seealso:: - `Using Mail-Tester to set SPF Records for specific carriers `_ + - `Using Mail-Tester to set SPF Records for specific carriers + `_ + - `Magic Sheet - SPF, DKIM and DMARC configuration [PDF] + `_ diff --git a/content/applications/general/email_communication/email_servers_inbound.rst b/content/applications/general/email_communication/email_servers_inbound.rst index ce786b0eec..32cceca3a1 100644 --- a/content/applications/general/email_communication/email_servers_inbound.rst +++ b/content/applications/general/email_communication/email_servers_inbound.rst @@ -238,8 +238,19 @@ Incoming mail servers As mentioned earlier, using redirections is the recommended method to receive emails in Odoo. However, it is also possible to set up incoming mail servers. Using this method means creating an incoming email server for each mailbox on your server, catchall, bounce, and every alias of the -database, in order to fetch all incoming emails. Incoming mail servers are created by going to -:menuselection:`Settings --> Technical --> Emails: Incoming Mail Servers`. +database, in order to fetch all incoming emails. + +.. warning:: + Odoo's *Incoming Mail Servers* feature is designed for shared inboxes (e.g., + `sales@yourcompany.com` or `support@yourcompany.com`) to route messages to team pipelines, + tickets, or documents. + + Using personal email addresses (e.g., `mitchell.admin@yourcompany.com`) as incoming mail servers + is **not** recommended. Doing so can lead to increased security risks, unintended message + routing, privacy issues, and difficulties syncing replies correctly. + +Incoming mail servers are created by going to :menuselection:`Settings --> Technical --> Emails: +Incoming Mail Servers`. .. important:: We recommend using the IMAP protocol over the POP protocol, as IMAP fetches all unread emails, @@ -297,8 +308,8 @@ Infinite email loops ==================== In some cases, infinite mailing loops can be created. Odoo provides some protection against such -loops, ensuring the same sender cannot send too many emails **that would create records** to an alias in -a specific time span. +loops, ensuring the same sender cannot send too many emails **that would create records** to an +alias in a specific time span. By default, an email address can send up to 20 emails in 120 minutes. If more emails are sent, they are blocked and the sender receives the following message: @@ -314,10 +325,6 @@ To change the default behavior, enable :ref:`developer-mode`, then go to :menuse - For the second parameter, enter `mail.gateway.loop.threshold` as the :guilabel:`Key` and choose a number of emails as the :guilabel:`Value` (`20` is the default behavior). -.. important:: - These parameters are only used to prevent the creation of new records. They **do not prevent - replies** from being added to the chatter. - Allow alias domain system parameter =================================== diff --git a/content/applications/general/email_communication/email_servers_outbound.rst b/content/applications/general/email_communication/email_servers_outbound.rst index c7dbfd0409..f8dc847afb 100644 --- a/content/applications/general/email_communication/email_servers_outbound.rst +++ b/content/applications/general/email_communication/email_servers_outbound.rst @@ -17,9 +17,15 @@ emails. The deliverability is optimized for this subdomain as it uses Odoo’s D If the database subdomain is `company-name.odoo.com` and all mailing configurations are the default ones, all emails will be sent from `notifications@company-name.odoo.com`. -.. important:: - Only **one** subdomain can be used as a mailing server in Odoo. Subdomains for additional - companies require an external email server with a custom domain. +.. _email-outbound-default-from-filtering: + +This configuration is handled by the system parameter `mail.default.from_filter`. +In case where the sender's domain do not match the value of this parameter, the notification address +is used instead. Multiple values can be defined in this system parameter: comma-separated, domains +or full email addresses are all allowed. Once an :ref:`outgoing mail server is configured +`, the system parameter is no longer considered +and the value used is the :ref:`FROM filtering +` of the mail server. .. image:: email_servers_outbound/diagram-inbound-mailing-method.png :alt: Odoo’s default outbound messages configuration. @@ -47,8 +53,8 @@ This section assumes ownership of a custom domain. If not, a custom domain must domain registrar such as GoDaddy, Namecheap, or any alternative provider. .. seealso:: - :download:`Magic Sheet - Email domain configuration PDF - ` + `Magic Sheet - Email domain name configuration [PDF] + `_ .. _email-outbound-custom-domain-odoo-server: @@ -213,6 +219,9 @@ When an email is sent from Odoo, the following sequence is used to choose the ou higher the priority is). Failing to do so, the first server is determined by the servers' names, using alphabetical order. +- If there is no mail server, Odoo relies on the :ref:`system parameter + ` value. + It is also possible to use Odoo's mail server for transactional emails in addition to mass mailings. .. _email-outbound-different-servers-external-odoo: @@ -333,7 +342,7 @@ Using a unique email address for all outgoing emails To force the email address from which emails are sent, activate the :ref:`developer-mode`, and go to :menuselection:`Settings --> Technical --> Email: Alias Domains`. On the :guilabel:`Default From -Alias`, use the the local-part or a complete email address as the value. +Alias`, use the local-part or a complete email address as the value. .. warning:: If a **complete address** is used as the :guilabel:`Default From Alias` value, **all** outgoing diff --git a/content/applications/general/email_communication/email_servers_outbound/magic-sheet-email-domain.pdf b/content/applications/general/email_communication/email_servers_outbound/magic-sheet-email-domain.pdf deleted file mode 100644 index 2abcc14864..0000000000 Binary files a/content/applications/general/email_communication/email_servers_outbound/magic-sheet-email-domain.pdf and /dev/null differ diff --git a/content/applications/general/email_communication/mailjet_api.rst b/content/applications/general/email_communication/mailjet_api.rst index 0afec9da5a..a8be5af8cd 100644 --- a/content/applications/general/email_communication/mailjet_api.rst +++ b/content/applications/general/email_communication/mailjet_api.rst @@ -89,8 +89,10 @@ Identified Mail)`/:abbr:`DMARC (Domain-based Message Authentication, Reporting, Conformance)` settings on the domain of the sender. .. seealso:: - `Mailjet's SPF/DKIM/DMARC documentation `_ + - `Mailjet's SPF/DKIM documentation + `_ + - `Mailjet's DMARC documentation + `_ .. important:: If the database is not using a custom domain, then in order to verify the sender's address, a diff --git a/content/applications/general/integrations/cloud_storage.rst b/content/applications/general/integrations/cloud_storage.rst index a17902ae4f..1f36f57595 100644 --- a/content/applications/general/integrations/cloud_storage.rst +++ b/content/applications/general/integrations/cloud_storage.rst @@ -124,10 +124,11 @@ App registration #. Click :guilabel:`Add a certificate or secret` next to :guilabel:`Client credentials`, click :guilabel:`New client secret`, then :guilabel:`Add`. -.. important:: - For security reasons, leave the :guilabel:`Expires` field on `180 days (6 months)` or choose a - shorter expiration interval. Before the secret expires, adding a new client secret and updating - :ref:`Odoo’s configuration ` with the new value is necessary. + .. important:: + For security reasons, leave the :guilabel:`Expires` field on `180 days (6 months)` or choose a + shorter expiration interval. Before the secret expires, adding a new client secret and + updating :ref:`Odoo’s configuration ` with the new value is + necessary. #. Copy the client secret's :guilabel:`Value` and store it securely. It will be used when :ref:`configuring Odoo `. diff --git a/content/applications/general/iot.rst b/content/applications/general/iot.rst index c9e3b85b4c..0380e81427 100644 --- a/content/applications/general/iot.rst +++ b/content/applications/general/iot.rst @@ -40,6 +40,8 @@ to your subscription, contact the database's account manager or Odoo partner for - `Odoo Tutorials: Internet of Things (IoT) Tutorials `_ - `IoT system FAQ `_ + - `Magic Sheet - Odoo Internet of Things [PDF] + `_ .. cards:: diff --git a/content/applications/general/iot/devices/printer.rst b/content/applications/general/iot/devices/printer.rst index 401729c8c0..7e955b9240 100644 --- a/content/applications/general/iot/devices/printer.rst +++ b/content/applications/general/iot/devices/printer.rst @@ -110,7 +110,7 @@ device. Click the :guilabel:`Unlink` button next to each report to remove the li :alt: A list of reports currently linked to a printer in the IoT app. .. seealso:: - :doc:`POS Order Printing <../../../sales/point_of_sale/restaurant/kitchen_printing>` + :ref:`POS Order Printing ` Potential issues ================ @@ -450,6 +450,20 @@ corresponding template. `Zebra's instructions on printing ZPL files `_ +The printer appears multiple times +---------------------------------- + +If the printer appears multiple times on the :ref:`IoT box's ` or +:ref:`Windows virtual IoT's ` homepage and/or in the list of +:guilabel:`Devices` on the :ref:`IoT system's form `, the cause is usually the +CUPS auto-discovery feature. This feature allows to list all detected printers together with all +available drivers, creating one entry for each printer–driver pair. + +Simply select the entry that works best and ignore the others. + +.. note:: + Workarounds exist to disable the CUPS auto-discovery feature. + Barcode scanner issues ====================== diff --git a/content/applications/general/iot/devices/scale.rst b/content/applications/general/iot/devices/scale.rst index 371dfbb033..e26bc1347b 100644 --- a/content/applications/general/iot/devices/scale.rst +++ b/content/applications/general/iot/devices/scale.rst @@ -3,13 +3,9 @@ Connect a scale =============== .. important:: - - In EU member states, `certification is legally required - `_ - to use a scale as an integrated device. - - Odoo is not certified in several countries, including France, Germany, and Switzerland. If you - reside in one of these countries, you can still use a scale but without integration into your - Odoo database. Alternatively, you can acquire a *non-integrated* certified scale that prints - certified labels, which can then be scanned into your Odoo database. + In EU member states, `certification is legally required + `_ + to use a scale as an integrated device. To connect a scale to the IoT system, use a USB cable. In some cases, you may need a serial-to-US adapter to complete the connection. If the scale is `compatible with an IoT system @@ -23,27 +19,11 @@ scale's drivers `. the Odoo IoT system `_. In such cases, a different scale must be used. -Once the scale is connected to the IoT system, follow these steps to configure it in the POS -settings: - -#. :ref:`Access the POS settings ` and select your POS, or click the - vertical ellipsis button (:guilabel:`⋮`) on a POS card and click :guilabel:`Edit`. -#. Scroll down to the :guilabel:`Connected Devices` section and enable :guilabel:`IoT Box`. -#. Select the scale in the :guilabel:`Electronic Scale` field. -#. Click :guilabel:`Save`. +Once the scale is connected to the IoT system, :ref:`configure it in the POS settings `. .. seealso:: :doc:`Connect an IoT system to a POS ` -The scale is then available in all the :doc:`POS's sessions `. -If a product is configured with a price per weight, selecting it on the :guilabel:`PoS screen` opens -the scale popup. The cashier can then weigh the product to automatically add the correct price to -the cart. - -.. image:: scale/scale-view.png - :scale: 80% - :alt: Electronic Scale dashboard view when no items are being weighed. - Ariva S scales ============== diff --git a/content/applications/general/iot/devices/scale/scale-view.png b/content/applications/general/iot/devices/scale/scale-view.png deleted file mode 100644 index 49437b31a4..0000000000 Binary files a/content/applications/general/iot/devices/scale/scale-view.png and /dev/null differ diff --git a/content/applications/general/iot/iot_box.rst b/content/applications/general/iot/iot_box.rst index 94aafe1da9..a61615a816 100644 --- a/content/applications/general/iot/iot_box.rst +++ b/content/applications/general/iot/iot_box.rst @@ -85,7 +85,7 @@ The IoT box's IP address can be retrieved by: :scale: 75% :alt: POS display with IoT box's IP address -- connecting the IoT box to a `supported receipt or label printer `_ +- connecting the IoT box to a `supported receipt or label printer `_ with a USB cable: the IP address is automatically printed. - accessing the administrator interface of the router to which the IoT box is connected or using third-party software to scan the network. diff --git a/content/applications/general/multi_company.rst b/content/applications/general/multi_company.rst deleted file mode 100644 index 4c61dc0cb4..0000000000 --- a/content/applications/general/multi_company.rst +++ /dev/null @@ -1,140 +0,0 @@ -============= -Multi-company -============= - -.. |mcd| replace:: multi-company database - -In Odoo, multiple companies can exist within a single database. This allows for some data to be -shared among companies, while still maintaining some level of separation between entities. - -Before deciding to use the multi-company feature, there are several factors to consider. - -.. important:: - Multi-company is **only** available in *One App Free* databases, or with `Custom - `_ plans. - -Accessing multiple companies -============================ - -The list of :ref:`companies an employee has access to ` in a |mcd| can be -found at the top-right of the main Odoo menu bar, where the active company is listed. Click on the -company name to reveal a list of all allowed companies. To switch to a different company, click on -the company name in the drop-down menu. To enable multiple companies at once, tick the checkbox next -to each desired company name. - -.. figure:: multi_company/company-access.png - :align: center - :alt: An example of the list of companies a user has access to when logged into a database. - - An example of a user with access to multiple companies. The current company is My Company (San - Francisco), while My Company (Chicago) is also active. - -.. note:: - The database may refresh after each checkbox is ticked. - -.. _general/active-companies: - -Multiple active companies -------------------------- - -If more than one company is active at a time, one company is highlighted in purple, and is listed on -the menu bar. This is the considered the *current* company. - -When creating a new record, the current company is added to the record in the *Company* field, -except under the following circumstances: - -- The *Company* field for a new product, or a new contact, is left blank. -- If there is a related document already in the system, the *Company* field on the new record - defaults to the same company. - -.. example:: - Mitchell Admin has multiple companies enabled, but the current company is `My Company (Chicago)`. - When he creates a new product record, the :guilabel:`Company` field is left blank by default. - - When a new sales team is created, the :guilabel:`Company` field automatically defaults to `My - Company (Chicago)`. - -.. _general/sharing-data: - -Share data -========== - -In a |mcd|, certain records are able to be utilized by all of the companies (or several, based on -permissions). - -Products --------- - -In an |mcd|, new products are created with the :ref:`Company field ` -blank, by default. If the *Company* field remains blank, the product is shared across all companies. - -Contacts --------- - -Similar to products, contact records are shared across companies, by default. To limit access to a -single company, click the :ref:`Company field ` on a contact form, and -select a company to assign the contact to. - -Inter-company transactions -========================== - -The :ref:`Inter-Company Transactions ` feature allows for one company in the -database to sell or purchase goods and services from another company within the same database. -Counterpart documents for orders and invoices can be automatically generated and synchronized, -depending on the configuration settings. - -.. warning:: - To ensure inter-company transactions are handled appropriately, certain configurations, such as - fiscal positions and localizations, need to be accurately assigned. See :ref:`Inter-Company - Transactions ` for additional information. - -Use cases -========= - -Multinational companies ------------------------ - -A multinational retail chain, which operates in the United States and Canada, needs to manage -transactions in both USD and CAD currencies. - -Additionally, because both countries have different tax laws and regulations, it is in the best -interest of the customer to utilize the multi-company feature. - -This allows for inter-company transactions they need to manage inventory moves across international -borders, while making it simple to sell to customers in both countries in their own currency. - -Separate processes ------------------- - -A small furniture company is developing a new line of products that require a separate procurement, -inventory, and manufacturing process. The new products are drastically different from the existing -catalog. The company is considering utilizing the multi-company feature to treat this new line as a -different entity. - -To keep their database from becoming overly complex, the furniture company does not need to add an -entirely new company. Instead, they can take advantage of existing features, such as :doc:`analytic -accounting <../finance/accounting/reporting/analytic_accounting>`, and multiple warehouses, to -manage the new product line, without having to overly complicate transactions. - -Limitations -=========== - -In some instances, a |mcd| may *not* be the best option, due to potential limitations. - -Access rights -------------- - -A user's access rights are configured on a database level. If a user has access to more than one -company in a |mcd|, their access rights are the same across every company. - -Shared records --------------- - -Individual records are either :ref:`shared ` between all companies, or belong -to a single company. - -PDF Reports ------------ - -Some customizations, specifically for PDF reports, apply to all companies. It is not always possible -to separate reports for individual companies. diff --git a/content/applications/general/multi_company/company-access.png b/content/applications/general/multi_company/company-access.png deleted file mode 100644 index c7dc98361f..0000000000 Binary files a/content/applications/general/multi_company/company-access.png and /dev/null differ diff --git a/content/applications/general/users.rst b/content/applications/general/users.rst index 786672cd81..509767dd99 100644 --- a/content/applications/general/users.rst +++ b/content/applications/general/users.rst @@ -36,9 +36,7 @@ The list of applications shown is based on the applications installed on the dat After filling out all the necessary fields on the page, :icon:`fa-cloud-upload` :guilabel:`(Save manually)`. An invitation email is automatically sent to the user, using the email in the :guilabel:`Email Address` field. The user must click on the link included in the email to accept the -invitation, and to create a database login. email is automatically sent to the user, using the email -in the :guilabel:`Email Address` field. The user must click on the link included in the email to -accept the invitation, and to create a database login. +invitation, and to create a database login. .. image:: users/invitation-email.png :alt: View of a user's form with a notification that the invitation email has been sent in Odoo. diff --git a/content/applications/general/users/access_rights.rst b/content/applications/general/users/access_rights.rst index 6d587d97b0..fdc965c199 100644 --- a/content/applications/general/users/access_rights.rst +++ b/content/applications/general/users/access_rights.rst @@ -28,6 +28,8 @@ should not have access to. Once complete, click :guilabel:`Save` to save the changes, and implement the user as an administrator. +.. _access-rights/user-permissions: + Manage user permissions ======================= diff --git a/content/applications/hr/appraisals.rst b/content/applications/hr/appraisals.rst index 160efd4852..070d158c7d 100644 --- a/content/applications/hr/appraisals.rst +++ b/content/applications/hr/appraisals.rst @@ -1,185 +1,15 @@ -:show-content: +:nosearch: ========== Appraisals ========== -In Odoo, the *Appraisals* application can be used to evaluate employee performance on a recurring -basis. Managers can evaluate the performance of their employees, and also allow employees to do a -self-assessment of their own. Appraisals are customizable, and can be set for any kind of schedule -desired. - -Appraisals give employees valuable feedback, including actionable goals to work toward, and -measurable skills to improve upon. Additionally, appraisals may form the basis for raises, -promotions, and other benefits. - -Regular appraisals are good for both the employees and the company, since they can accurately -measure performance based on company goals, and show employees where they need to improve. - -Configuration -============= - -The :guilabel:`Configuration` menu in the *Appraisals* application is where the settings can be -configured, feedback templates can be edited, frequencies can be set, evaluation scales can be -managed, data for 360 feedback can be stored, and goal tags can be viewed/created. - -Settings --------- - -To access the *Settings* menu, navigate to :menuselection:`Appraisals application --> Configuration ---> Settings`. - -Feedback templates -~~~~~~~~~~~~~~~~~~ - -Feedback templates are form outlines used during an employee appraisal. Any edits made to a template -are, ultimately, reflected in the appraisals sent to employees. - -There are two default templates pre-configured in Odoo *Appraisals*: one for employee feedback, and -one for manager feedback. Each contains several sections, along with questions, and brief -explanations for how to respond to the questions. - -The :guilabel:`Employee Feedback Template` has the following sections: :guilabel:`My work`, -:guilabel:`My future`, and :guilabel:`My feelings`. - -The :guilabel:`Manager Feedback Template` has the following sections: :guilabel:`Feedback`, -:guilabel:`Evaluation`, and :guilabel:`Improvements`. - -Any desired changes to the default feedback templates can be made by making changes directly in each -template. - -Appraisals -~~~~~~~~~~ - -The :guilabel:`Appraisals` section of the settings menu determines the frequency that appraisals are -performed, and if it is possible to request additional feedback. - -.. image:: appraisals/appraisals-setting.png - :align: center - :alt: The appraisals sections with the timeline filled in and 360 feedback enabled. - -.. _appraisals/appraisal-plan: - -Appraisals plans -**************** - -By default, appraisals are pre-configured to be automatically created six months after an employee -is hired, with a second appraisal exactly six months after that. - -Once those two initial appraisals have been completed in the employee's first year, following -appraisals are only created once a year (every twelve months). - -To modify this schedule, change the number of months in the blank fields under the -:guilabel:`Appraisals Plans` section. - -.. important:: - If the :guilabel:`Appraisals Plans` section is modified, **all** empty :guilabel:`Next Appraisal - Dates` are modified for **all** employees. - -360 feedback -************ - -The :guilabel:`360 Feedback` option can be enabled to allow managers to request feedback from other -employees using a different survey form, at any time, independent of the appraisal schedule. - -Typically, managers ask for feedback from other people who work with an employee they manage. This -includes the employee's various managers, peers, and direct reports. - -To view the :guilabel:`360 Feedback` survey, click the :guilabel:`→ Internal link` icon at the end -of the :guilabel:`Default Template` field. The :guilabel:`360 Feedback` survey loads, and any -desired changes to the survey can be made. - -For more information on how to edit a survey, refer to the :doc:`../marketing/surveys/create` -document. - -.. important:: - The :guilabel:`360 Feedback` form is a pre-configured survey within the *Surveys* application. In - order to use the :guilabel:`360 Feedback` option, including the ability to edit the survey, the - *Surveys* application **must** be installed. - -Evaluation scale ----------------- - -On each employee appraisal form, final rating options appear by default. To view and edit these -options, navigate to :menuselection:`Appraisals application --> Configuration --> Evaluation Scale`. -This presents the ratings in a list view. - -The pre-configured ratings are :guilabel:`Needs Improvement`, :guilabel:`Meets Expectations`, -:guilabel:`Exceeds Expectations`, and :guilabel:`Strongly Exceeds Expectations`. To add another -rating, click the :guilabel:`New` button. - -When the :guilabel:`New` button is clicked on the :guilabel:`Evaluation Scale` page, a blank line -appears at the bottom of the list. Enter the name of the rating in the field. - -To rearrange the order of the ratings, click the :guilabel:`(six small gray boxes)` icon to the left -of a rating, and drag the rating to the desired position on the list. - -.. image:: appraisals/evaluation-scale.png - :align: center - :alt: The evaluation scale, with the new button and click and drag icons highlighted. - -360 feedback ------------- - -The :guilabel:`360 Feedback` section displays information for all the surveys currently configured -in the *Appraisals* application. To view the surveys, and their statistics, navigate to -:menuselection:`Appraisals application --> Configuration --> 360 Feedback`. - -.. image:: appraisals/survey-list.png - :align: center - :alt: A list view of all available surveys in the Appraisals application. - -Each appraisal (or survey) is presented in its own line on the :guilabel:`360 Feedback` page, along -with various information related to that particular appraisal. - -Each appraisal includes the following information: - -- :guilabel:`Survey Name`: the name of the specific survey. -- :guilabel:`Responsible`: the employee responsible for the survey, including the month and year - they were given that designation. -- :guilabel:`Questions`: the number of questions in that particular survey. -- :guilabel:`Average Duration`: the average time a user spends completing the survey. -- :guilabel:`Registered`: the number of people who have been sent the survey. -- :guilabel:`Completed`: the number of people who have completed the survey. - -Each appraisal also has two buttons at the end of each line: a :guilabel:`Test` button and a -:guilabel:`See Results` button. - -To see what an appraisal looks like for the end user (i.e. an employee), click the :guilabel:`Test` -button, and the appraisal loads in a new browser tab. The entire appraisal loads, and can be clicked -through without having to enter any answers. - -To exit, close the tab. Or, click :guilabel:`This is a Test Survey. → Edit Survey` at the top of the -page to be taken to the detail form for that particular survey. - -To view the results from everyone who completed an appraisal, click the :guilabel:`See Results` -button. This presents all the answers for the survey in a new tab. Each question provides -information on how many people responded to a question, and how many people skipped it. All answers -for each question are visible. - -To exit, close the tab. Or, click :guilabel:`→ Edit Survey` at the top of the page to be taken to -the detail form for that particular survey. - -In addition to viewing the responses from past appraisals and surveys, new surveys can also be -created from the :guilabel:`360 Feedback` page. Simply click the :guilabel:`New` button in the -top-left of the page to create a new survey. - -For more information on how to create a survey, refer to the :doc:`../marketing/surveys/create` -document. - -.. note:: - In previous versions of Odoo, this section was referred to as :guilabel:`Surveys`. - -.. seealso:: - - :doc:`appraisals/new_appraisals` - - :doc:`appraisals/goals` - - :doc:`appraisals/appraisal_analysis` - - :doc:`appraisals/skills_evolution` - .. toctree:: - :titlesonly: + appraisals/schedule_appraisals appraisals/new_appraisals + appraisals/appraisal_templates + appraisals/360 appraisals/goals appraisals/appraisal_analysis appraisals/skills_evolution diff --git a/content/applications/hr/appraisals/360.rst b/content/applications/hr/appraisals/360.rst new file mode 100644 index 0000000000..8f5b0342fa --- /dev/null +++ b/content/applications/hr/appraisals/360.rst @@ -0,0 +1,85 @@ +============ +360 Feedback +============ + +Odoo's **Appraisals** app lets managers gather feedback on their direct reports from anyone in the +company. Input from colleagues gives managers a fuller view of each employee's strengths, growth +areas, and collaboration skills. + +.. _appraisals/360-dashboard: + +360 feedback dashboard +====================== + +The :guilabel:`360 Feedback` section displays information for all the surveys configured for the +**Appraisals** app. To view the surveys and their statistics, navigate to :menuselection:`Appraisals +app --> Configuration --> 360 Feedback`. + +.. image:: 360/survey-list.png + :alt: A list view of all available surveys in the Appraisals application. + +Each appraisal, or survey, is presented on its own line on the :guilabel:`360 Feedback` dashboard, +along with various information related to that particular appraisal. + +Each appraisal includes the following information: + +- :guilabel:`Survey Name`: the name of the specific survey. +- :guilabel:`Responsible`: the employee responsible for the survey, including the month and year + they were given that designation. +- :guilabel:`Questions`: the number of questions in that particular survey. +- :guilabel:`Average Duration`: the average time a user spends completing the survey. +- :guilabel:`Registered`: the number of people who have been sent the survey. +- :guilabel:`Completed`: the number of people who have completed the survey. +- :guilabel:`Certified`: if the survey is for a certification, the percentage of users who have + passed the certification. + +Each appraisal row offers two actions: + +- :guilabel:`Test`: Opens the appraisal in a new tab to preview the questions without submitting + answers. Close the tab to return to the list, or click :icon:`oi-arrow-right` :guilabel:`Go to + Survey`/:guilabel:`Go to Appraisal` for the full form. +- :guilabel:`See Results`: :ref:`View response analytics `. + +.. _appraisals/360-request-feedback: + +Request feedback +================ + +To request feedback from a colleague, navigate to the **Appraisals** app, and click on the appraisal +card to open it. + +Click the :guilabel:`Ask Feedback` button, and an :guilabel:`Ask Feedback` email pop-up window +appears, using the :guilabel:`Appraisal: Ask Feedback` email template. + +First, using the drop-down menu, select the employees being asked to provide feedback in the +:guilabel:`Recipients` field. Multiple employees may be selected. Next, make any desired changes to +the default message, and attach any relevant documents. + +The :guilabel:`Answer Deadline` date is automatically set to the day after the :guilabel:`Appraisal +Date` on the appraisal form. Using the calendar selector, modify the date, if desired. + +Click :guilabel:`Send`, and the feedback requests are sent to the specified employees. + +.. image:: 360/ask-feedback.png + :alt: The email pop-up when requesting feedback from other employees. + +.. _appraisals/360-view-results: + +View results +============ + +To view the results from everyone who has completed a survey, click the :guilabel:`See Results` +button at the end of the corresponding survey line in the :ref:`360 Feedback dashboard +`. This presents all the answers for the survey in a new tab. Each +question provides information on how many people responded to a question, and how many people +skipped it. All answers for each question are visible. + +To save a PDF version of the survey results, click the :icon:`fa-print` :guilabel:`(Print)` icon at +the top of the page. To exit, close the tab. + +In addition to viewing the responses from past appraisals and surveys, new surveys can also be +created from the :guilabel:`360 Feedback` page. Click the :guilabel:`New` button in the top-left of +the page to create a new survey. + +For more information on how to create a survey, refer to the :doc:`../../marketing/surveys/create` +document. diff --git a/content/applications/hr/appraisals/360/ask-feedback.png b/content/applications/hr/appraisals/360/ask-feedback.png new file mode 100644 index 0000000000..e182a7d369 Binary files /dev/null and b/content/applications/hr/appraisals/360/ask-feedback.png differ diff --git a/content/applications/hr/appraisals/360/survey-list.png b/content/applications/hr/appraisals/360/survey-list.png new file mode 100644 index 0000000000..2b881857a7 Binary files /dev/null and b/content/applications/hr/appraisals/360/survey-list.png differ diff --git a/content/applications/hr/appraisals/appraisal_analysis.rst b/content/applications/hr/appraisals/appraisal_analysis.rst index b2736fbc47..7b55e96b8b 100644 --- a/content/applications/hr/appraisals/appraisal_analysis.rst +++ b/content/applications/hr/appraisals/appraisal_analysis.rst @@ -10,7 +10,20 @@ To access the *Appraisal Analysis* report, navigate to :menuselection:`Appraisal --> Appraisal Analysis`. On the :guilabel:`Appraisal Analysis` page, a report loads, displaying all the appraisals in the -database. Each entry is highlighted in a different color to represent their status: +database, in a default graph chart. Appraisals are grouped by :guilabel:`Month`, then +:guilabel:`Department`. + +View by status +============== + +Another way to view the *Appraisal Analysis* report is in the Gantt view, which provides visual +information on the appraisal's status. + +Navigate to :menuselection:`Appraisals app --> Reporting --> Appraisal Analysis`, and click the +:icon:`fa-tasks` :guilabel:`(Gantt)` icon in the upper-right corner. The report displays the current +year, grouped by department, with the current month highlighted. + +Each entry is highlighted in a different color to represent their status: +-----------+----------------------------+------------------------------------------------+ | Color | Status | Meaning | @@ -28,26 +41,25 @@ database. Each entry is highlighted in a different color to represent their stat Appraisals are scheduled automatically (appear in gray), according to their respective :ref:`appraisals/appraisal-plan`. -The report displays the current year, in a default Gantt view, grouped by department, with the -current month highlighted. - To change the period of time that is presented, adjust the date settings in the top-left corner of -the report by clicking the default :guilabel:`Year` to reveal a drop-down menu of options. The -options to display are :guilabel:`Day`, :guilabel:`Week`, :guilabel:`Month`, and :guilabel:`Year`. -Use the adjacent arrows to move forward or backward in time. +the report by clicking the :icon:`fa-calendar` :guilabel:`From: (date) to (date)` to reveal a +drop-down menu of options. The options to display are :guilabel:`Today`, :guilabel:`This week`, +:guilabel:`This month`, :guilabel:`This quarter`, and :guilabel:`This year`. + +Additionally, a range of dates can be entered in the :guilabel:`From` and :guilabel:`To` fields at +the bottom of the list, then click :guilabel:`Apply`. -At any point, click the :guilabel:`Today` button to have the Gantt view include today's date in the -view. +At any point, click the :icon:`fa-crosshairs` :guilabel:`(Focus Today)` button to have the report +include today's date in the view. To view the details of any appraisal, click on any appraisal. A pop-over window appears, displaying the due date for the appraisal. To view more details, click the :guilabel:`View` button, and further -details appear in a pop-up window. +details appear in an :guilabel:`Open` pop-up window. The report can have other :ref:`filters ` and :ref:`groupings ` set in the search bar at the top. .. image:: appraisal_analysis/analysis.png - :align: center :alt: A report showing all the appraisals for the Appraisal Analysis report. .. _appraisals/group-status: @@ -56,22 +68,20 @@ Group by status =============== When a company has a large number of employees, the default :guilabel:`Appraisal Analysis` report -may display too much information to view easily. In this scenario, viewing the data by status can be -beneficial. +may display too much information to view at one time. In this scenario, viewing the data by status +can be beneficial. -First, remove the default :icon:`oi-group` :guilabel:`Department` grouping from the search bar. -Next, click the :icon:`fa-caret-down` :guilabel:`(down arrow)` icon in the far-right of the search -bar. Click :guilabel:`Status` in the :icon:`oi-group` :guilabel:`Group By` column. Click away from -the drop-down menu to close it. +First, clear any filters or groups from the search bar. Next, click the :icon:`fa-caret-down` +:guilabel:`(Toggle Search Panel)` icon in the far-right of the search bar. Click :guilabel:`Status` +in the :icon:`oi-group` :guilabel:`Group By` column. Click away from the drop-down menu to close it. All the appraisals are now organized by status, in the following order: :guilabel:`Cancelled`, :guilabel:`Done`, :guilabel:`To Start`, and :guilabel:`Appraisal Sent`. -This view makes it easy to see which appraisals need to be completed, and when, as well as which -appraisals still need to be confirmed. +This view shows which appraisals need to be completed, and when, as well as which appraisals still +need to be confirmed. .. image:: appraisal_analysis/by-status.png - :align: center :alt: A report showing all the appraisals, grouped by status. Use case: view only the user's appraisals @@ -80,8 +90,8 @@ Use case: view only the user's appraisals When viewing the :guilabel:`Appraisal Analysis` report, it can save time to only view the appraisals the signed-in user is responsible for, and hide the rest. -To only view this data, click the :icon:`fa-caret-down` :guilabel:`(down arrow)` icon in the -far-right of the search bar, revealing a drop-down menu. +To only view this data, click the :icon:`fa-caret-down` :guilabel:`(Toggle Search Panel)` icon in +the far-right of the search bar, revealing a drop-down menu. .. note:: It is not necessary to remove the default :icon:`oi-group` :guilabel:`Department` grouping. If it @@ -98,7 +108,6 @@ scroll down and click on :guilabel:`Manager`. Next, set the middle field to :gui the fields are set, click :guilabel:`Add`. .. image:: appraisal_analysis/custom.png - :align: center :alt: A customized filter to show only the user's employees. Now, the only appraisals that appear are the appraisals that the selected user is responsible for, @@ -107,7 +116,6 @@ instead of viewing *all* the appraisals. This report can also be :ref:`grouped by status `. .. image:: appraisal_analysis/users-appraisals.png - :align: center :alt: A report showing only the appraisals the user is responsible for, by status. .. seealso:: diff --git a/content/applications/hr/appraisals/appraisal_analysis/analysis.png b/content/applications/hr/appraisals/appraisal_analysis/analysis.png index 97b70de707..4d95ae2d0b 100644 Binary files a/content/applications/hr/appraisals/appraisal_analysis/analysis.png and b/content/applications/hr/appraisals/appraisal_analysis/analysis.png differ diff --git a/content/applications/hr/appraisals/appraisal_analysis/by-status.png b/content/applications/hr/appraisals/appraisal_analysis/by-status.png index 808b362821..117780740c 100644 Binary files a/content/applications/hr/appraisals/appraisal_analysis/by-status.png and b/content/applications/hr/appraisals/appraisal_analysis/by-status.png differ diff --git a/content/applications/hr/appraisals/appraisal_templates.rst b/content/applications/hr/appraisals/appraisal_templates.rst new file mode 100644 index 0000000000..c6904a45d6 --- /dev/null +++ b/content/applications/hr/appraisals/appraisal_templates.rst @@ -0,0 +1,147 @@ +=================== +Appraisal templates +=================== + +.. |5-stars| replace:: :icon:`fa-star-o` :icon:`fa-star-o` :icon:`fa-star-o` :icon:`fa-star-o` + :icon:`fa-star-o` + +The **Appraisals** app uses a preconfigured default template, which is general enough to be +applicable to all employees. If desired, the default template :ref:`can be modified +`, or, if different templates are needed, such as department-specific +appraisal templates, new templates :ref:`can be created `. + +.. _appraisals/modify-template: + +Modify appraisal templates +========================== + +If needed, changes can be made to the default template. To view the default template, navigate to +:menuselection:`Appraisals app --> Configuration --> Appraisal Templates`. + +The default template appears in a list view, named :guilabel:`Default Template`. Click on the +template to view the template details. Make any desired changes to the template. + +The default template consists of the following questions: + +.. list-table:: Odoo **Appraisals** default appraisal template + :header-rows: 1 + + * - **Employee Feedback** + - **Manager Feedback** + + + * - **My work** + + **What are my best achievement(s) since my last appraisal?** + + *Describe something that made you proud, a piece of work positive for the company.* + + **What has been the most challenging aspect of my work this past year and why?** + + *Did you face new difficulties? Did you confront yourself to new obstacles?* + + **What would I need to improve my work?** + + *How can the company help you with your needs and objectives so you can reach your goals and + foster better collaboration.* + + **My future** + + **What are my short and long-term goals with the company, and for my career?** + + - *Give an example of a short-term objective (< 6 months)* + - *Give an example of a long-term objective (> 6 months)* + + **Which parts of my job do I most / least enjoy?** + + *Every job has strong points - which tasks do you enjoy the most and the least?* + + **My feelings** + + **How do I feel about the company...** + + - Culture/Behavior: |5-stars| + - Internal Communication: |5-stars| + + **How do I feel about my own...** + + - Job content: |5-stars| + - Work organization: |5-stars| + - Remuneration: |5-stars| + + - **Feedback** + + **Give one positive achievement that convinced you of the employee's value.** + + *Some achievements that illustrate their strengths in addressing job challenges.* + + **Evaluation** + + +---------------------+-----------+ + | *Stress Resistance* | |5-stars| | + +---------------------+-----------+ + | *Time Management* | |5-stars| | + +---------------------+-----------+ + | *Teamwork* | |5-stars| | + +---------------------+-----------+ + | *Autonomy* | |5-stars| | + +---------------------+-----------+ + | *Pro-activity* | |5-stars| | + +---------------------+-----------+ + + **Improvements** + + **How could the employee improve?** + + *From a manager's point of view, how could you help them overcome their weaknesses?* + + **Short term (6-months) actions / decisions / objectives** + + *Do you need a rapid response to the current situation?* + + **Long term (> 6 months) career discussion, where does the employee want to go, how can you + help them reach this path?** + + *How do you see the employee's future - does your vision align with their aspirations?* + +.. _appraisals/create-template: + +Create appraisal templates +========================== + +Large companies with many departments may prefer department-specific appraisal templates, instead of +using a default universal template. Creating and using department-specific templates can be helpful +if specific feedback is needed. + +.. example:: + An appliance repair company has two main types of employees, office workers who handle + administrative tasks and scheduling, and repair technicians who work in the field, performing + repairs at customers' homes. + + This type of company may create two different appraisal templates, one for the office workers, + and one for the on-site repair technicians. + +To create a new appraisal template, click the :guilabel:`New` button in the upper-left corner. Next, +:doc:`configure the appraisal <../../marketing/surveys/create>` by adding questions to the template. + +Additionally, a new appraisal template can be created by duplicating the default template, and +making modifications to the copy. To duplicate the template, navigate to :menuselection:`Appraisals +app --> Configuration --> Appraisal Templates`, then click on the template being duplicated. Click +the :icon:`fa-gear` :guilabel:`(Actions)` icon, then click :icon:`fa-clone` :guilabel:`Duplicate`. + +First, change the name of the template, then make any desired changes to the template. + +.. important:: + Appraisal templates are housed in the **Surveys** app. Any appraisal template created *in* the + **Appraisals** app must be configured to be used with the **Appraisals** app, or it will *not* be + available for appraisals. + + To ensure a new template is available for the **Appraisals** app, navigate to the **Surveys** + app, and click on the appraisal template. + + Tick the radio button next to :guilabel:`Appraisal` at the top of the survey. This setting allows + the survey to be used in the **Appraisals** app, and is visible in the :guilabel:`Appraisal + Template` drop-down menu. + + .. image:: appraisal_templates/appraisal-button.png + :alt: The appraisal radio button ticked on an appraisal form in the Surveys app. diff --git a/content/applications/hr/appraisals/appraisal_templates/appraisal-button.png b/content/applications/hr/appraisals/appraisal_templates/appraisal-button.png new file mode 100644 index 0000000000..8fd50d5ce1 Binary files /dev/null and b/content/applications/hr/appraisals/appraisal_templates/appraisal-button.png differ diff --git a/content/applications/hr/appraisals/evaluation-scale.png b/content/applications/hr/appraisals/evaluation-scale.png deleted file mode 100644 index 72278bf7c7..0000000000 Binary files a/content/applications/hr/appraisals/evaluation-scale.png and /dev/null differ diff --git a/content/applications/hr/appraisals/goals.rst b/content/applications/hr/appraisals/goals.rst index 992f319259..d1927906e6 100644 --- a/content/applications/hr/appraisals/goals.rst +++ b/content/applications/hr/appraisals/goals.rst @@ -2,84 +2,101 @@ Goals ===== -The Odoo *Appraisals* application allows managers to set goals for their employees. That way, -employees know what to work toward before their next review. +The Odoo **Appraisals** application allows managers to set (and track) clear goals for their +employees. Continuous progress towards goals give employees a concrete target between reviews, and +give managers reliable insights when evaluating performance. + +View goals +========== To view all goals, navigate to :menuselection:`Appraisals app --> Goals`. This presents all the -goals for every employee, in a default Kanban view. +goals for every employee, in a default list view, grouped by :guilabel:`Employee`. -.. _appraisals/goal-card: +Click on an employee to expand the listed goals. Each goal displays the following information: -Each goal card contains the following information: +- :guilabel:`Name`: The name of the goal. +- :guilabel:`Created on`: The date the goal was made. +- :guilabel:`Progress`: The percentage of progress the employee has achieved. +- :guilabel:`Employee`: The employee assigned to the goal. -- :guilabel:`Goal`: the name of the goal. -- :guilabel:`Employee`: the employee the goal is assigned to. -- :icon:`fa-clock-o` :guilabel:`(clock)` icon: displays the corresponding :doc:`activity icon - <../../essentials/activities>` for the record. If no activities are scheduled, the default icon is - the :icon:`fa-clock-o` :guilabel:`(clock)`. If any activities have been scheduled, the icon - represents the activity scheduled soonest. -- :guilabel:`Deadline`: the due date for the goal. -- :guilabel:`Progress`: the percentage of competency set for the goal. The options are - :guilabel:`0%`, :guilabel:`25%`, :guilabel:`50%`, :guilabel:`75%`, or :guilabel:`100%`. -- :guilabel:`Employee Icon`: the profile icon of the employee the goal is assigned to. +.. note:: + Only employees with goals assigned to them appear in the list. -If a goal is completed, a :guilabel:`Done` banner appears in the top-right corner of the goal card. +.. image:: goals/goal-list.png + :alt: A list of goals for all employees. -.. image:: goals/goals.png - :align: center - :alt: The goals Kanban view, with nine goal cards. +.. _appraisals/goal-card: -.. note:: - Every individual goal requires its own record for each employee. If multiple employees have the - same goal, a goal card for each employee appears on the list. +Create goals +============ - For example, if Bob and Sara have the same goal of `Typing`, two cards appear in the Kanban view: - one `Typing` goal for Bob, and another `Typing` goal for Sara. +To create new goals, navigate to :menuselection:`Appraisals app --> Goals`, and click +:guilabel:`New` in the top-left corner to open a blank goal form. Add the following information on +the form: -New goal -======== +- :guilabel:`Goal`: Type in a brief name for the goal in this field. +- :guilabel:`Employee`: Using the drop-down menu, select the employee being assigned the goal. Once + this field is populated, the employee's manager populates the :guilabel:`Manager` field. +- :guilabel:`Progress`: Click the current percentage of competency for the goal. The options are + :guilabel:`0%`, :guilabel:`25%`, :guilabel:`50%`, :guilabel:`75%`, or :guilabel:`100%`. +- :guilabel:`Manager`: Using the drop-down menu, select the employee's manager (if not already + selected). +- :guilabel:`Deadline`: Using the calendar selector, enter the due date for the goal. +- :guilabel:`Tags`: Using the drop-down menu, add any relevant :ref:`tags ` to + the goal. +- :guilabel:`Description` tab: Enter any details regarding the goal in this tab. -To create a new goal, navigate to :menuselection:`Appraisals app --> Goals`, and click -:guilabel:`New` top-left corner to open a blank goal form. +.. tip:: + Some goals can be broken down into steps, which may be input as a checklist. A checklist is a + tool the employee may use to mark their progress. -Input the :guilabel:`Goal`, :guilabel:`Employee`, :guilabel:`Progress`, and :guilabel:`Deadline`, -information on the goal card, as discussed in the :ref:`goal card ` section of -this document. +.. image:: goals/new-goal.png + :alt: A completed goal created for learning Python. -The information requested is all the same information that appears on the goal card in the Kanban -view, with the addition of a :guilabel:`Tags` field and a :guilabel:`Description` tab. +.. _appraisals/add-tags: -.. tip:: - The *Appraisals* application does **not** have any pre-configured tags, so all tags need to be - added. To add a tag, enter the name of the tag on the line, then click :guilabel:`Create - "(tag)"`. Repeat this for all tags that need to be added. +Tags +---- -The current user populates the :guilabel:`Employee` field, by default, and the :guilabel:`Manager` -field populates with the manager set on the employee profile. +Adding tags to goals can help when viewing the goals report, to see how many goals with specific +tags are assigned to employees. -Make any necessary changes to the form, and add any notes that might be useful to clarify the goal -in the :guilabel:`Description` tab. +To view all the current tags, and add new ones, navigate to :menuselection:`Appraisals app --> +Configuration --> Tags`. All tags appear in a list view. The default tags are: :guilabel:`External`, +:guilabel:`Hard Skills`, :guilabel:`Internal`, :guilabel:`Programming`, :guilabel:`Soft Skills`, and +:guilabel:`Training`. -.. image:: goals/new-goal.png - :align: center - :alt: A goal form filled out for a Python skill, set to 50% proficiency. +To add a new tag, click the :guilabel:`New` button in the upper-left corner, and a new line appears +at the bottom of the list. Enter the tag, then press return or click away from the field. + +Update goals +============ -Completed goals -=============== +During employee appraisals, goals are reviewed to see how much progress the employee has made. When +an employee has achieved the next level of progress, the goal must be updated accordingly. -When a goal has been met, it is important to update the record. A goal can be marked as `Done` in -one of two ways: from the main :guilabel:`Goals` dashboard, or from the individual goal card. +To update a goal's progress percentage, navigate to :menuselection:`Appraisals app --> Goals`. +Expand the employee whose goals are being evaluated, and click on an individual goal to open the +goal record. -To mark a goal as `Done` from the main :guilabel:`Goals` dashboard, click on the -:icon:`fa-ellipsis-v` :guilabel:`(vertical ellipsis)` icon in the top-right of a goal card. +Click the new :guilabel:`Progress` box to set the new progress level. It is recommended to add notes +in the :guilabel:`Description` tab, as the employee progresses with the goal. The notes should +include dates the progress changed, and any supporting information regarding the change. .. note:: - The :icon:`fa-ellipsis-v` :guilabel:`(vertical ellipsis)` icon **only** appears when the mouse - hovers over the top-right corner of a goal card. + Goal progress can be updated at any time by the employee's manager, not only during an appraisal. -Then, click :guilabel:`Mark as Done` from the resulting drop-down menu. A green :guilabel:`Done` -banner appears in the top-right corner of the goal card. +Complete goals +============== -To mark a goal as `Done` from the goal card itself, click on a goal card to open that goal's form. -Then, click the :guilabel:`Mark as Done` button in the top-left of the form. When clicked, a green -:guilabel:`Done` banner appears in the top-right corner of the goal form. +When a goal has been met, it is important to update the record. Navigate to +:menuselection:`Appraisals app --> Goals`. Expand the employee whose goals are being evaluated, and +click on an individual goal to open the goal record. + +Click the :guilabel:`Mark as Done` button in the upper-left corner. A green :guilabel:`Done` banner +appears in the top-right corner of the goal card, and the :guilabel:`Progress` changes to +:guilabel:`100%`. + +.. note:: + On the :guilabel:`Goals` dashboard, completed goals are indicated with a green :guilabel:`100%` + in the :guilabel:`Progress` column. diff --git a/content/applications/hr/appraisals/goals/goal-list.png b/content/applications/hr/appraisals/goals/goal-list.png new file mode 100644 index 0000000000..8fe80e2f3f Binary files /dev/null and b/content/applications/hr/appraisals/goals/goal-list.png differ diff --git a/content/applications/hr/appraisals/goals/goal.png b/content/applications/hr/appraisals/goals/goal.png new file mode 100644 index 0000000000..8fe80e2f3f Binary files /dev/null and b/content/applications/hr/appraisals/goals/goal.png differ diff --git a/content/applications/hr/appraisals/goals/goals.png b/content/applications/hr/appraisals/goals/goals.png deleted file mode 100644 index 2bf009e014..0000000000 Binary files a/content/applications/hr/appraisals/goals/goals.png and /dev/null differ diff --git a/content/applications/hr/appraisals/new_appraisals.rst b/content/applications/hr/appraisals/new_appraisals.rst index 8a26863529..3139a1bbd5 100644 --- a/content/applications/hr/appraisals/new_appraisals.rst +++ b/content/applications/hr/appraisals/new_appraisals.rst @@ -1,236 +1,161 @@ -============== -New appraisals -============== +================== +Conduct appraisals +================== + +This guide explains the end-to-end appraisal workflow in Odoo, from creation to final rating, +showing how managers and employees collaborate at each stage. + +- :ref:`Employee self-assessment `: The employee completes the + Employee's Feedback template and updates their skills. Responses remain hidden until the employee + sets the form to *Visible to Manager*. +- :ref:`Manager feedback `: While the employee works on their section, + the manager reviews goals, gathers peer input if needed, and fills out the *Manager's Feedback* + template. Feedback can remain hidden until the appraisal meeting. +- :ref:`Appraisal review `: Manager and employee meet to discuss both feedback + sections, validate skill changes, and agree on next steps. The meeting can be scheduled directly + from the appraisal or the calendar. +- :ref:`Completion and rating `: After the discussion, the manager assigns a + final rating, adds any private notes, and marks the appraisal Done. The record then locks unless + it is reopened for further edits. + +Throughout the process, optional actions, such as requesting peer feedback or logging private +manager notes, enhance the appraisal's accuracy and relevance. -To create a new appraisal for an employee, first navigate to the main *Appraisals* dashboard by -opening the :menuselection:`Appraisals` app. The :guilabel:`Appraisals` dashboard is the default -view. - -Appraisals dashboard -==================== +.. _appraisals/employee-feedback: -All appraisals are displayed on the dashboard in a default Kanban view, with a list of groupings on -the left side of the dashboard, including :guilabel:`COMPANY`, :guilabel:`DEPARTMENT`, and -:guilabel:`STATUS`. +Employee self-assessment +======================== -Click any grouping option to view appraisals for **only** the chosen selection. +Once an appraisal is confirmed, the employee is required to fill out the self-assessment. .. note:: - Only groupings with multiple selections appear in the list. For example, if a database only has - one company, the :guilabel:`COMPANY` grouping does **not** appear, since there is no other - company to select. - -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. -- **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. -- **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. - -To view the details of any appraisal, click on the card to open the appraisal form. - -.. image:: new_appraisals/dashboard.png - :align: center - :alt: The Appraisals dashboard with each appraisal in its own box. - -Create an appraisal -=================== - -To create a new appraisal, click the :guilabel:`New` button in the upper-left corner of the -:guilabel:`Appraisals` dashboard. Doing so reveals a blank appraisal form. After entering a name in -the first blank field, proceed to enter the following information on the form: - -- :guilabel:`Manager`: select the employee's manager from the drop-down menu. The manager is - responsible for completing the *Manager's Feedback* section of the appraisal. This field - auto-populates after the employee is selected, if they have a manager set on their employee - profile. -- :guilabel:`Appraisal Date`: the current date is automatically entered in this field. This field is - automatically updated once the appraisal is completed or cancelled, with the corresponding date of - completion or cancellation. -- :guilabel:`Department`: select the employee's department from the drop-down menu. This field - auto-populates after the employee is selected, if they have a department set on their employee - profile. -- :guilabel:`Company`: select the employee's company from the drop-down menu. This field - auto-populates after the employee is selected, if they have a company set on their employee - profile. - -.. note:: - The only required fields for the appraisal form are the employee's name, the :guilabel:`Manager`, - and the :guilabel:`Company`. - -Once the form is complete, click the :guilabel:`Confirm` button to confirm the appraisal request. - -Once confirmed, the employee receives an email stating that an appraisal was requested, and is then -prompted to schedule an appraisal date. - -The status changes to :guilabel:`Confirmed`, and the :guilabel:`Employee's Feedback` section of the -:guilabel:`Appraisal` tab is grayed out. The information in that section only appears after the -self-assessment is published by the employee. The :guilabel:`Final Rating` field also appears once -the appraisal request is confirmed. - -If there are any existing appraisals for the employee, an :guilabel:`Appraisal` smart button appears -at the top of the page, listing the total number of appraisals there are for the employee. - -Ask for feedback ----------------- - -As part of the appraisal process, the manager can request feedback on an employee from anyone in the -company. Feedback is usually requested from co-workers and other people who interact with, or work -with, the employee. This is to get a more well-rounded view of the employee, and aid in the -manager's overall assessment. - -To request feedback, the appraisal **must** be confirmed. Once confirmed, an :guilabel:`Ask -Feedback` button appears at the top of the form. - -When the :guilabel:`Ask Feedback` button is clicked, an :guilabel:`Ask Feedback` email pop-up form -appears, using the :guilabel:`Appraisal: Ask Feedback` email template, which sends the -:guilabel:`360 Feedback` survey. - -Enter the employees being asked to complete the survey in the :guilabel:`Recipients` field. Multiple -employees may be selected. + Only confirmed appraisals can be worked on. If an appraisal is *not* confirmed, the fields on the + appraisal form cannot be edited, and feedback cannot be recorded. -The email template has dynamic placeholders to personalize the message. Add any additional text to -the email, if desired. +After the employee receives a notification via email that an appraisal is confirmed and scheduled, +they are requested to fill out their half of the default appraisal template, and update any skills. -If required, an :guilabel:`Answer Deadline` can be added, as well. +Employee's can click on the link in the confirmation email to navigate to the appraisal, or they +can open their appraisal in the **Appraisals** app. To do this, open the **Appraisals** app, then +click on the appraisal card. -If any attachments are needed, click the :icon:`fa-paperclip` :guilabel:`Attachments` button, and a -file explorer window appears. Navigate to the file(s), select them, then click :guilabel:`Open`. +The :guilabel:`Employee's Feedback` half of the template includes the following sections: +:guilabel:`My work`, :guilabel:`My future`, and :guilabel:`My feelings`. Each of these sections +consists of several questions for the employee to answer, allowing the employee to perform a +self-assessment, and provide feedback on how they feel about the company and their role. -When the email is ready to send, click :guilabel:`Send.` +Employee skills +--------------- -.. image:: new_appraisals/ask-feedback.png - :align: center - :alt: The email pop-up when requesting feedback from other employees. +After completing the :ref:`Employee's Feedback ` section in the +:guilabel:`Appraisal` tab, the employee next updates their skills in the :guilabel:`Skills` tab. -Appraisal form --------------- +Any skills that were present on the employee's record when the appraisal was confirmed, appear in +this tab. If a :guilabel:`Skill Level` has changed since the last appraisal, the level must be +updated. -Once an appraisal is confirmed, the next steps require the employee to fill out the self-assessment, -after which the manager completes their assessment. - -.. _appraisals/employee-feedback: - -Employee's feedback -~~~~~~~~~~~~~~~~~~~ +.. note:: + The :guilabel:`Skills` tab does not appear on the appraisal until the appraisal is confirmed. -To complete their portion of feedback, employees should navigate to the main -:menuselection:`Appraisals application` dashboard, where the only entries visible are appraisals for -the employee, themselves, and/or anyone they manage and have to provide manager feedback for. +Click on the :guilabel:`Skill Level` for the skill that has changed, revealing a drop-down of all +available levels. Click on the new level for the skill. Once selected, the :guilabel:`Progress` +field updates accordingly. Next, click into the :guilabel:`Justification` field for the skill, and +enter any relevant details explaining the change. This field is not necessary, but may aid +management when reviewing the employee's skills. -Click on the appraisal to open the appraisal form. Enter responses in the :guilabel:`Employee's -Feedback` section, under the :guilabel:`Appraisal` tab. +Complete the self-assessment +---------------------------- -When completed, click the :guilabel:`Not Visible to Manager` toggle (the default setting once an -appraisal is confirmed). When clicked, the toggle changes to :guilabel:`Visible to Manager`. +The employee feedback remains hidden from management while the employee is performing their +self-assessment. Once the employee has completed their half of the appraisal, and updated any +skills, they tick the gray :guilabel:`Not Visible to Manager` toggle. This changes the toggle text +to :guilabel:`Visible to Manager`, the color changes to green, and their responses are then visible +to management. -.. image:: new_appraisals/employee-feedback.png - :align: center - :alt: The feedback section for the employee with the toggle button highlighted. +Additionally, a green dot appears on the appraisal card on the **Appraisals** app dashboard, +indicating the employee has completed their assessment, and marked their half of the appraisal as +done. .. _appraisals/manager-feedback: -Manager's feedback -~~~~~~~~~~~~~~~~~~ +Manager feedback +================ -After the employee has completed the :guilabel:`Employee's Feedback` section, under the -:guilabel:`Appraisal` tab, it is time for the manager to fill out the :guilabel:`Manager's Feedback` -section. +While the employee is completing their :guilabel:`Employee's Feedback` section, the manager fills +out the :guilabel:`Manager's Feedback` section. -The manager enters their responses in the fields in the :ref:`same manner as the employee -`. +Before the manager fills out their portion of the appraisal, managers typically review the +employee's goals and skills, and ask for :ref:`additional feedback ` from +the employee's coworkers, to better understand all the achievements and challenges for the employee. -When the feedback section is completed, click the :guilabel:`Not Visible to Employee` toggle (the -default setting once an appraisal is confirmed). When clicked, the toggle changes to -:guilabel:`Visible to Employee`. +Once the manager has all the information they need to evaluate the employee, they fill out the +:guilabel:`Manager's Feedback` section of the appraisal form. The manager's half has the following +sections: :guilabel:`Feedback`, :guilabel:`Evaluation`, and :guilabel:`Improvements`. -.. image:: new_appraisals/manager-feedback.png - :align: center - :alt: The feedback section for both employees and managers. The toggle buttons are highlighted. +The manager's appraisal focuses on the employee's accomplishments, as well as identifying areas of +improvements, with actionable steps to help the employee achieve their goals in both the long and +short term. -Skills tab -~~~~~~~~~~ +When the feedback section is completed, the manager can tick the :guilabel:`Not Visible to Employee` +toggle. This changes the toggle text to :guilabel:`Visible to Employee`, the color changes to green, +and their responses are then visible to the employee. -Part of an appraisal is evaluating an employee's skills, and tracking their progress over time. The -:guilabel:`Skills` tab of the appraisal form auto-populates with the skills from the :ref:`employee -form `, once an appraisal is confirmed. - -Each skill is grouped with like skills, and the :guilabel:`Skill Level`, :guilabel:`Progress`, and -:guilabel:`Justification` are displayed for each skill. - -Update any skills, or add any new skills to the :guilabel:`Skills` tab. - -If a skill level has increased, a reason for the improved rating can be entered into the -:guilabel:`Justification` field, such as `took a fluency language test` or `received Javascript -certification`. - -.. seealso:: - Refer to the :ref:`Create a new employee ` document for detailed instructions - on adding or updating a skill. - -After an appraisal is completed, and the skills have been updated, the next time an appraisal is -confirmed, the updated skills populate the :guilabel:`Skills` tab. +.. note:: + Some managers prefer to keep their feedback hidden from the employee until they :ref:`meet with + the employee ` to discuss the appraisal. -.. image:: new_appraisals/skills.png - :align: center - :alt: The skills tab of an appraisal form, all filled out. +.. _appraisals/ask-feedback: -.. note:: - The :guilabel:`Skills` tab can be modified **after** the employee and their manager have met and - discussed the employee's appraisal. +Ask for feedback +---------------- - This is a common situation as the manager may not have all the necessary information to properly - assess and update the employee's skills before meeting. +As part of the appraisal process, the manager can :ref:`request feedback for an employee +` from anyone in the company about an employee. In Odoo, this is +referred to as *360 Feedback*. -Private Note tab -~~~~~~~~~~~~~~~~ +Feedback is requested from coworkers and anyone else who works with the employee. This is to get a +more well-rounded view of the employee, and aid in the manager's overall assessment. -If managers want to leave notes that are only visible to other managers, they can be entered in the -:guilabel:`Private Note` tab. This can be done before or after meeting with the employee to discuss -the appraisal. +.. important:: + To request feedback, the appraisal **must** be confirmed. Once confirmed, an :guilabel:`Ask + Feedback` button appears in the upper-left corner of the form. -The employee being evaluated does **not** have access to this tab, and the tab does **not** appear -on their appraisal. +.. _appraisals/review: -Schedule a meeting ------------------- +Appraisal review +================ Once both portions of an appraisal are completed (the :ref:`employee ` and :ref:`manager ` feedback sections), it is time for the employee and -manager to meet and discuss the appraisal. +manager to :ref:`meet and discuss the appraisal `. -A meeting can be scheduled in one of two ways: either from the *Appraisals* application dashboard, -or from an individual appraisal card. +During the appraisal meeting, the manager reviews both the :ref:`Employee's Feedback +` section as well as their own :ref:`Manager feedback +`. -To schedule an appraisal from the dashboard of the *Appraisals* application, first navigate to -:menuselection:`Appraisals app --> Appraisals`. +Additionally, the employee's :ref:`skills ` and :doc:`goals ` +are reviewed at this time, and updated as needed. -Click the :icon:`fa-clock-o` :guilabel:`(clock)` icon, beneath the appraisal date on the desired -appraisal card, and a pop-up window appears. Then, click :icon:`fa-plus` :guilabel:`Schedule an -activity` to create an activity from a :guilabel:`Schedule Activity` pop-up form that appears. +.. _appraisals/schedule: -Select :guilabel:`Meeting` for the :guilabel:`Activity Type` from the drop-down menu. Doing so -causes the form to change, so only the :guilabel:`Activity Type` and :guilabel:`Summary` fields -appear. +Schedule appraisal review +------------------------- -Enter a brief description in the :guilabel:`Summary` field of the :guilabel:`Schedule Activity` -pop-up form, such as `Annual Appraisal for (Employee)`. +A meeting can be scheduled in one of two ways: either from the **Appraisals** app dashboard, or from +an individual appraisal card. + +To schedule an appraisal from the dashboard of the **Appraisals** app, first navigate to +:menuselection:`Appraisals app --> Appraisals`. -Next, click the :guilabel:`Open Calendar` button. From the calendar page that appears, navigate to, -and double-click on, the desired date and time for the meeting. +Click the activity icon beneath the appraisal date on the desired appraisal card, and an activity +pop-up window appears. Click :icon:`fa-plus` :guilabel:`Schedule an activity`, and set the +:guilabel:`Activity Type`` to :guilabel:`Meeting`. For more information on scheduling activities, +refer to the :ref:`activities documentation `. Doing so opens a :guilabel:`New Event` pop-up form. From this pop-up form, make any desired -modifications, such as designating a :guilabel:`Start` time, or modifying the default -:guilabel:`Title` to the meeting. +modifications, such as designating a :guilabel:`Start` time. -Add the appraisee in the :guilabel:`Attendees` section, and include anyone else who should also be +The employee populates the :guilabel:`Attendees` section by default. Add anyone else who should be in the meeting, if necessary. To make the meeting a video call, instead of an in-person meeting, click :icon:`fa-plus` @@ -241,7 +166,6 @@ Once all the desired changes are complete, click :guilabel:`Save & Close`. The meeting now appears on the calendar, and the invited parties are informed, via email. .. image:: new_appraisals/meeting.png - :align: center :alt: The meeting form with all information entered for Ronnie Hart's annual appraisal. The other way to schedule a meeting is from the individual appraisal form. To do this, navigate to @@ -256,24 +180,89 @@ For more detailed information on how to schedule activities, refer to the :doc:` .. note:: If no meetings are scheduled, the :guilabel:`Meeting` smart button reads :guilabel:`No Meeting`. +.. _appraisals/skills: + +Review employee skills +---------------------- + +Part of an appraisal is evaluating an employee's skills, and tracking their progress over time. The +:guilabel:`Skills` tab of the appraisal form auto-populates with the skills from the :ref:`employee +form `, once an appraisal is confirmed. + +Each skill is grouped with like skills, and the :guilabel:`Skill Level`, :guilabel:`Progress`, and +:guilabel:`Justification` are displayed for each skill. + +:ref:`Update any skills, or add any new skills ` to the :guilabel:`Skills` tab. + +If a skill level has increased, enter a reason for the improved rating in the +:guilabel:`Justification` field, such as `took a fluency language test` or `received Javascript +certification`. + +After an appraisal is completed, and the skills have been updated, the next time an appraisal is +confirmed, the updated skills populate the :guilabel:`Skills` tab. + +.. note:: + The :guilabel:`Skills` tab *can* be modified **after** the employee and their manager have met + and discussed the employee's appraisal. + + This is a common situation as the manager may not have all the necessary information to assess + and update the employee's skills before meeting. + +.. _appraisals/complete: + Complete an appraisal ===================== -After the appraisal is complete, and both the manager and employee have met to discuss the -appraisal, the appraisal can be marked as *Done*. When completed, click the :guilabel:`Mark as Done` -button on the appraisal form, located in the top-left corner. +After the appraisal has been filled out by both the employee and the manager, and both parties have +met and discussed the employee's performance, the manager then :ref:`logs any notes +`, and :ref:`assigns a rating `. -Once the appraisal is marked as *Done*, the :guilabel:`Mark as Done` button disappears, and a -:guilabel:`Reopen` button appears. +When completed, click the :guilabel:`Mark as Done` button in the upper-left corner of the appraisal +form. + +Once the appraisal is marked as *Done*, the status changes from :guilabel:`Confirmed` to +:guilabel:`Done`, and the :guilabel:`Mark as Done` button changes to a :guilabel:`Reopen` button. .. tip:: Modifications are **not** possible once the appraisal is marked as done. - To make any changes to an appraisal that is marked as *Done*, click the :guilabel:`Reopen` - button. + To make any changes to an appraisal with a status of :guilabel:`Done`, click the + :guilabel:`Reopen` button, then, click :guilabel:`Confirm`, and make any modifications needed. + Once all modifications are complete, click the :guilabel:`Mark as Done` button again. + +.. _appraisals/notes: + +Add a private note +------------------ + +Managers can log notes on an appraisal that are **only** visible to other managers. Enter any notes +in the :guilabel:`Private Note` tab. This can be done anytime during the appraisal process. + +The employee being evaluated does **not** have access to this tab, and the tab does **not** appear +on their appraisal. + +The tab is optional and does not affect the final rating. + +.. _appraisals/rate: + +Provide a final rating +---------------------- + +After both the manager and employee have met to discuss the employee's performance, the appraisal +must be given a :guilabel:`Final Rating`. + +Using the drop-down menu, select the rating for the employee. The default options are: +:guilabel:`Needs improvement`, :guilabel:`Meets expectations`, :guilabel:`Exceeds expectations`, +:guilabel:`Strongly Exceeds Expectations`, and :guilabel:`Good`. + +To add a new rating, navigate to :menuselection:`Appraisals app --> Configuration --> Evaluation +Scale`. The default ratings are presented in a list view. To add a new rating, click the +:guilabel:`New` button in the upper-left corner, and a blank line appears at the bottom of the list. +Enter the new rating, then press the enter key, or click away from the line. Add as many new ratings +as needed. - Then, click the :guilabel:`Confirm` button that appears, and make any modifications needed. Once - all modifications are complete, click the :guilabel:`Mark as Done` button again. +Click :menuselection:`Appraisals` in the top menu to return to the :guilabel:`Appraisals` dashboard, +click on the appraisal, then select the desired :guilabel:`Final Rating`. .. seealso:: - :doc:`../appraisals/goals` diff --git a/content/applications/hr/appraisals/new_appraisals/ask-feedback.png b/content/applications/hr/appraisals/new_appraisals/ask-feedback.png deleted file mode 100644 index 11032d98b1..0000000000 Binary files a/content/applications/hr/appraisals/new_appraisals/ask-feedback.png and /dev/null differ diff --git a/content/applications/hr/appraisals/new_appraisals/dashboard.png b/content/applications/hr/appraisals/new_appraisals/dashboard.png deleted file mode 100644 index 5c40b65579..0000000000 Binary files a/content/applications/hr/appraisals/new_appraisals/dashboard.png and /dev/null differ diff --git a/content/applications/hr/appraisals/new_appraisals/employee-feedback.png b/content/applications/hr/appraisals/new_appraisals/employee-feedback.png deleted file mode 100644 index e8595eb8de..0000000000 Binary files a/content/applications/hr/appraisals/new_appraisals/employee-feedback.png and /dev/null differ diff --git a/content/applications/hr/appraisals/new_appraisals/manager-feedback.png b/content/applications/hr/appraisals/new_appraisals/manager-feedback.png deleted file mode 100644 index a1e58c2e8b..0000000000 Binary files a/content/applications/hr/appraisals/new_appraisals/manager-feedback.png and /dev/null differ diff --git a/content/applications/hr/appraisals/new_appraisals/meeting.png b/content/applications/hr/appraisals/new_appraisals/meeting.png index b0ec9dfeb0..f06289f054 100644 Binary files a/content/applications/hr/appraisals/new_appraisals/meeting.png and b/content/applications/hr/appraisals/new_appraisals/meeting.png differ diff --git a/content/applications/hr/appraisals/new_appraisals/skills.png b/content/applications/hr/appraisals/new_appraisals/skills.png deleted file mode 100644 index 90ec2d06fd..0000000000 Binary files a/content/applications/hr/appraisals/new_appraisals/skills.png and /dev/null differ diff --git a/content/applications/hr/appraisals/schedule_appraisals.rst b/content/applications/hr/appraisals/schedule_appraisals.rst new file mode 100644 index 0000000000..4dcf56cfca --- /dev/null +++ b/content/applications/hr/appraisals/schedule_appraisals.rst @@ -0,0 +1,92 @@ +=================== +Schedule appraisals +=================== + +Odoo's **Appraisals** app helps managers run recurring performance reviews. Each review can include +a self-assessment and can follow any schedule the company sets. + +Regular appraisals turn day-to-day work into clear goals and measurable skill targets. They also +supply the objective evidence HR needs for raises or promotions, and keep individual performance +aligned with company KPIs. + +Reviews can be :ref:`scheduled automatically ` through an :ref:`appraisal plan +` that triggers evaluations at set intervals, or :ref:`created manually +` whenever needed—such as before a promotion or department transfer. + +.. _appraisals/auto: + +Automatic scheduling +==================== + +To ensure no appraisal is missed, enable automatic scheduling by going to :menuselection:`Appraisals +app --> Configuration --> Settings`. + +The :guilabel:`Appraisals Plan` settings determines the frequency that appraisals are scheduled. + +.. image:: schedule_appraisals/appraisals-setting.png + :alt: The appraisals sections with the timeline filled in and 360 feedback enabled. + +.. _appraisals/appraisal-plan: + +Appraisals plans +---------------- + +By default, appraisals are preconfigured to be automatically created six months after an employee is +hired, with a second appraisal exactly six months after that. + +Once those two initial appraisals have been completed in the employee's first year, following +appraisals are only created once a year (every twelve months). + +To modify this schedule, change the number of months in the blank fields under the +:guilabel:`Appraisals Plans` section. + +.. important:: + Changing the :guilabel:`Appraisals Plans` field updates **every** employee record whose + :guilabel:`Next Appraisal Dates` is empty. + +Appraisals automation +--------------------- + +Tick the checkbox next to :guilabel:`Appraisals Automation` to have Odoo automatically schedule +*and* confirm appraisals. + +Appraisals are scheduled according to the :ref:`appraisal plan `. + +.. _appraisals/manual: + +Manually schedule an appraisal +============================== + +Managers can schedule an appraisal at any time, outside the regular cycle. + +For example, if an employee is promoted, or transfers to a new role or a new department, an +appraisal is scheduled to assess performance in the current role. + +To create a new appraisal, open the :menuselection:`Appraisals` app, and click the :guilabel:`New` +button in the upper-left corner. This opens a blank :guilabel:`Appraisals` form. + +First, using the drop-down menu, select the employee being evaluated, in the first field on the +form. Once an employee is selected, the employee's :guilabel:`Manager`, :guilabel:`Job Position`, +and :guilabel:`Department` fields are populated according to the information on the employee record. + +The current date populates the :guilabel:`Appraisal Date` field, which is the date the appraisal is +scheduled to be completed. Using the calendar selector, adjust the date, if desired. This field is +typically updated when the manager submits their final rating at the end of the appraisal process. + +If there is an :ref:`appraisal plan ` configured, the :guilabel:`Next +Appraisal Date` field displays :guilabel:`Ongoing`. This indicates that the following appraisal will +be scheduled according to the appraisal schedule. Once the appraisal is marked as complete, the +:guilabel:`Next Appraisal Date` is updated with the date of the next appraisal. + +Last, select the desired :guilabel:`Appraisal Template`. The :guilabel:`Default Template` populates +this field, by default, and is created when the **Appraisals** app is installed. Using the drop-down +menu, select a different template, if desired. + +Once the information in the top-half of the :guilabel:`Appraisals` form is complete, click the +:guilabel:`Confirm` button in the upper-left corner, and the appraisal is scheduled, and the +employee is notified. + +Once the appraisal is confirmed, both the employee and manager can start to fill out the appraisal. + +.. image:: schedule_appraisals/new-appraisal.png + :alt: A new appraisal form with the top half filled out. diff --git a/content/applications/hr/appraisals/appraisals-setting.png b/content/applications/hr/appraisals/schedule_appraisals/appraisals-setting.png similarity index 100% rename from content/applications/hr/appraisals/appraisals-setting.png rename to content/applications/hr/appraisals/schedule_appraisals/appraisals-setting.png diff --git a/content/applications/hr/appraisals/schedule_appraisals/new-appraisal.png b/content/applications/hr/appraisals/schedule_appraisals/new-appraisal.png new file mode 100644 index 0000000000..f6d71bca3e Binary files /dev/null and b/content/applications/hr/appraisals/schedule_appraisals/new-appraisal.png differ diff --git a/content/applications/hr/appraisals/skills_evolution.rst b/content/applications/hr/appraisals/skills_evolution.rst index b3fce1a16d..2b48a8f243 100644 --- a/content/applications/hr/appraisals/skills_evolution.rst +++ b/content/applications/hr/appraisals/skills_evolution.rst @@ -22,27 +22,30 @@ 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. +Doing so reveals the :guilabel:`Appraisal Skills Report` page. All skills are grouped by the month +they were created, then by employee, and then by skill type. -.. 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. +.. important:: + The :guilabel:`Appraisals Skills Report` only displays skills for employees with at least one + completed appraisal. Skills for employees whose appraisals are still draft or pending are not + included. -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. + When an employee completes their first appraisal, all their skills appear on the report. Once + subsequent appraisals are marked as done, any skill changes from the previous appraisal appear on + the report. -Each skill has the following information listed: + Any skill level changes from ongoing appraisals that have **not** been finalized are **not** + included in this report. + +To view the specific details for an employee's skill types, expand the :guilabel:`Employee`, then +expand the individual :guilabel:`Skill Types`. Each skill type displays the following information: - :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:`Current Level`: the current level the employee has achieved for the skill. +- :guilabel:`Previous Progress`: the previous percentage of competency achieved for the skill. +- :guilabel:`Current 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 @@ -54,7 +57,6 @@ This report can be modified to find specific information by adjusting the :ref:` ` and :ref:`groupings ` 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: @@ -62,40 +64,38 @@ This report can be modified to find specific information by adjusting the :ref:` 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. +Since the :guilabel:`Appraisal Skills Report` organizes all skills by month, then 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. +Next, click the :icon:`fa-caret-down` :guilabel:`(Toggle Search Panel)` 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. +as-is (:guilabel:`is in)`, 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. +:guilabel:`Current Level` for the first drop-down field, leave the second field as-is :guilabel:`(is +in)`, 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`. +After the second rule is added, navigate to the text at the top of the pop-up window that shows +:guilabel:`Match any` :icon:`fa-caret-down` :guilabel:`of the following rules`. Click the drop-down +menu for :guilabel:`any` and change it to :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 @@ -105,7 +105,7 @@ Another way to modify the :guilabel:`Appraisal Skills Report` is to identify the 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 +:icon:`fa-caret-down` :guilabel:`(Toggle Search Panel)` 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. @@ -119,11 +119,11 @@ the second drop-down field. Once :guilabel:`is between` is selected, a second fi 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. +The custom filter presents all skills that have been improved, organized by employee, in a default +list view. .. example:: - To determine the employee with the most amount of improved skills for the third quarter, remove + To determine the employee with the most amount of improved skills for the second 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. @@ -132,11 +132,8 @@ organized by employee. 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. + Using the calendar selector, set the first date to :guilabel:`04/01/2025` and the second date to + :guilabel:`06/30/2025`, then click :guilabel:`Add`. .. image:: skills_evolution/custom-filter.png :alt: The Custom Filter pop-up with the parameters set. @@ -146,15 +143,14 @@ To view the number of employees and skills in further detail, click the :icon:`o 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 +To expand the 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. +:guilabel:`Add Custom Group` :icon:`fa-caret-down`, then click :guilabel:`Skill` from the resulting +drop-down menu. This expands all the improved skills, organized by individual skill. .. 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). + In this example, :guilabel:`Audrey Peterson` improved the most in the third quarter, with five + improved skills. .. image:: skills_evolution/largest-improvement.png :alt: The pivot table showing the skill improvements for the third quarter. diff --git a/content/applications/hr/appraisals/skills_evolution/custom-filter.png b/content/applications/hr/appraisals/skills_evolution/custom-filter.png index 0bc9069dbd..04b29bcfb5 100644 Binary files a/content/applications/hr/appraisals/skills_evolution/custom-filter.png and b/content/applications/hr/appraisals/skills_evolution/custom-filter.png differ diff --git a/content/applications/hr/appraisals/skills_evolution/javascript.png b/content/applications/hr/appraisals/skills_evolution/javascript.png index 066e64dc02..76c6bbb04b 100644 Binary files a/content/applications/hr/appraisals/skills_evolution/javascript.png and b/content/applications/hr/appraisals/skills_evolution/javascript.png differ diff --git a/content/applications/hr/appraisals/skills_evolution/largest-improvement.png b/content/applications/hr/appraisals/skills_evolution/largest-improvement.png index fa635fcfa8..dcfdfaa7b8 100644 Binary files a/content/applications/hr/appraisals/skills_evolution/largest-improvement.png and b/content/applications/hr/appraisals/skills_evolution/largest-improvement.png differ diff --git a/content/applications/hr/appraisals/skills_evolution/results.png b/content/applications/hr/appraisals/skills_evolution/results.png index d17de7bf22..720ff4e3b2 100644 Binary files a/content/applications/hr/appraisals/skills_evolution/results.png and b/content/applications/hr/appraisals/skills_evolution/results.png differ diff --git a/content/applications/hr/appraisals/skills_evolution/skills-report.png b/content/applications/hr/appraisals/skills_evolution/skills-report.png index 0ef468e758..a53a38ab49 100644 Binary files a/content/applications/hr/appraisals/skills_evolution/skills-report.png and b/content/applications/hr/appraisals/skills_evolution/skills-report.png differ diff --git a/content/applications/hr/appraisals/survey-list.png b/content/applications/hr/appraisals/survey-list.png deleted file mode 100644 index 676ebecc61..0000000000 Binary files a/content/applications/hr/appraisals/survey-list.png and /dev/null differ diff --git a/content/applications/hr/attendances.rst b/content/applications/hr/attendances.rst index ae3651d902..505bee7c96 100644 --- a/content/applications/hr/attendances.rst +++ b/content/applications/hr/attendances.rst @@ -4,258 +4,277 @@ Attendances =========== -Odoo's *Attendances* application functions as a time clock. Employees are able to check in and out -of work using a dedicated device in kiosk mode, while users are also able to check in and out of -work directly from the database. Managers can quickly see who is available at any given time, create -reports to see everyone's hours, and gain insights on which employees are working overtime, or -checking out of work earlier than expected. +Odoo's **Attendances** application functions as a time clock. Employees are able to check in and out +of work using a :ref:`dedicated device in kiosk mode `, while users +are also able to check in and out of work :ref:`directly from the database `. +Managers can see who is available at any given time, create reports to see everyone's hours, and +gain insights on which employees are working overtime, or checking out of work earlier than +expected. .. _attendances/access-rights: Access rights ============= -It is important to understand how the different access rights affect what options and features users -can access in the *Attendances* application. +Understanding access rights is essential to navigating the **Attendances** application. Every user in the database is able to check in and out directly from the database, without needing -access to the *Attendances* application. Additionally, all users can access their own attendance -records from their employee form in the *Employees* app. +access to the **Attendances** app. Additionally, all users can access their own attendance records +from their employee form in the **Employees** app. -Access to both the *Attendances* application, and the various features within the application is +Access to both the **Attendances** application, and the various features within the application is determined by access rights. To see what access rights a user has, navigate to the :menuselection:`Settings app --> Users & -Companies: Users`, and click on an individual user. The :guilabel:`Access Rights` tab is visible by -default. Scroll down to the :guilabel:`Human Resources` section to see the setting. For the +Companies --> Users`, and click on an individual user. The :guilabel:`Access Rights` tab is visible +by default. Scroll down to the :guilabel:`HUMAN RESOURCES` section to view the settings. For the :guilabel:`Attendances` field, the options are either to leave the field blank or select :guilabel:`Administrator`. If the :guilabel:`Administrator` option is selected, the user has full access to the entire -*Attendances* application, with no restrictions. They can view all employee attendance records, -enter *Kiosk mMode* from the application, access all reporting metrics, and make modifications to -the settings. If left blank, the user does **not** have access to the *Attendances* application. +**Attendances** application, with no restrictions. They can view all employee attendance records, +enter *Kiosk Mode* from the application, access all reporting metrics, and make modifications to the +settings. If left blank, the user does **not** have access to the **Attendances** application. + +.. note:: + If a user does **not** have :guilabel:`Administrator` rights for the **Attendances** app, they + are **not** able to open the app, even though it appears on the main database dashboard. An + :guilabel:`Access Error` pop-up message appears, stating: + + `You do not have enough rights to access the fields "attendance_manager_id" on Employee + (hr.employee). Please contact your system administrator.` + + Users who cannot access the **Attendances** app can still :doc:`check in and check out + <../hr/attendances/check_in_check_out>` of work within the database, using the :icon:`fa-circle` + :guilabel:`(red circle)` or :icon:`fa-circle` :guilabel:`(green circle)` that are always + available at the top of the database. .. _attendances/approvers: Approvers --------- -The **only** other scenario where different information may be accessible in the *Attendances* -application is for approvers. If a user does *not* have administrative rights for the *Attendances* -application, but they are set as an employee's approver for the *Attendances* application, that user -is able to view the attendance records for that specific employee, as well as make modifications to -that employee's attendance records, if necessary. This applies to all employees for whom the user is -listed as the *Attendances* application approver. Approvers are typically managers, though this is -not required. +An approver is a user assigned to review and manage an employee's attendance records. An approver is +typically a manager, though that is not required. Approvers without administrative rights can access +and modify attendance records **only** for the employees they are assigned to. This is the only +exception where non-admin users can view records in the **Attendances** app. -To see who the attendance approver is for an employee, navigate to the :menuselection:`Employees +To view who the attendances approver for an employee is, navigate to the :menuselection:`Employees application` and click on the specific employee. Click on the :guilabel:`Work Information` tab, -scroll to the :guilabel:`Approvers` section, and check the :guilabel:`Attendance` field. The person -selected is able to view that employees' attendance records, both on the *Attendances* application +scroll to the :guilabel:`APPROVERS` section, and check the :guilabel:`Attendance` field. The person +selected is able to view that employees' attendance records, both on the **Attendances** application dashboard as well as in the attendance reports, and make modifications to their records. Configuration ============= -Few configurations are needed in the *Attendances* application. Determining how employees check in -and out, defining how the kiosks function, and determining how extra hours are computed are all set -in the Configuration menu. Navigate to the :menuselection:`Attendances application --> -Configuration` to access the configuration menu. +Few configurations are needed in the **Attendances** app. Determining how employees check in and +out, defining how the kiosks function, and determining how extra hours are computed are all set in +the Configuration menu. Navigate to the :menuselection:`Attendances application --> Configuration` +to access the configuration menu. + +.. note:: + Any configuration item with an :icon:`fa-building-o` :guilabel:`(building)` icon is a + company-specific configuration. Items without an :icon:`fa-building-o` :guilabel:`(building)` + icon apply to all companies within the database. + +.. _attendances/modes: Modes ----- -- :guilabel:`Attendances from Backend`: activate this selection to allow users to check in and out - directly from the Odoo database. If this is not activated, users must use a kiosk to check in and - out of work. - -Extra hours +- :guilabel:`Attendances from Backend` :icon:`fa-building-o`: activate this feature to allow users + to check in and out directly from the Odoo database. If this is not activated, users must use a + kiosk to check in and out of work. +- :guilabel:`Automatic Check-Out` :icon:`fa-building-o`: activate this feature to automatically + check out employees according to their working schedule, after a buffer of time has passed. +- :guilabel:`Tolerance`: this field appears only when the :guilabel:`Automatic Check-Out` + :icon:`fa-building-o` feature is enabled. Enter the amount of time, in hours, that must elapse + after an employee's working hours have ended, before they are automatically checked out. + +.. example:: + With the :guilabel:`Automatic Check-Out` option enabled, and the :guilabel:`Tolerance` set to + `2.00` hours, an employee checks in to work at 9:00 AM, and forgets to check-out at 5:00 PM. At + 7:00 PM, they are automaticlaly checked out. + +- :guilabel:`Absence Management` :icon:`fa-building-o`: activate this feature to log any absences + that are not associated with a time off request, such as vacation time or sick time, on the + attendances report. + +Extra Hours ----------- -This section specifies how extra time is calculated, including when extra time is counted and what -time is not logged. +This section specifies how extra time (sometimes referred to as *overtime*) is calculated, including +when extra time is counted and what time is not logged. -- :guilabel:`Count of Extra Hours`: enable this box to allow employees to log extra hours beyond - their set working hours (sometimes referred to as *overtime*). Activating this selection displays - the following settings as well. If this is not activated, no other configurations appear. +- :guilabel:`Tolerance Time In Favor Of Company`: enter the amount of time, in minutes, that is + **not** counted towards an employee's overtime. When an employee checks out, and the extra time + logged is below the specified minutes, the extra time is **not** counted as overtime for the + employee. +- :guilabel:`Tolerance Time In Favor Of Employee`: enter the amount of time, in minutes, that an + employee is given, that does **not** adversely affect their attendance if they log less time than + their working hours. When an employee checks out, and the total time logged for the day is less + than their specified working hours and less than this specified grace period, they are **not** + penalized for their reduced hours. - - :guilabel:`Start From`: the current date is automatically entered in this field. If desired, - click on this field and use the calendar selector to modify the start date on which extra hours - are logged. - - :guilabel:`Tolerance Time In Favor Of Company`: enter the amount of time, in minutes, that is - **not** counted towards an employee's overtime. When an employee checks out, and the extra time - logged is below the specified minutes, the extra time is **not** counted as overtime for the - employee. - - :guilabel:`Tolerance Time In Favor Of Employee`: enter the amount of time, in minutes, that an - employee is given, that does **not** adversely affect their attendance if they log less time - than their working hours. When an employee checks out, and the total time logged for the day is - less than their specified working hours and less than this specified grace period, they are - **not** penalized for their reduced hours. + .. example:: + A company sets both of the :guilabel:`Tolerance` fields to `15` minutes, and the working hours + for the entire company are set from 9:00 AM to 5:00 PM. - .. example:: - A company sets both of the :guilabel:`Tolerance` fields to `15` minutes, and the working - hours for the entire company are set from 9:00 AM to 5:00 PM. + If an employee checks in at 9:00 AM, and checks out at 5:14 PM, the extra 14 minutes are + **not** counted towards their overtime. - If an employee checks in at 9:00 AM, and checks out at 5:14 PM, the extra 14 minutes are - **not** counted towards their overtime. + If an employee checks in at 9:05 AM, and checks out at 4:55 PM, even though they logged a total + of 10 minutes less than their full working hours, they are **not** penalized for this + discrepancy. - If an employee checks in at 9:05 AM, and checks out at 4:55 PM, even though they logged a - total of 10 minutes less than their full working hours, they are **not** penalized for this - discrepancy. +- :guilabel:`Extra Hours Validation` :icon:`fa-building-o`: tick either the radio button next to + :guilabel:`Automatically Approved` to have all extra time automatically approved, or + :guilabel:`Approved by Manager` if all extra time should be reviewed and approved by a manager. - - :guilabel:`Display Extra Hours`: activate this box to display the extra hours logged by an - employee when they check out with a kiosk, or when a user checks out in the database. +- :guilabel:`Display Extra Hours`: activate this box to display the extra hours logged by an + employee when they check out with a kiosk, or when a user checks out in the database. .. note:: - Employees are still able to log overtime hours even if the :guilabel:`Count of Extra Hours` - option is not activated. The difference is that when :guilabel:`Count of Extra Hours` is - activated, the extra hours can be :ref:`deducted from an approved time off request + Approved extra hours can be :ref:`deducted from an approved time off request `. Overview ======== -When entering the *Attendances* application, the :guilabel:`Overview` dashboard is presented, -containing all the check in and check out information for the signed in user. If the user has -specific :ref:`access rights ` and/or are :ref:`approvers -` for specific employees, then those additional employee's check in and check -out information is also visible on the :guilabel:`Overview` dashboard. +When entering the **Attendances** application, the :guilabel:`Overview` dashboard is presented, +containing all the user's check in and check out information. If the user has the required +:ref:`access rights ` or is an :ref:`approver ` +for specific employees, those employeess' check-in and check-out information also appears on the +:guilabel:`Overview` dashboard. -Views ------ - -To change the view from the default Gantt chart to a list view, click the :guilabel:`List` icon in -the top right of the dashboard, beneath the user's photo. To switch back to the Gantt chart, click -the :guilabel:`Gantt` button, located next to the :guilabel:`List` button. - -The default view presents the current day's information. To present the information for the -:guilabel:`Week`, :guilabel:`Month`, or :guilabel:`Year`, click on the :guilabel:`Day` button to -reveal a drop-down, displaying those other options. Select the desired view, and the dashboard -updates, presenting the selected information. To change the :guilabel:`Day`, :guilabel:`Week`, -:guilabel:`Month`, or :guilabel:`Year` presented, click the :guilabel:`← (left arrow)` or -:guilabel:`→ (right arrow)` buttons on either side of the drop-down menu. To jump back to a view -containing the current day, click the :guilabel:`Today` button. This refreshes the dashboard, -presenting information containing the current day's information. - -In the :guilabel:`Day` view, the column for the current hour is highlighted in yellow. If the -:guilabel:`Week` or :guilabel:`Month` view is selected, the column for the current day is -highlighted. If the :guilabel:`Year` view is selected, the current month is highlighted. +The **Attendance** dashboard allows switching between :icon:`fa-tasks` :guilabel:`(Gantt)` and +:icon:`oi-view-list` :guilabel:`(List)` views, and selecting a period to analyze. The current period +is automatically highlighted in yellow for real-time attendance records, while the +:icon:`fa-crosshairs` :guilabel:`(Focus Today)` button instantly returns the dashboard to the +present date. .. image:: attendances/overview.png - :align: center :alt: The overview dashboard presenting the information for the week, with the current day highlighted. -Any entries that have errors appear in red, indicating they need to be resolved by a user with the -proper :ref:`access rights ` and/or are :ref:`approvers -` for the employee(s) with the errors. +.. note:: + Any entries that have errors appear in red, indicating they need to be resolved by a user with + the proper :ref:`access rights ` and/or are :ref:`approvers + ` for the employees with the errors. .. _attendances/filters-groups: Filters and groups +================== + +Sometimes, attendance officers and managers need to view specific records, such as all automatic +checkouts to determine which employees chronically forget to check-out, or by department, to +determine which team is working the most overtime. + +For these cases, use the search bar to select a :icon:`fa-filter` :guilabel:`Filters` or +:icon:`oi-group` :guilabel:`Group By`, or combine these both to present the desired information. + +.. seealso:: + :doc:`../essentials/search` + +High-value filters ------------------ -To filter the results in the overview dashboard, or to present different groups of information, -click the :guilabel:`🔻 (triangle drop down)` button in the right side of the :guilabel:`Search` bar -above the dashboard, and select one of the available :guilabel:`Filters` or :guilabel:`Group By` -options. There are several pre-configured filters and groups to choose from, as well as an option to -create custom ones. - -Filters -~~~~~~~ - -The default filters that can be selected are: - -- :guilabel:`My Attendances`: this filter only presents the user's attendance data. -- :guilabel:`My Team`: this filter presents the attendance data for the user's team. -- :guilabel:`At Work`: this filter displays the attendance data for everyone currently checked in. -- :guilabel:`Errors`: this filter displays any entries with :ref:`errors ` that - need to be resolved. -- :guilabel:`Check In`: this filter has a drop-down to further select a specific time period. Select - the desired time period from the options presented, a specific month, quarter, or year. -- :guilabel:`Last 7 days`: this filter presents the attendance data for the last seven days. -- :guilabel:`Add Custom Filter`: create a custom filter using the pop-up that appears when this is - selected. - -Groups -~~~~~~ - -The default groups that can be selected are: - -- :guilabel:`Check In`: this grouping presents a drop-down menu containing the following time period - options: :guilabel:`Year`, :guilabel:`Quarter`, :guilabel:`Month`, :guilabel:`Week`, and - :guilabel:`Day`. Selected the time period to display all the check-in information, grouped by the - selected time period. -- :guilabel:`Employee`: this group presents the attendance data organized by employee. -- :guilabel:`Check Out`: this grouping presents a drop-down menu containing the following time - period options: :guilabel:`Year`, :guilabel:`Quarter`, :guilabel:`Month`, :guilabel:`Week`, and - :guilabel:`Day`. Selected the time period to display all the check-out information, grouped by the - selected time period. -- :guilabel:`Add Custom Group`: this option displays a drop-down menu with a variety of options to - group the attendance data by, including :guilabel:`City`, :guilabel:`Country`, :guilabel:`Mode`, - and :guilabel:`IP Address`. +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + :widths: 40 60 + + * - Filter + - Common use case + * - At Work + - Verify employees still on-site before shutting down the building for the night, or to perform + a head count. + * - Errors + - View all errors to correct them prior to payroll processing. + * - Automatically Checked-Out + - Perform an audit to determine employees who chronically forget to check-out of work. + * - Date + - Limit results to a specific pay-period or audit window. + * - Active/Archived Employees + - Switch between current staff and former employees when auditing historical data. + +Insightful groupings +-------------------- + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + :widths: 40 60 + + * - Group by + - When it helps + * - Employee + - Review individual attendance records during a 1:1 meeting. + * - Department + - Compare staffing levels and working hours to determine over-working and under-working teams. + * - Manager + - Determine where attendance follow-up questions can be directed to for an employee. + * - Method + - Spot trends in attendance methods to potentially resolve hardware issues. + * - Date (Day/Week/Month) + - Identify absenteeism spikes or seasonal patterns. .. _attendances/errors: Attendance log details ----------------------- - -Odoo captures various time and location details when a user checks in and out. The specific details -provided are determined by the method the user checked in and out. +====================== -To view the specific check in and/or check out details for an employee, click on an individual entry -in the overview dashboard. - -A detailed attendance log for the user appears in a pop-up window. To close the detailed attendance -log, click the :guilabel:`Save & Close` button in the bottom-left corner of the form. +Odoo records both the time and location for every check-in and check-out, with fields varying by the +method used. These detailed attendance logs can confirm where an employee was on any given work day. +This can be useful for companies with hybrid working schedules, who may need to perform audits to +ensure proper compliance. The detailed attendance log contains the following information: Main details -~~~~~~~~~~~~ +------------ - :guilabel:`Employee`: the name of the employee. - :guilabel:`Check In`: the date and time the employee checked in. -- :guilabel:`Check Out`: the date and time the employee checked out. This only appears if the +- :guilabel:`Check Out`: the date and time the employee checked out. This **only** appears if the employee has checked out. -- :guilabel:`Worked Hours`: the total amount of time the employee logged for the day, in an hour and - minute format (HH:MM). This value calculates all the checks in and check outs for the day, if the - employee checked in and out multiple times. -- :guilabel:`Extra Hours`: any extra hours the employee logged that is beyond their expected working - hours. +- :guilabel:`Worked Time`: the total amount of time the employee logged for the day, across multiple + check-ins and outs. In an hour and minute format (HH:MM). +- :guilabel:`Worked Extra Hours`: unpaid overtime hours worked beyond the expected working schedule + (shows **only** when present for the employee). +- :guilabel:`Extra Hours`: approved overtime (the :guilabel:`Worked Time` minus the approved + :guilabel:`Worked Extra Hours`. Check in/check out details -~~~~~~~~~~~~~~~~~~~~~~~~~~ +-------------------------- The following information appears for both the :guilabel:`Check In` and :guilabel:`Check Out` sections. -- :guilabel:`Mode`: the method with which the attendance information was gathered. - :guilabel:`Systray` is displayed if the employee logged in and out :ref:`directly from the - database `, :guilabel:`Manual` is displayed if the employee logged in and - out :ref:`using an attendance kiosk `. -- :guilabel:`IP Address`: the IP address for the computer the employee used to log in or out. +- :guilabel:`Mode`: attendance submission method. Can be :ref:`Systray `, + :ref:`Kiosk `, or :guilabel:`Manual` entry. +- :guilabel:`IP Address`: the device's IP address used to log in or out. - :guilabel:`Browser`: the web browser the employee used to log in or out. -- :guilabel:`Localization`: the city and country associated with the computer's IP address. +- :guilabel:`Localisation`: the city and country associated with the computer's IP address. - :guilabel:`GPS Coordinates`: the specific coordinates when the user logged in or out. To view the - specific coordinates on a map, click the :guilabel:`→ View on Maps` button beneath the - :guilabel:`GPS Coordinates`. This opens a map in a new browser tab, with the specific location - pointed out. + specific coordinates on a map, click the :icon:`oi-arrow-right` :guilabel:`View on Maps` button + beneath the :guilabel:`GPS Coordinates`. This opens a map in a new browser tab, with the specific + location pointed out. .. image:: attendances/details.png - :align: center :alt: The detailed information for an attendance entry. -Errors ------- +Attendance errors +================= -Entries that contain an error appear on the overview dashboard in red. In the :guilabel:`Gantt -view`, the entry appears with a red background. If in the :guilabel:`List view`, the entry text -appears in red. +Entries that contain an error appear on the overview dashboard in red. In the :icon:`fa-tasks` +:guilabel:`(Gantt)` view, the entry appears with a red background. If in the :icon:`oi-view-list` +:guilabel:`(List)` view, the entry text appears in red. -An error typically occurs when an employee has checked in but has not checked out within the last -24 hours, or when an employee has a check in and check out period spanning over 16 hours. +An error occurs when an employee has checked in but not checked out within 24 hours, or when a +single check-in period exceeds 16 hours. To fix the error, the attendance entry must be modified or deleted. Click on the entry to reveal a pop-up containing the details for that particular entry. To modify the :guilabel:`Check In` and/or @@ -264,52 +283,24 @@ and a calendar selector appears. Click on the desired date, then use the time se calendar to select the specific time for the entry. When the information is correct, click :guilabel:`Apply.` -.. image:: attendances/errors.png - :align: center - :alt: The pop-up that allows for modifications to an attendance entry with an error. The calendar - selector is shown, and the time selector is highlighted. - When all the information on the pop-up is correct, click :guilabel:`Save & Close`. When the entry no longer has an error, the entry appears in gray instead of red. -To delete an entry, click :guilabel:`Remove` on the pop-up instead of making modifications to the -entry. - -Reporting -========= - -To view attendance reports, click :guilabel:`Reporting` in the top menu. The default report displays -each employee's attendance information for the past 3 months, in a :guilabel:`Line Chart`. - -The default view is a :guilabel:`Graph`. To view the data in a pivot table, click the -:guilabel:`Pivot Table` button on the top right of the report. To switch back to the graph view, -click the :guilabel:`Graph` button, located next to the :guilabel:`Pivot Table` button. - -To present different information, adjust the :ref:`filters and groups ` -in the same way as in the :guilabel:`Overview` dashboard. - -The data can be presented in either a :guilabel:`Bar Chart`, :guilabel:`Line Chart`, :guilabel:`Pie -Chart`, :guilabel:`Stacked` chart, or in :guilabel:`Descending` or :guilabel:`Ascending` order. To -change the view to any of these charts, click the corresponding button above the displayed chart. - -To change the :guilabel:`Measures`, click the :guilabel:`Measures` button and select the desired -measure from the drop-down menu. - -The report can also be inserted into a spreadsheet. Click the :guilabel:`Insert in Spreadsheet` -button and a pop-up appears. Select the desired spreadsheet, and click :guilabel:`Confirm`. - -.. image:: attendances/reporting.png - :align: center - :alt: The default report view, with all the optional view buttons highlighted. +To delete an entry, click the red :guilabel:`Delete` button on the pop-up window instead of making +modifications to the entry. .. seealso:: - :doc:`attendances/check_in_check_out` - :doc:`attendances/kiosks` + - :doc:`attendances/management` - :doc:`attendances/hardware` + - :doc:`attendances/attendance_reporting` .. toctree:: :titlesonly: attendances/check_in_check_out attendances/kiosks + attendances/management attendances/hardware + attendances/attendance_reporting diff --git a/content/applications/hr/attendances/attendance_reporting.rst b/content/applications/hr/attendances/attendance_reporting.rst new file mode 100644 index 0000000000..67cfbf4957 --- /dev/null +++ b/content/applications/hr/attendances/attendance_reporting.rst @@ -0,0 +1,96 @@ +==================== +Attendance reporting +==================== + +The **Attendances** app report helps managers find attendance issues with employees before they +become a problem. The report can give insights on trends by determining :ref:`which employees are +working more overtime `, and who is :ref:`not working their full shifts +`. + +View report +=========== + +To view the attendance report, click :guilabel:`Reporting` in the top menu. The default report +displays attendance information for current employees over the past three months, in a default +:icon:`oi-view-pivot` :guilabel:`Pivot table`. The rows are populated by employee, while the columns +are populated by the various attendance records. All entries are grouped by month. + +The columns presented are: + +- :guilabel:`Worked Hours`: The total logged time the employee worked for the month. +- :guilabel:`Expected Hours`: The number of hours the employee should have worked for the month, + calculated from their :ref:`working schedule `, configured on their employee + form. +- :guilabel:`Difference`: The difference from the :guilabel:`Expected Hours` and the + :guilabel:`Worked Hours` for the employee that month. +- :guilabel:`Balance`: The difference between the *approved* overtime, and the *total* overtime + worked. + +To present different information, adjust the :ref:`filters and groups ` +in the same way as in the :guilabel:`Overview` dashboard. + +.. image:: attendance_ reporting/reporting.png + :alt: The default report view, with all the optional view buttons highlighted. + +.. _attendances/overtime: + +Use case: monthly overtime +========================== + +Overtime affects a company's bottom line, as most companies budget for employee salaries. When +salaries exceed the expected amount, companies may see a rise in overhead costs when salary budgets +are exceeded. This is why the attendance report is needed, to ensure no excessive overtime is +logged. + +To view a specific month's overtime, by employee, click :guilabel:`Reporting` in the top menu of the +**Attendances** app. Remove the default :icon:`oi-group` :guilabel:`Date: Month > Employee` grouping +in the search bar. Click the :icon:`fa-caret-down` :guilabel:`(Toggle Search Panel)` icon at the end +of the search bar, then click :icon:`fa-caret-down` :guilabel:`Date`, and click the desired month. + +Next, click the :guilabel:`Measures` :icon:`fa-caret-down` button in the upper-left corner, and +deselect :guilabel:`Expected Hours` and :guilabel:`Worked Hours`. This presents the +:guilabel:`Difference` and :guilabel:`Balance` attendance data for the selected month, grouped by +employee. + +The :guilabel:`Difference` shows the month's total overtime logged, and the :guilabel:`Balance` +shows the portion still unapproved. Click the :guilabel:`Difference` column to sort by the amount of +overtime. The highest positive number is the most overtime logged for that month. + +.. example:: + In the below example, a total of 38 hours and 53 minutes of overtime was approved for the month + of April. :guilabel:`Michael Williams` has the most overtime, with 10 hours and 25 minutes + logged. Of that overtime, only 25 minutes was unapproved, for a total of ten paid overtime hours. + + .. image:: attendance_ reporting/overtime.png + :alt: The attendances report, showing only overtime for the month of April. + +.. _attendances/absent: + +Use case: absenteeism +===================== + +Employees with a negative :guilabel:`Difference` indicate that they have not worked their expected +shifts. This can be from forgetting to log in and out of work, or for working less hours than +expected, without any approved time off. + +To view the attendance data for the last three months, to identify any trends, first open the +**Attendances** app report. Next, click the :guilabel:`Measures` :icon:`fa-caret-down` button in the +upper-left corner, and ensure **only** :guilabel:`Difference` is selected. + +Next, reset the row data by clicking :icon:`fa-minus-square-o` :guilabel:`Total` at the top of the +rows. Then click :icon:`fa-plus-square` :guilabel:`Total` and select :guilabel:`Employee`. Click the +:guilabel:`Difference` column name to sort by the total difference in logged hours from the expected +hours. + +The employee who worked the least has the highest negative balance. Click on any of the numbers for +the employee to view the detailed individual attendance records. + +.. example:: + In the below example, the company has only been opened for two months, so data is only available + for the last two months, even though the filter :guilabel:`Last 3 Months` is active. + + From this report, it is determined that :guilabel:`Abigail Peterson` worked the least amount of + hours over the past two months, working 25 hours less than was expected. + + .. image:: attendance_ reporting/absentee.png + :alt: The attendance report showing the highest absences for the last two months. diff --git a/content/applications/hr/attendances/attendance_reporting/absentee.png b/content/applications/hr/attendances/attendance_reporting/absentee.png new file mode 100644 index 0000000000..2915791653 Binary files /dev/null and b/content/applications/hr/attendances/attendance_reporting/absentee.png differ diff --git a/content/applications/hr/attendances/attendance_reporting/overtime.png b/content/applications/hr/attendances/attendance_reporting/overtime.png new file mode 100644 index 0000000000..bd7c9f7b62 Binary files /dev/null and b/content/applications/hr/attendances/attendance_reporting/overtime.png differ diff --git a/content/applications/hr/attendances/attendance_reporting/reporting.png b/content/applications/hr/attendances/attendance_reporting/reporting.png new file mode 100644 index 0000000000..7cd56f4913 Binary files /dev/null and b/content/applications/hr/attendances/attendance_reporting/reporting.png differ diff --git a/content/applications/hr/attendances/check_in_check_out.rst b/content/applications/hr/attendances/check_in_check_out.rst index 21e220e2e8..4fc6bebd2d 100644 --- a/content/applications/hr/attendances/check_in_check_out.rst +++ b/content/applications/hr/attendances/check_in_check_out.rst @@ -2,19 +2,15 @@ Check in and out ================ -Odoo's *Attendances* application allows users, who are logged into the database, to check in and -out, without needing to go into the *Attendances* application, or use a kiosk. For smaller +Odoo's **Attendances** application allows users, who are logged into the database, to check in and +out without needing to go into the **Attendances** application, or use a kiosk. For smaller companies, where every employee is also a user, this feature may be useful. A user can check in and/or out on the main database Odoo dashboard, or while inside any application. To do so, in the upper-right corner of the top main header menu, which is always visible regardless -of what application the user is in, a :guilabel:`🔴 (red circle)` or :guilabel:`🟢 (green circle)` -is visible. Click on the colored circle to reveal the attendance widget, enabling the user to check -in and/or out. - -.. image:: check_in_check_out/top-menu.png - :align: center - :alt: Top right main menu with check in button highlighted. +of what application the user is in, a :icon:`fa-circle` :guilabel:`(red circle)` or +:icon:`fa-circle` :guilabel:`(green circle)` is visible. Click on the colored circle to reveal the +attendance widget, enabling the user to check in or out. .. _attendances/check-in: @@ -22,18 +18,17 @@ Check in ======== If the attendance widget circle is red, this indicates the user is not currently checked in. Click -the :guilabel:`🔴 (red circle)`, and the attendance widget appears, displaying a green -:guilabel:`Check in` :icon:`fa-sign-in` button. +the :icon:`fa-circle` :guilabel:`(red circle)`, and the attendance widget appears, displaying a +green :guilabel:`Check in` :icon:`fa-sign-in` button. .. image:: check_in_check_out/check-in.png - :align: center :alt: Top right main menu with check in button highlighted. -When the user checks in from the database, the *Attendances* app logs the location details for the +When the user checks in from the database, the **Attendances** app logs the location details for the user, including the IP Address and GPS coordinates. .. important:: - For the *Attendances* app to log the location details, the user must allow their computer to + For the **Attendances** app to log the location details, the user must allow their computer to access their location information. If the user has not already checked in and out during the current work day, this button is the only @@ -41,10 +36,11 @@ visible item in the widget. If the user has previously checked in and out, a :gu field appears above the button, and the total amount of time that has been logged for the day appears in that field, in an :guilabel:`HH:MM` (hours:minutes) format. -Click the :guilabel:`Check in` :icon:`fa-sign-in` button to check in. The :guilabel:`🔴 (red -circle)` in the top menu changes to green, and the widget changes appearance, as well. The widget -updates to reflect that the user has checked in, by changing the green :guilabel:`Check in` -:icon:`fa-sign-in` button to a yellow :guilabel:`Check out` :icon:`fa-sign-out` button. +Click the :guilabel:`Check in` :icon:`fa-sign-in` button to check in. The :icon:`fa-circle` +:guilabel:`(red circle)` in the top menu changes to green, and the widget changes appearance, as +well. The widget updates to reflect that the user has checked in, by changing the green +:guilabel:`Check in` :icon:`fa-sign-in` button to a yellow :guilabel:`Check out` :icon:`fa-sign-out` +button. Click anywhere on the screen to close the attendance widget. @@ -73,16 +69,14 @@ attendance widget updates again, displaying the :guilabel:`Total today` field wi while the yellow :guilabel:`Check out` :icon:`fa-sign-out` button changes to a green :guilabel:`Check in` :icon:`fa-sign-in` button. -When the user checks out from the database, the *Attendances* app logs the location details for the -user. This information is **only** logged if the user allows their computer to access this -information. +When the user checks out from the database, the **Attendances** app logs the location details for +the user. This information is logged **only** if the user grants permission. .. image:: check_in_check_out/check-in-database-message.png - :align: center :alt: The pop-up that appears when an employee checks in inside the database. .. tip:: - There is no limit to the amount of times a user can check in and check out. Users are able to - check in and out without any time elapsing (a value of 00:00). Each time an employee logs in and - out, the information is stored and appears on the main *Attendances* dashboard, including check - ins and check outs with no time value. + The number of times a user can check in and check out is unlimited. Users can check in and out + without any time elapsing (a value of 00:00). Each time an employee logs in and out, the + information is stored and appears on the main **Attendances** dashboard, including check-ins and + check-outs with no time value. diff --git a/content/applications/hr/attendances/check_in_check_out/check-in-database-message.png b/content/applications/hr/attendances/check_in_check_out/check-in-database-message.png index 57b3823d15..61ba735e6d 100644 Binary files a/content/applications/hr/attendances/check_in_check_out/check-in-database-message.png and b/content/applications/hr/attendances/check_in_check_out/check-in-database-message.png differ diff --git a/content/applications/hr/attendances/check_in_check_out/check-in.png b/content/applications/hr/attendances/check_in_check_out/check-in.png index 6c91aff654..015b7794c7 100644 Binary files a/content/applications/hr/attendances/check_in_check_out/check-in.png and b/content/applications/hr/attendances/check_in_check_out/check-in.png differ diff --git a/content/applications/hr/attendances/check_in_check_out/top-menu.png b/content/applications/hr/attendances/check_in_check_out/top-menu.png deleted file mode 100644 index 50b758ed2b..0000000000 Binary files a/content/applications/hr/attendances/check_in_check_out/top-menu.png and /dev/null differ diff --git a/content/applications/hr/attendances/details.png b/content/applications/hr/attendances/details.png index af4c777a7c..530c07a9be 100644 Binary files a/content/applications/hr/attendances/details.png and b/content/applications/hr/attendances/details.png differ diff --git a/content/applications/hr/attendances/errors.png b/content/applications/hr/attendances/errors.png deleted file mode 100644 index 07ddc62f85..0000000000 Binary files a/content/applications/hr/attendances/errors.png and /dev/null differ diff --git a/content/applications/hr/attendances/hardware.rst b/content/applications/hr/attendances/hardware.rst index 5910aa02ba..35744b6424 100644 --- a/content/applications/hr/attendances/hardware.rst +++ b/content/applications/hr/attendances/hardware.rst @@ -2,9 +2,9 @@ Hardware ======== -Employees who are **not** database users, and therefore, do **not** have access to the *Attendances* -app, must sign in and out of work using a kiosk. The following are the physical requirements for -setting up a kiosk. +Employees who are **not** database users, and therefore, do **not** have access to the +**Attendances** app, must sign in and out of work using a kiosk. The following are the physical +requirements for setting up a kiosk. Kiosk devices ============= @@ -15,7 +15,7 @@ A kiosk is a self-service station, where employees can :ref:`check in and out of only, but any device with an internet browser is able to be set up as a kiosk. A kiosk is used by navigating to the webpage specified in the :ref:`configuration -` section of the *Attendances* app. +` section of the **Attendances** app. Kiosks are set up using one of the following types of devices: @@ -24,7 +24,7 @@ Kiosks are set up using one of the following types of devices: - Mobile phone (Android or iOS) .. tip:: - Touchscreens are easy to use, and tablets and mobile phones take up less space. That's why most + Touchscreens are easy to use, and tablets and mobile phones take up less space. That is why most consider using a smaller device with a touchscreen as a kiosk. It is recommended to place kiosks on a secure stand, or mount them securely on a wall. @@ -35,14 +35,14 @@ Badges ====== Badges are a way for employees to quickly sign in and out from a kiosk, as badges are scanned by the -kiosk's camera to quickly identify the employee. +kiosk's camera to identify the employee. To generate a badge, first navigate to the :menuselection:`Employees app`. Next, click on the -desired employee card to open the employee's form, then click the :guilabel:`HR Settings` tab. +desired employee card to open the employee's form, then click the :guilabel:`Settings` tab. Under the :guilabel:`ATTENDANCE/POINT OF SALE/MANUFACTURING` section, there is a :guilabel:`Badge -ID` field. If this field is blank, click :guilabel:`Generate` at the end of the :guilabel:`Badge -ID` line, and the field is automatically populated with a new badge ID number. Then, click +ID` field. If this field is blank, click :guilabel:`Generate` at the end of the :guilabel:`Badge ID` +line, and the field is automatically populated with a new badge ID number. Then, click :guilabel:`Print Badge` at the end of the badge ID number to create a PDF file of the badge. If a badge ID number is already present on the employee form, there is no :guilabel:`Generate` @@ -54,7 +54,6 @@ that can be scanned at a kiosk to check in and out. Badges can be printed for employees using any thermal or inkjet printer. .. image:: hardware/badge.png - :align: center :alt: A badge for an employee that is created from the Employees app. .. note:: @@ -94,14 +93,5 @@ It is **required** to purchase *both* RFID key fobs and an RFID reader to use th in and out. Follow the manufacturer's directions to install the RFID reader, and set up the RFID key fob. -.. image:: hardware/rfid-reader.jpg - :align: center - :width: 50% - :alt: An RFID key fob is placed on an RFID reader. - -.. tip:: - A recommended RFID reader is the `Neuftech USB RFID Reader - `_. - .. note:: An IoT box is **not** required to use RFID key fobs. diff --git a/content/applications/hr/attendances/hardware/badge.png b/content/applications/hr/attendances/hardware/badge.png index 289dc49a66..3d34c2eb86 100644 Binary files a/content/applications/hr/attendances/hardware/badge.png and b/content/applications/hr/attendances/hardware/badge.png differ diff --git a/content/applications/hr/attendances/hardware/rfid-reader.jpg b/content/applications/hr/attendances/hardware/rfid-reader.jpg deleted file mode 100644 index 92e760b4f8..0000000000 Binary files a/content/applications/hr/attendances/hardware/rfid-reader.jpg and /dev/null differ diff --git a/content/applications/hr/attendances/kiosks.rst b/content/applications/hr/attendances/kiosks.rst index 6389d6f6e6..bb803552ea 100644 --- a/content/applications/hr/attendances/kiosks.rst +++ b/content/applications/hr/attendances/kiosks.rst @@ -2,16 +2,16 @@ Kiosks ====== -Odoo's *Attendances* app allows employees to check in and out of work directly from the database, or -from a kiosk. +Odoo's **Attendances** app allows employees to check in and out of work directly from the database +or a kiosk. A kiosk is a :doc:`dedicated device ` (a PC, tablet, or mobile phone) for employees to use when they check in and out. Kiosks are needed for employees who do **not** have access to the database. -Only employees with access to the database can check in and out from the *Attendances* app, and they -are referred to as *users*. +Only employees with access to the Odoo database can check in and out from the **Attendances** app, +and they are referred to as *users*. .. important:: If employees :ref:`check in and out ` using a badge or an RFID, @@ -21,24 +21,29 @@ are referred to as *users*. Configuration ============= -There are only a few configurations needed to use kiosks in the *Attendances* application. Navigate -to :menuselection:`Attendances app --> Configuration` to access the :guilabel:`Settings` page to -configure the :ref:`attendances/kiosk-mode` and the :ref:`attendances/kiosk-settings`. +To use kiosks in the **Attendances** application, navigate to :menuselection:`Attendances app --> +Configuration`. On the :guilabel:`Settings` page, configure the :ref:`Modes section +` and the :ref:`attendances/kiosk-settings`. Once all desired settings have been configured, click the :guilabel:`Save` button on the :guilabel:`Settings` page, to activate and enable them. .. _attendances/kiosk-mode: -Kiosk Mode section ------------------- +Modes section +------------- -Using the drop-down menu, select how an employee checks in when using a kiosk. Options are +Determine how an employee checks in when using a kiosk, either by searching for their name on the +kiosk (:guilabel:`Manual Selection`), scanning an employee ID or key fob (:guilabel:`Barcode/RFID`). +or both. + +On the settings page, using the drop-down menu for the :guilabel:`Kiosk Mode` :icon:`fa-building-o` +field in the :guilabel:`Modes` section, make the desired selection. Options are :guilabel:`Barcode/RFID`, :guilabel:`Barcode/RFID and Manual Selection`, or :guilabel:`Manual Selection`. .. note:: - The *Barcode* application **does not** need to be installed to use one of the Barcode/RFID + The **Barcode** application **does not** need to be installed to use one of the Barcode/RFID settings. .. _attendances/kiosk-settings: @@ -49,27 +54,28 @@ Kiosk Settings section The various settings in the :guilabel:`Kiosk Settings` section determine how employees check in and out with kiosks. -- :guilabel:`Barcode Source`: this setting **only** appears if one of the two *Barcode/RFID* - selections were configured for the :ref:`Kiosk Mode ` setting. +- :guilabel:`Barcode Source` :icon:`fa-building-o`: this setting **only** appears if one of the two + *Barcode/RFID* selections were configured for the :ref:`Kiosk Mode ` + setting. If available, select how barcodes are scanned at the kiosk, via one of the drop-down menu options. Barcodes can be scanned with a dedicated :guilabel:`Scanner`, or with a device's camera (:guilabel:`Front Camera` or :guilabel:`Back Camera`). +- :guilabel:`Display Time` :icon:`fa-building-o`: determine how many seconds a check-in/check-out + confirmation message remains on the kiosk screen before returning to the main check in screen. - :guilabel:`Employee PIN Identification`: tick this checkbox if employees should use a unique PIN to check in. PINs are configured on each individual employee record. Refer to the :ref:`new employee documentation ` documentation for more information on setting up PINs. -- :guilabel:`Display Time`: determine how many seconds a check-in/check-out confirmation message - remains on the kiosk screen before returning to the main check in screen. - :guilabel:`Attendance Kiosk Url`: Odoo generates a unique web address (URL) to use a device as a kiosk, without having to sign in to the Odoo database. When setting up a kiosk device, navigate to - this unique web address in a web browser to present the *Attendances* app kiosk. + this unique web address in a web browser to present the **Attendances** app kiosk. .. important:: These kiosk URLs are **not** secured with any type of access code. Anyone who has the URL can - access the *Attendances* app kiosk. If the URL is compromised for any reason, such as in the - event of a security breach, click :guilabel:`Generate a new Kiosk Mode URL`, located beneath - the link, to generate a new URL, and update the kiosk, accordingly. + access the **Attendances** app kiosk. If the URL is compromised for any reason, such as in the + event of a security breach, click :icon:`fa-refresh` :guilabel:`Generate new URL`, located + beneath the link, to generate a new URL, and update the kiosk, accordingly. Kiosk mode ========== @@ -86,17 +92,17 @@ Entering *Kiosk Mode* is **only** available for users with specific :ref:`access Mode* on any device. .. image:: kiosks/kiosk-url.png - :align: center :alt: The Attendances Kiosk URL field in the settings section of the Attendances application. -As a security measure, once a device is in *Kiosk Mode*, it is not possible to go back into the -database without signing back in. +.. important:: + As a security measure, once a device is in *Kiosk Mode*, it is not possible to go back into the + database without signing back in. .. note:: At any time, a new kiosk URL can be generated, if needed. Click the :icon:`fa-refresh` :guilabel:`Generate a new Kiosk Mode URL` -To exit *Kiosk Mode*, just close the tab in the web browser or return to the main log-in screen of +To exit *Kiosk Mode*, either close the tab in the web browser or return to the main log-in screen of Odoo. .. _attendances/kiosk-mode-entry: @@ -107,11 +113,10 @@ Check in and out with a kiosk Badge ----- -To check in or out using a badge, tap the :icon:`fa-camera` :guilabel:`Tap to scan` image in the -center of the kiosk. +To check in or out using a badge, tap the :icon:`fa-barcode` :guilabel:`Scan your badge` image in +the center of the kiosk. .. image:: kiosks/scan-badge.png - :align: center :alt: The Attendances Kiosk view displaying the scan badge image. Then, scan the barcode on the badge using the method configured in the :ref:`Kiosk Settings @@ -123,7 +128,7 @@ Once the barcode is scanned, the employee is checked in or out, and a :ref:`conf RFID ---- -To check in or out using an RFID key fob, simply scan the fob with an RFID reader. +To check in or out using an RFID key fob, scan the fob with an RFID reader. Once scanned, the employee is either checked in or checked out, and a :ref:`confirmation message ` appears with all the information. @@ -133,20 +138,20 @@ Manually Users who do not have a scannable badge, or an RFID fob, can manually check in and out at a kiosk. -Tap the :guilabel:`Identify Manually` button on the kiosk, and a screen appears with all the -employees that can be checked in or out. The *Employees* application dashboard has the same display. +Tap the :icon:`fa-user-o` :guilabel:`Identify Manually` button on the kiosk, and a screen appears +with all the employees that can be checked in or out. The **Employees** app dashboard has the same +display. Tap on a person to check them in or out, and a :ref:`confirmation message ` appears. -There are two ways to quickly find a specific person: +To find a specific person, either: -- :guilabel:`Search...`: tap on the :guilabel:`Search...` field, and enter the desired person's - name. As the name is typed in, the matching results are displayed on the screen. -- :guilabel:`Department`: tap on any desired selection in the :guilabel:`Department` section, - located on the left-side of the screen, to **only** view employees from that specific department. - The number at the end of each listed :guilabel:`Department` represents how many employees that - department has. +- Search: tap into the search bar and enter the desired person's name. As the name is typed in, the + matching results are displayed on the screen. +- By department: tap on any desired selection in the department section, located on the left side of + the screen, to **only** view employees from that specific department. The number at the end of + each listed department represents how many employees that department has. PIN ~~~ @@ -156,15 +161,13 @@ If the :guilabel:`Employee PIN Identification` checkbox was ticked in the :ref:` PIN when manually checking in or out. After the employee is selected, a number pad appears with a message. When checking in, -:guilabel:`(Employee) Welcome! Please enter your PIN to check in` appears above the numbers. When -checking out, :guilabel:`(Employee) Want to check out? Please enter your PIN to check out` appears -above the numbers. +:guilabel:`(Employee) Please enter your PIN to check in` appears above the numbers. When checking +out, :guilabel:`(Employee) Please enter your PIN to check out` appears above the numbers. Tap in the PIN using the number pad, then tap :guilabel:`OK` when done. The employee is then checked in or out, and a :ref:`confirmation message ` appears. .. image:: kiosks/enter-pin.png - :align: center :alt: The pop-up that appears when prompted to enter a pin. .. _attendances/confirmation: @@ -173,19 +176,18 @@ Confirmation message -------------------- When an employee checks in or out, a confirmation message appears, with all the check in or check -out information. When checking in, a welcome message appears, as well as the date and time of check -in. +out information. -An :guilabel:`Hours Previously Today: HH:MM` field also appears, displaying any time that has -already been logged for that employee for the day. If no time has been logged, the value displayed -is: `00:00`. Beneath the message is an :guilabel:`OK` button. +When checking in, the :guilabel:`Welcome (Employee)` message appears, along with the current date +and time. If the employee has already checked in and out that day, an :guilabel:`Hours Previously +Today: HH:MM` message also appears, showing the total hours logged earlier. -To exit the screen before the preset time in the kiosk, tap the :guilabel:`OK` button. +When checking out, :guilabel:`Goodbye (Employee)` appears, as well as the date and time of check +out. Beneath the message is an :guilabel:`Hours Today: HH:MM` field, with the total hours and +minutes logged for the day. -When checking out, the screen displays a goodbye message, with the date and time of check out, and -the total hours logged for the day. Beneath the message is a :guilabel:`Goodbye` button. To exit the -screen before the preset time, tap the :guilabel:`Goodbye` button. +Beneath both the "welcome" and "goodbye" messages is an :guilabel:`OK` button. To exit the screen +before the preset time in the kiosk, tap the :guilabel:`OK` button. .. image:: kiosks/goodbye-message.png - :align: center :alt: The goodbye message with all the employee's check out information. diff --git a/content/applications/hr/attendances/kiosks/enter-pin.png b/content/applications/hr/attendances/kiosks/enter-pin.png index 59382558bf..e8ca8cd39a 100644 Binary files a/content/applications/hr/attendances/kiosks/enter-pin.png and b/content/applications/hr/attendances/kiosks/enter-pin.png differ diff --git a/content/applications/hr/attendances/kiosks/goodbye-message.png b/content/applications/hr/attendances/kiosks/goodbye-message.png index fd688a9b40..8057f09e46 100644 Binary files a/content/applications/hr/attendances/kiosks/goodbye-message.png and b/content/applications/hr/attendances/kiosks/goodbye-message.png differ diff --git a/content/applications/hr/attendances/kiosks/kiosk-url.png b/content/applications/hr/attendances/kiosks/kiosk-url.png index d706f2ce4c..6be226ff5c 100644 Binary files a/content/applications/hr/attendances/kiosks/kiosk-url.png and b/content/applications/hr/attendances/kiosks/kiosk-url.png differ diff --git a/content/applications/hr/attendances/kiosks/scan-badge.png b/content/applications/hr/attendances/kiosks/scan-badge.png index 2d819048f3..a03c580a4e 100644 Binary files a/content/applications/hr/attendances/kiosks/scan-badge.png and b/content/applications/hr/attendances/kiosks/scan-badge.png differ diff --git a/content/applications/hr/attendances/management.rst b/content/applications/hr/attendances/management.rst new file mode 100644 index 0000000000..4a6100e5f1 --- /dev/null +++ b/content/applications/hr/attendances/management.rst @@ -0,0 +1,126 @@ +=========================== +Work approvals and overtime +=========================== + +Odoo's **Attendances** app requires management oversight in order to ensure all logged attendances +are correct, especially overtime hours and incomplete shifts. + +.. _attendances/dashboard: + +Management dashboard +==================== + +All attendance records that require approval, typically due to overlapping work entries or +unapproved time off, are managed from a centralized management dashboard. To access this, navigate +to :menuselection:`Attendances app --> Management`. + +The :guilabel:`Management` dashboard only displays attendance records for current employees that +need to be approved, in a default list view. This is due to the two default filters in the search +bar, the :guilabel:`To Approve` and :guilabel:`Active Employees`. + +Each attendance record displays the following information: + +- :guilabel:`Employee`: the name of the employee +- :guilabel:`Check In`: the date and time the employee checked in +- :guilabel:`Check Out`: the date and time the employee checked out +- :guilabel:`Worked Time`: the number of worked hours the employee logged +- :guilabel:`Worked Extra Hours`: the amount of overtime worked +- :guilabel:`Extra Hours`: the total extra hours logged +- :guilabel:`Overtime Status`: the status of the attendance record. All attendance records that + appear on this dashboard have a status of :guilabel:`To Approve`. + +.. image:: management/management-dashboard.png + :alt: The Attendances app Management dashboard, displaying entries needing approval. + +.. _attendances/approve-refuse: + +Approvals and refusals +====================== + +Attendance records can be approved and refused directly from the :ref:`Management dashboard +`. At the far-right of each record, :icon:`fa-check` :guilabel:`Approve` and +:icon:`fa-times` :guilabel:`Refuse` buttons appear. Click the corresponding button to either approve +or refuse the logged attendance record. + +.. note:: + When approving or refusing attendance records from the :guilabel:`Management` dashboard, it is + **not** possible to view the details of the attendance record. + +Partial approvals +----------------- + +It is possible to approve a portion of the logged :guilabel:`Extra Hours` and not the full amount. +To approve only a portion of overtime, click into an attendance record to view the details. + +Click into the :guilabel:`Extra Hours` field and enter the amount of hours being approved. After +editing the :guilabel:`Extra Hours field`, the :guilabel:`Worked Extra Hours` field becomes visible +to display the difference between the :guilabel:`Worked Time` and :guilabel:`Extra Hours` fields. + +.. note:: + The :guilabel:`Worked Time` field is the total hours the employee logged (the :guilabel:`Worked + Time` and :guilabel:`Extra Hours` combined). For example, if an employee is scheduled to work + eight hours, and worked five extra hours, the :guilabel:`Worked Time` is thirteen hours, and the + :guilabel:`Extra Hours` is five hours. The :guilabel:`worked Time` field **cannot** be modified. + +Click :icon:`fa-check` :guilabel:`Approve` to approve the updated :guilabel:`Extra Hours`. Once +partially approved, the :guilabel:`Worked Extra Hours` field disappears, along with the +:icon:`fa-check` :guilabel:`Approve` button. The difference in hours appears in the :guilabel:`Extra +Hours` field. + +Once overtime hours are partially approved, the status changes to :guilabel:`Approved`. + +.. image:: management/record.png + :alt: A detailed attendance record. + +.. important:: + Once partial overtime is approved, it is still possible to deny overtime by clicking + :icon:`fa-times` :guilabel:`Refuse`. The record can be modified as many times as needed. + +.. note:: + Occasionally, verifying an employee's location when checking-in may be needed. The method the + employee checked-in to work is found on the individual record, in the :guilabel:`Mode` field. + + The :guilabel:`Mode` field is not modifiable, as it only log the method the attendance record was + created. + + The possible options are: + + - :guilabel:`Kiosk`: the employee physically checked in or out using a :doc:`kiosk ` + device. The employee was present at the kiosk to check-in. + - :guilabel:`Systray`: the employee checked in or out :doc:`directly from the database + `. Depending on the :guilabel:`IP Address` displayed on the detailed + attendance record, the employee's location at the time of check-in can be determined. + - :guilabel:`Manual`: the record was created manually in the **Attendances** app. This is + typically done by management, to add a missing record. + +Create attendance records +========================= + +When necessary, users with the required :ref:`access rights ` are able to +create attendance records manually in the **Attendances** app. Some situations requiring this is +when employees forget to check in and out for shifts, as employees cannot retroactively create +attendance records. + +To add a missing attendance record, navigate to :menuselection:`Attendances app --> Overview`. Click +the :guilabel:`New` button in the upper-left corner. In the :guilabel:`Create` pop-up window, enter +the following information on the form: + +- :guilabel:`Employee`: select the employee the record is being created for. The signed-in user + populates this field, by default. +- :guilabel:`Check In`: using the calendar modal, select the check in date and time, then click + :icon:`fa-check` :guilabel:`Apply`. By default, the current date is selected, and the time is set + to `00:00:00`. +- :guilabel:`Check Out`: using the calendar modal, select the check out date and time, then click + :icon:`fa-check` :guilabel:`Apply`. By default, the following date is selected, and the time is + set to `00:00:00`. +- :guilabel:`Worked Time`: this field is automatically populated with the difference from the + selected :guilabel:`Check In` and :guilabel:`Check Out` times. This field **cannot** be modified. +- :guilabel:`Extra Hours`: enter the number of overtime hours, if any, to be approved. + +.. important:: + Once :guilabel:`Extra Hours` are added, they are automatically approved by the system. However, + it is possible to manually refuse them, as explained in the :ref:`Approvals and Refusals + ` section. + +.. image:: management/new-record.png + :alt: An Attendances app record form, filled out for Doris Cole for April 23, 2025. diff --git a/content/applications/hr/attendances/management/management-dashboard.png b/content/applications/hr/attendances/management/management-dashboard.png new file mode 100644 index 0000000000..bfd6cc9296 Binary files /dev/null and b/content/applications/hr/attendances/management/management-dashboard.png differ diff --git a/content/applications/hr/attendances/management/new-record.png b/content/applications/hr/attendances/management/new-record.png new file mode 100644 index 0000000000..56c855e595 Binary files /dev/null and b/content/applications/hr/attendances/management/new-record.png differ diff --git a/content/applications/hr/attendances/management/record.png b/content/applications/hr/attendances/management/record.png new file mode 100644 index 0000000000..f550e030fc Binary files /dev/null and b/content/applications/hr/attendances/management/record.png differ diff --git a/content/applications/hr/attendances/overview.png b/content/applications/hr/attendances/overview.png index eaf8a2a905..ce2a6edbd5 100644 Binary files a/content/applications/hr/attendances/overview.png and b/content/applications/hr/attendances/overview.png differ diff --git a/content/applications/hr/attendances/reporting.png b/content/applications/hr/attendances/reporting.png deleted file mode 100644 index 6e5d797dcd..0000000000 Binary files a/content/applications/hr/attendances/reporting.png and /dev/null differ diff --git a/content/applications/hr/employees.rst b/content/applications/hr/employees.rst index dee8e9223f..3ebf52e47e 100644 --- a/content/applications/hr/employees.rst +++ b/content/applications/hr/employees.rst @@ -1,19 +1,130 @@ -:nosearch: :show-content: -:show-toc: ========= Employees ========= -Odoo *Employees* organizes a company's employee records, contracts, and departments. +Odoo **Employees** centralizes :doc:`personnel files `, employment +:doc:`contracts `, and :doc:`departmental hierarchies ` in +one system. Properly configuring its settings ensures the dashboard shows each employee's real-time +attendance and work location—data that drives payroll accuracy, capacity planning, and compliance +reporting. + +.. cards:: + + .. card:: New employees + :target: employees/new_employee + + Set up new employee records. + + .. card:: Departments + :target: employees/departments + + Create and manage the departments employees are a part of. + + .. card:: Contracts + :target: payroll/contracts + + Manage and create employee contracts. + + .. card:: Certifications + :target: employees/certifications + + Certify employees as subject matter experts with certifications. + + .. card:: Badges + :target: employees/badges + + Grant badges to employees for performance and achievements. + + .. card:: Equipment + :target: employees/equipment + + Manage and track employee equipment. + + .. card:: Offboarding + :target: employees/offboarding + + Take care of employee records when collaboration ends. + + .. card:: Employee retention report + :target: employees/retention_report + + Gain insight to the retention rate for a company. + +.. _employees/settings: + +Settings +======== + +To view and configure the available settings, navigate to :menuselection:`Employees app --> +Configuration --> Settings`. + +Employees +--------- + +- :guilabel:`Presence Display`: select how the employee's availability status is calculated. + + - :guilabel:`Based on attendances`: marked available when :ref:`checked into ` + the **Attendances** app. + - :guilabel:`Based on user status in system`: marked available when the :doc:`employee logs in to + Odoo `. + +- :guilabel:`Advanced Presence Control`: when enabled, presence status can be calculated from + operational signals rather than check-ins or logins: + + - :guilabel:`Based on number of emails sent`: an employee is marked present if they send at least + # emails per hour; otherwise, they are marked absent. Enter the minimum number of emails that + must be sent in the :guilabel:`Sent Emails` field. + - :guilabel:`Based on IP Address`: an employee is marked present only when connected from one of + the specified corporate IP addresses. Enter the IP addresses in the :guilabel:`IP Addresses` + field, separating each address with a comma. + +- :guilabel:`Skills Management`: enable this option to display the :ref:`resumé tab ` + on employee profiles. This allows for the display of :ref:`work experience `, + :ref:`skills `, and :doc:`certifications `. +- :guilabel:`Remote Work`: enable this option to allow for a detailed schedule to appear on the + employee form, in the :ref:`Work Information ` tab. When enabled, the + specific location can be set for each working day for the employee. The corresponding icon is + displayed in the upper-right corner of the employee card, indicating their location by icon, and + status by color. + + .. example:: + A green :icon:`fa-home` :guilabel:`(home)` icon indicates the employee is working from home + that day. A :icon:`fa-building` :guilabel:`(building)` icon means the employee is scheduled to + work at the office. + + The *color* of the icon indicates the employee's status, with green indicating present, yellow + indicating absent, and gray indicating it is outside of the employee's working hours. + + .. image:: employees/presence.png + :alt: Two employee Kanban cards displaying their working location and status. + +Work organization +----------------- + +Using the drop-down menu, select the default :guilabel:`Company Working Hours`. The default options +are :guilabel:`Standard 40 hours/week`, :guilabel:`Appointment Resource Default Calendar`, and +:guilabel:`Standard 32 hours/week (4 work days, friday free)`. + +The available working hours listed are the same as the configured :ref:`working schedules +` in the **Payroll** app. Working hours can be created and modified from both +the **Payroll** and **Employees** apps. + +Employee update rights +---------------------- + +Enable the :guilabel:`Employee Editing` option to allow employees to edit their own data on their +employee record. .. toctree:: :titlesonly: employees/new_employee + employees/onboarding employees/departments employees/certifications + employees/badges employees/equipment employees/offboarding employees/retention_report diff --git a/content/applications/hr/employees/badges.rst b/content/applications/hr/employees/badges.rst new file mode 100644 index 0000000000..5edc981a59 --- /dev/null +++ b/content/applications/hr/employees/badges.rst @@ -0,0 +1,85 @@ +====== +Badges +====== + +In Odoo, employees can earn badges, either automatically through :doc:`challenges created in the CRM +app <../../sales/crm/optimize/gamification>`, through **eLearning** courses, or manually, as +managers decide to award them. + +Badges are a way to gamify the work day, can be created for any reason, and can be granted to any +user. + +.. important:: + Badges can **only** be awarded to :doc:`users of the database <../../general/users>`, *and* if + the **eLearning** app is installed. + +View available badges +===================== + +To view the available badges that are configured by default, navigate to :menuselection:`Employees +app --> Configuration --> Badges`. + +All badges appear in a default Kanban view, with the badge's :guilabel:`Name` and image displayed. +Additionally, the number of users awarded the badge for both the current month, and in total, +appears, along with the badge description, and the avatar for each user who received the badge. + +Each badge has a :guilabel:`Grant` button to :ref:`award the badge ` from the +:guilabel:`Badges` dashboard. + +.. image:: badges/badges.png + :alt: All the available badges, on the Badges dashboard. + +Create badges +============= + +Badges can be created in the database when the default badges are not sufficient. This can be done +from the :guilabel:`Badges` dashboard in the **Employees** app, or from the **CRM** app. + +To add a badge in the **Employees** app, first navigate to :menuselection:`Employees app --> +Configuration --> Badges`, then click the :guilabel:`New` button in the upper-left corner. + +Fill out the badge form as outlined in the :ref:`CRM documentation `. + +.. seealso:: + :ref:`CRM Gamification ` + +View employee badges +==================== + +To view badges awarded to an employee, open the **Employees** app, and click on an employee record. +Click on the :guilabel:`Received Badges` tab to view any awarded badges. + +.. note:: + If this tab is not visible, it means there is no :guilabel:`Related User` in the + :guilabel:`Settings` tab. Once a user is populated in the :guilabel:`Related User` field, the + :guilabel:`Badges` tab appears. + +.. _employees/grant_badge: + +Grant badges +============ + +To grant a badge to an employee, open the employee record, and click into the :guilabel:`Received +Badges` tab. Click the :guilabel:`Grant a Badge` button to load a :guilabel:`Reward Employee` pop-up +window. + +Using the drop-down menu, select the badge being awarded in the :guilabel:`What are you thankful +for?` field. The default options are :guilabel:`Good Job`, :guilabel:`Problem Solver`, and +:guilabel:`Brilliant`. + +.. note:: + Additional options appear (e.g., :guilabel:`Get Started`, :guilabel:`Power user`, + :guilabel:`community Hero`) which are associated with challenges. These are automatically granted + through completed challenges. While these can be awarded at any time, it is advised to grant + badges manually that are *not* associated with a challenge. + +Next, enter a brief summary of why the badge is being granted in the field displaying +:guilabel:`Describe what they did and why it matters (will be public)` field. Last, click the +:guilabel:`Reward Employee` button, and the badge is awarded, and is visible in the +:guilabel:`Badges` tab. + +.. note:: + Users cannot grant themselves badges. An error message appears if attempted. + +.. image:: badges/badge.png + :alt: The 'Reward Employee' field populated. diff --git a/content/applications/hr/employees/badges/badge.png b/content/applications/hr/employees/badges/badge.png new file mode 100644 index 0000000000..b7dd34cc2f Binary files /dev/null and b/content/applications/hr/employees/badges/badge.png differ diff --git a/content/applications/hr/employees/badges/badges.png b/content/applications/hr/employees/badges/badges.png new file mode 100644 index 0000000000..dc03003014 Binary files /dev/null and b/content/applications/hr/employees/badges/badges.png differ diff --git a/content/applications/hr/employees/certifications.rst b/content/applications/hr/employees/certifications.rst index f05608b5a1..b4a48208d3 100644 --- a/content/applications/hr/employees/certifications.rst +++ b/content/applications/hr/employees/certifications.rst @@ -5,11 +5,12 @@ 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. +When jobs require specific knowledge, track employee certifications (e.g., classes, tests, seminars) +to verify required skills. Odoo accepts any certification type without restriction. .. important:: - To access the *Employee Certifications* report, the **Surveys** app **must** be installed. + To add certifications to an employee profile, and to access the *Employee Certifications* report, + the **Surveys** app **must** be installed. View certifications =================== @@ -28,18 +29,17 @@ following: 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. +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 ` appear on the :guilabel:`Employee Certifications` report. All other certifications appear in the resume section of the - :doc:`employee form `. + :ref:`employee form `. View certifications by expiration status ---------------------------------------- @@ -49,19 +49,18 @@ determine which employees need to keep necessary certifications current in the d 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. +the :icon:`fa-caret-down` :guilabel:`(Toggle Search Panel)` icon in the search bar, then click +:guilabel:`Add Custom Group` :icon:`fa-caret-down`, 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. +Filter certifications by expiration status to identify certifications expiring soon, and identify +employees who must renew. .. image:: certifications/status.png - :align: center :alt: The list of employee certifications, grouped by status. .. _employees/certifications-form: @@ -78,40 +77,61 @@ information on the form: 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"`. + :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 `. + section of the *Resume* tab on the :doc:`employee form `. Experience entries are + typically previous jobs or internships. - :guilabel:`Education`: Select this option to have the certification appear in the *Education* section of the *Resume* tab on the :doc:`employee form `. + - :guilabel:`Social Media`: Select this option to have the certification appear in the *Social + Media* section of the *Resume* tab on the :doc:`employee form `. Social Media + entries typically relate to certifications relating to digital marketing, social media + management, and specific trainings from social media platforms. - :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 `. + Internal certifications entries are tied to courses, training, or programs created by the + company, that once completed, have a certification associated with it. - :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 - `. + the *Completed Internal Training* section of the *Resume* tab on the :doc:`employee form + `. Completed internal training entries are typically associated with trainings + created by the company, for company-specific processes. These do not result in any + certifications, but are logged on the employee profile to indicate completed training. - :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:`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 corresponding **Surveys** app certification the + employee took. This field **only** appears if the **Surveys** app is installed. - :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. + field. Using the drop-down menu, select the corresponding **eLearning** course the employee took. + This field **only** appears if the **eLearning** app is installed. - :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 +.. image:: certifications/cybersecurity.png :alt: A certification form filled out for an OSHA certificate for construction. + +.. note:: + Once a certification is logged for an employee, a new certification of the *same type* (i.e. + :guilabel:`Education` or :guilabel:`Internal Certification`) can be added directly from the + employee form, instead of the :guilabel:`Employee Certifications` dashboard. + + In the main **Employees** app dashboard, click on an employee profile to open their employee + form. In the :guilabel:`RESUME` tab, click the :guilabel:`ADD` button at the end of the + corresponding certification line. + + This :guilabel:`ADD` button **only** appears on employee profiles that already have a + certification. diff --git a/content/applications/hr/employees/certifications/cybersecurity.png b/content/applications/hr/employees/certifications/cybersecurity.png new file mode 100644 index 0000000000..d8a5f5e528 Binary files /dev/null and b/content/applications/hr/employees/certifications/cybersecurity.png differ diff --git a/content/applications/hr/employees/certifications/osha.png b/content/applications/hr/employees/certifications/osha.png deleted file mode 100644 index 601463b618..0000000000 Binary files a/content/applications/hr/employees/certifications/osha.png and /dev/null differ diff --git a/content/applications/hr/employees/departments.rst b/content/applications/hr/employees/departments.rst index 60144e4dd4..3ece0d3d8c 100644 --- a/content/applications/hr/employees/departments.rst +++ b/content/applications/hr/employees/departments.rst @@ -2,40 +2,41 @@ Departments =========== -All employees in the *Employees* app fall under specific departments within a company. +All employees in the **Employees** app fall under specific departments within a company. + +.. _employee/create-departments: Create new departments ====================== -To make a new department, navigate to :menuselection:`Employees app --> Departments`, then click -:guilabel:`New` in the top-left to reveal a blank department form. Fill out the following -information on the department form: - -.. image:: departments/department-form.png - :align: center - :alt: The department for with all fields filled out. +To make a new department, navigate to :menuselection:`Employees app --> Departments`, then click the +:guilabel:`New` button in the top-left corner to reveal a blank department form. Fill out the +following information on the department form: - :guilabel:`Department Name`: enter a name for the department. - :guilabel:`Manager`: using the drop-down menu, select the department manager. - :guilabel:`Parent Department`: if the new department is housed within another department (has a parent department), select the parent department using the drop-down menu. -- :guilabel:`Custom Appraisal Templates`: if employees in this department require a specific - appraisal form that is different from the default appraisal form, tick the checkbox. If this - option is activated, an :guilabel:`Appraisal Templates` tab appears below the form. This field - **only** appears if the *Appraisals* app is installed. -- :guilabel:`Company`: using the drop-down menu, select the company the department is part of. +- :guilabel:`Company`: using the drop-down menu, select the company the department is part of. This + field only appears in a multi-company database. +- :guilabel:`Color`: select a color for the department. Click the colored box to display all the + color options. Click on a color to select it. +- :guilabel:`Appraisal Templates`: using the drop-down menu, select the appraisal form to be used + for all employee appraisals within this department. If a new appraisal is desired, enter the name + for the appraisal, then click :guilabel:`Create and edit...` to modify the new appraisal form. + This field **only** appears if the **Appraisals** app is installed. - :guilabel:`Appraisal Survey`: using the drop-down menu, select the default survey to use for the - department when requesting feedback from employees. This field **only** appears if the - *Appraisals* app is installed, **and** the *360 Feedback* option is enabled in the settings. -- :guilabel:`Color`: select a color for the department. Click the default white color box to display - all the color options. Click on a color to select it. -- :guilabel:`Appraisal Templates` tab: this tab **only** appears if the :guilabel:`Custom Appraisal - Templates` options is activated on the form. Make any desired edits to the appraisal form. The - appraisal form is used for appraisals for all employees within this department. + department when requesting feedback from employees within the department. The default options are + :guilabel:`Employee Opinion Form`, :guilabel:`360 Feedback`, and :guilabel:`Employee Appraisal Form`. + This field **only** appears if the **Appraisals** app is installed, *and* the *360 Feedback* + option is enabled in the settings. After the form is completed, click the :icon:`fa-cloud-upload` :guilabel:`(cloud upload)` icon to -manually save the changes. When saved, a :guilabel:`Department Organization` chart appears in the -top-right of the department card. +manually save the changes. When saved, a :guilabel:`DEPARTMENT ORGANIZATION` chart appears in the +top-right of the department card, illustrating where the department lies in the organization. + +.. image:: departments/department-form.png + :alt: The department for with all fields filled out. .. note:: The form auto-saves while data is entered, however the :guilabel:`Department Organization` chart @@ -44,27 +45,33 @@ top-right of the department card. :guilabel:`Departments` dashboard. .. seealso:: - Refer to the :doc:`../appraisals` documentation for more information. + :doc:`../appraisals` Departments dashboard ===================== To view the currently configured departments, navigate to :menuselection:`Employees app --> -Departments`. All departments appear in a Kanban view, by default, and are listed in alphabetical -order. +Departments`. All departments appear in a Kanban view, and are listed in alphabetical order. + +The default view for the :guilabel:`Departments` dashboard is a :ref:`Kanban view +`. It is possible to view the departments in two other forms: a +:ref:`list view ` and a :ref:`hierarchy view +`. .. image:: departments/departments.png - :align: center :alt: The departments dashboard view with all the department cards in a Kanban view. +.. _employees/department-kanban: + Kanban view ----------- -Each department has its own Kanban card on the main :guilabel:`Departments` :icon:`oi-view-kanban` -:guilabel:`(Kanban)` dashboard view, that can display the following information: +Each department has its own Kanban card on the main :guilabel:`Departments` dashboard. Each +department card displays the following information, if available: -- Department name: the name of the department. -- Company: the company the department is part of. +- :guilabel:`Name`: the name of the department. +- :guilabel:`Manager`: the name and image of the department manager. +- :guilabel:`Company`: the company the department is part of, including the location icon. - :guilabel:`Employees`: the number of employees within the department. - :guilabel:`Appraisals`: the number of appraisals scheduled for employees in the department. - :guilabel:`Time Off Requests`: the number of unapproved time off requests for employees in the @@ -74,21 +81,19 @@ Each department has its own Kanban card on the main :guilabel:`Departments` :ico department :ref:`awaiting approval `. This **only** appears if there are requests to approve. - :guilabel:`New Applicants`: the number of :ref:`new applicants ` for a position - in this department. This **only** appears if there are new applicants. + within the department. This **only** appears if there are new applicants. - :guilabel:`Expense Reports`: the number of employees in the department with :doc:`open expense reports to approve <../../finance/expenses/approve_expenses>`. This **only** appears if there are any expense reports waiting for approval. -- :guilabel:`Absence`: the number of absences for the current day. +- :guilabel:`Absence`: the number of employees with approved time off for the current day. - Color bar: the selected color for the department appears as a vertical bar on the left side of the department card. .. note:: Click on an alert in a department card, such as :guilabel:`Time Off Requests`, to reveal a list - view of the requests to approve. This list includes **all** open requests to approve, not just - from the specific department. + view of the requests to approve for that department -The default view for the :guilabel:`Departments` dashboard is a Kanban view. It is possible to view -the departments in two other forms: a list view and a hierarchy view. +.. _employees/department-list: List view --------- @@ -101,51 +106,29 @@ in the top-right corner. The departments appear in a list view, which displays t The departments are sorted alphabetically by :guilabel:`Department Name`, by default. .. image:: departments/list.png - :align: center :alt: The departments presented in a list view. -.. tip:: - When in list view, departments can be managed in batch by selecting one or multiple record's - checkbox, then select the :icon:`fa-cog` :guilabel:`Actions` button to reveal a drop-down menu of - actions. +.. _employees/department-hierarchy: Hierarchy view -------------- To view the departments in a hierarchy view, click the :icon:`fa-share-alt fa-rotate-90` -:guilabel:`(hierarchy)` icon in the top-right corner. The departments appear in an organizational -chart format, with the highest-level department at the top (typically :guilabel:`Management`), and +:guilabel:`(Hierarchy)` icon in the top-right corner. The departments appear in an organizational +chart format, with the highest-level department at the top (typically `Executive Management`), and all other departments beneath it. All child departments of the first-level child departments are folded. Each department card displays the :guilabel:`Department Name`, the :guilabel:`Manager` (and their -profile image), the :guilabel:`Number of Employees` in the department, and the ability to expand the -department (:guilabel:`Unfold`) if there are child departments beneath it. +profile image), the :guilabel:`Number of Employees` in the department, and the number of any child +departments. Click the :guilabel:`Unfold` button on a department card to expand it. Once expanded, the :guilabel:`Unfold` button changes to a :guilabel:`Fold` button. To collapse the department, click the :guilabel:`Fold` button. Only **one** department *per row* can be unfolded at a time. Click anywhere on a department card to open the department form. Click the :guilabel:`(#) Employees` -smart button to view a list of all the employees in that department, including all employees in the -child departments beneath it, organized by individual department. - -.. example:: - In the hierarchy view, if the :guilabel:`(2) Employees` button on the :guilabel:`Management` card - is clicked (the highest-level department card), **all** employees appear in a list view, grouped - by department. This is because **all** departments are children of the :guilabel:`Management` - department. - - If the :guilabel:`(3) Employees` button in the :guilabel:`Sales` department card is clicked, the - employees from the :guilabel:`Sales` department, as well as its two child departments - (:guilabel:`East Coast Territory` and :guilabel:`West Coat Territory`), appear in the list. - - .. image:: departments/hierarchy.png - :align: center - :alt: The departments presented in a hierarchy view. - - .. image:: departments/employee-list.png - :align: center - :alt: The list view of employees for the department that was clicked, including all child - departments. +smart button to view a list of all the employees in that department. +.. image:: departments/hierarchy.png + :alt: The departments presented in a hierarchy view. diff --git a/content/applications/hr/employees/departments/department-form.png b/content/applications/hr/employees/departments/department-form.png index ab79d504e2..654b729096 100644 Binary files a/content/applications/hr/employees/departments/department-form.png and b/content/applications/hr/employees/departments/department-form.png differ diff --git a/content/applications/hr/employees/departments/departments.png b/content/applications/hr/employees/departments/departments.png index 95ffbd662b..c128f04ee8 100644 Binary files a/content/applications/hr/employees/departments/departments.png and b/content/applications/hr/employees/departments/departments.png differ diff --git a/content/applications/hr/employees/departments/employee-list.png b/content/applications/hr/employees/departments/employee-list.png deleted file mode 100644 index d68742fb5a..0000000000 Binary files a/content/applications/hr/employees/departments/employee-list.png and /dev/null differ diff --git a/content/applications/hr/employees/departments/hierarchy.png b/content/applications/hr/employees/departments/hierarchy.png index 5342d4b0c7..5d3abf2cf1 100644 Binary files a/content/applications/hr/employees/departments/hierarchy.png and b/content/applications/hr/employees/departments/hierarchy.png differ diff --git a/content/applications/hr/employees/departments/list.png b/content/applications/hr/employees/departments/list.png index 6fe3df7e1f..5e2abd4655 100644 Binary files a/content/applications/hr/employees/departments/list.png and b/content/applications/hr/employees/departments/list.png differ diff --git a/content/applications/hr/employees/equipment.rst b/content/applications/hr/employees/equipment.rst index 0ad0feda95..015274d7d4 100644 --- a/content/applications/hr/employees/equipment.rst +++ b/content/applications/hr/employees/equipment.rst @@ -8,7 +8,7 @@ of important information regarding the equipment, such as serial numbers, warran maintenance history. .. note:: - To track employee equipment, the :guilabel:`Maintenance` app *must* be installed. + To track employee equipment, the **Maintenance** app *must* be installed. .. _employees/equipment: @@ -24,13 +24,16 @@ a number indicating how many, if any, items are currently assigned to that emplo Click the :icon:`fa-cubes` :guilabel:`Equipment Count` smart button, and all equipment currently assigned to the employee appears in individual Kanban cards. -Each Kanban card displays the name and brand of the equipment on the first line, the serial number, -and the employee's name. Any current maintenance requests appear at the bottom of the card in a red -box. +Each Kanban card displays the equipment's name and model on the first line, followed by the serial +number (if available), and lastly, the employee's name. Any current maintenance requests appear at +the bottom of the card in a red box. .. image:: equipment/equipment.png :alt: A Kanban view of all equipment for an employee. +.. note:: + A serial number is **not** required when logging equipment. + All employee equipment ====================== @@ -38,18 +41,19 @@ To view all equipment for all employees, start on the :ref:`equipment record of employee `. .. note:: - It does not matter what employee is selected, as this is just to get to the :guilabel:`Equipment` - list. + It does not matter what employee is selected, or whether they have any equipment assigned to + them. This step is only used to get to the :guilabel:`Equipment` list. In the Kanban view of the employee's equipment, clear the default :guilabel:`Assigned Employee` filter in the search bar. This presents *all* equipment in the database, including those assigned to individual employees and whole departments. -Click into the search bard, and select :guilabel:`Employee` in the :icon:`oi-group` :guilabel:`Group -By` column. The equipment is now organized in a Kanban view, organized by employee. +Click into the search bar, and select :guilabel:`Employee` in the :icon:`oi-group` :guilabel:`Group +By` column. The equipment is now organized in a Kanban view, by employee. -In the Kanban view displaying all employee equipment records, equipment can be quickly reassigned. -Click and drag an equipment card to the desired employee to change ownership of the equipment. +In the Kanban view displaying all employee equipment records, equipment can be reassigned by +clicking and dragging an equipment card to the desired employee. This changes ownership of the +equipment. .. image:: equipment/all-equipment.png :alt: A Kanban view of all equipment for all employees. diff --git a/content/applications/hr/employees/new_employee.rst b/content/applications/hr/employees/new_employee.rst index f49e816228..ae2cae68a7 100644 --- a/content/applications/hr/employees/new_employee.rst +++ b/content/applications/hr/employees/new_employee.rst @@ -6,7 +6,9 @@ When a new employee is hired, the first step is to create a new employee record. centralized place where all important information about the employee is stored, including :ref:`general information `, :ref:`job history and skills `, :ref:`various work information `, :ref:`personal -details `, :ref:`documents `, and more. +details `, :ref:`payroll-related information `, and +various :ref:`settings ` that affect integrations with other apps in the +database. To begin, open the :menuselection:`Employees` app, then click the :guilabel:`New` button in the upper-left corner. Doing so reveals a blank employee form. @@ -14,12 +16,11 @@ upper-left corner. Doing so reveals a blank employee form. Proceed to fill out the required information, along with any additional details. .. image:: new_employee/new-employee-form.png - :align: center :alt: Create a new employee form with all fields filled out. .. note:: The current company phone number and name are populated in the :guilabel:`Work Phone` and - :guilabel:`Company` fields. If the *Appraisals* application is installed, the :guilabel:`Next + :guilabel:`Company` fields. If the **Appraisals** application is installed, the :guilabel:`Next Appraisal Date` field is populated with a date six months from the current date. .. _employees/general-info: @@ -27,31 +28,17 @@ Proceed to fill out the required information, along with any additional details. General information =================== -The employee form automatically saves as data is entered. However, the form can be saved manually at -any time by clicking the :guilabel:`Save manually` option, represented by a :guilabel:`(cloud with -an upwards arrow)` icon. +Fill out the following employee details. -Required fields ---------------- - -- :guilabel:`Employee's Name`: enter the employee's name. -- :guilabel:`Company`: from the drop-down menu in this field, select the company the new employee - was hired by, or create a new company by typing the name in the field, and clicking - :guilabel:`Create` or :guilabel:`Create and edit...` from the mini drop-down menu that appears. - -.. image:: new_employee/employee-new.png - :align: center - :alt: A new employee form with the required fields highlighted. - -Optional fields ---------------- +.. tip:: + The employee form automatically saves as data is entered. However, the form can be saved manually + at any time by clicking the :icon:`fa-cloud-upload` :guilabel:`(Save manually)` icon. -- :guilabel:`Photo`: in the top-right image box of the employee form, click on the :guilabel:`✏️ - (pencil)` edit icon to select a photo to upload. -- :guilabel:`Job Position`: enter the employee's job title under their name, or select it from the - :guilabel:`Job Position` field drop-down menu below to have this top field auto-populate. The - :guilabel:`Job Position` field under the employee name can be modified, and does *not* need to - match the selection made in the :guilabel:`Job Position` drop-down menu in the field below. +- :guilabel:`Employee's Name`: enter the employee's name. This field is required. +- :guilabel:`Job Position`: this field appears below the employee name and can be filled in + manually. Alternatively, select a position from the drop-down menu in the :guilabel:`Job Position` + field beneath the :guilabel:`Department` field to auto-populate the top field. The two fields do + not need to match. .. example:: While it is recommended to have the job positions match, the typed-in description in this top @@ -59,86 +46,85 @@ Optional fields Position`, if desired. For instance, if someone is hired for a sales representative position configured as - :guilabel:`Sales Representative` in the *Recruitment* app, that can be selected in the + :guilabel:`Sales Representative` in the **Recruitment** app, that can be selected in the drop-down :guilabel:`Job Position` field. - In the typed-in :guilabel:`Job Position` field beneath the :guilabel:`Employee's Name` field, - the position could be more specific, such as `Sales Representative - Subscriptions` if the - employee is focused solely on subscription sales. + In the typed-in :guilabel:`Job Position` field beneath the :guilabel:`Employee's Name`, the + position can be more specific, such as `Sales Representative - Subscriptions` if the employee + is focused solely on subscription sales. .. image:: new_employee/job-description-fields.png - :align: center :alt: Both job position fields entered but with different information. +- :guilabel:`Photo`: in the top-right image box of the employee form, click on the :icon:`fa-pencil` + :guilabel:`(Edit)` icon, then select a photo to upload. +- *Work Contact Information*: enter the employee's :guilabel:`Work Email`, :guilabel:`Work Phone`, + and :guilabel:`Work Mobile`, information, if not already auto-populated. - :guilabel:`Tags`: select a tag from the drop-down menu to add relevant tags to the employee. Any tag can be created in this field by typing it in. Once created, the new tag is available for all - employee records. There is no limit to the amount of tags that can be added. -- :guilabel:`Work Contact Information`: enter the employee's :guilabel:`Work Mobile`, - :guilabel:`Work Phone`, :guilabel:`Work Email`, and/or :guilabel:`Company` name, if not already - auto-populated. + employee records. There is no limit to the amount of tags that can be added on an employee form. +- :guilabel:`Company`: from the drop-down menu in this field, select the company the new employee + was hired by, or create a new company by typing the name in the field, and clicking + :guilabel:`Create` or :guilabel:`Create and edit...` from the mini drop-down menu that appears. + This field is required. - :guilabel:`Department`: select the employee's department from the drop-down menu. -- :guilabel:`Job Position`: select the employee's job position from the drop-down menu. Once a - selection is made, the :guilabel:`Job Position` field beneath the :guilabel:`Employee's Name` - field automatically updates to reflect the currently selected job position. These positions are - from the :doc:`Recruitment <../../hr/recruitment/new_job/>` application, and reflect the - currently configured job positions. +- :guilabel:`Job Position`: select the employee's job position from the drop-down menu. If using the + **Recruitment** app, this list reflects configured job positions. Once a selection is made, the + :guilabel:`Job Position` field beneath the :guilabel:`Employee's Name` field automatically updates + to reflect the currently selected job position, but is still editable. - :guilabel:`Manager`: select the employee's manager from the drop-down menu. - :guilabel:`Coach`: select the employee's coach from the drop-down menu. -- :guilabel:`Next Appraisal Date`: this field is **only** visible if the *Appraisals* application is - installed. The date automatically populates with a date that is computed according to the settings - configured in the *Appraisals* application. This date can be modified using the calendar selector. +- :guilabel:`Next Appraisal Date`: this field is **only** visible if the **Appraisals** application + is installed. The date automatically populates with a date that is computed according to the + settings configured in the **Appraisals** application. This date can be modified using the + calendar selector. .. note:: - After a :guilabel:`Manager` is selected, if the :guilabel:`Coach` field is blank, the selected - manager automatically populates the :guilabel:`Coach` field. + After a :guilabel:`Department` is selected, the department's configured manager and coach + automatically populates the respective :guilabel:`Manager` and :guilabel:`Coach` fields. .. tip:: To make edits to the selected :guilabel:`Department`, :guilabel:`Manager`, :guilabel:`Coach`, or - :guilabel:`Company`, click the :guilabel:`Internal Link` arrow next to the respective selection. - The :guilabel:`Internal Link` arrow opens the selected form, allowing for modifications. Click - :guilabel:`Save` after any edits are made. - -Additional information tabs -=========================== + :guilabel:`Company`, click the :icon:`oi-arrow-right` :guilabel:`(Internal link)` arrow next to + the respective selection. The :icon:`oi-arrow-right` :guilabel:`(Internal link)` arrow opens the + selected form, allowing for modifications. Click :guilabel:`Save` after any edits are made. .. _employees/resume: Resumé tab ----------- +========== Resumé -~~~~~~ +------ -Next, enter the employee's work history in the :guilabel:`Resumé` tab. Each resumé line must be -entered individually. When creating an entry for the first time, click :guilabel:`Create a new -entry`, and the :guilabel:`Create Resumé lines` form appears. After an entry is added, the -:guilabel:`Create a new entry` button is replaced with an :guilabel:`Add` button. Enter the -following information for each entry. - -.. image:: new_employee/resume-lines.png - :align: center - :alt: A resumé entry form with all the information populated. +Enter the employee's work history in the :guilabel:`Resumé` tab. Each resumé line must be entered +individually. When creating an entry for the first time, click :guilabel:`Create a new entry`, and +the :guilabel:`Create Resumé lines` form appears. After an entry is added, the :guilabel:`Create a +new entry` button is replaced with an :guilabel:`ADD` button. Enter the following information for +each entry. - :guilabel:`Title`: type in the title of the previous work experience. - :guilabel:`Employee`: select the employee from the drop-down menu. - :guilabel:`Type`: from the drop-down menu, select either :guilabel:`Experience`, - :guilabel:`Education`, :guilabel:`Side Projects`, :guilabel:`Internal Certification`, - :guilabel:`Completed Internal Training`, or type in a new entry, then click :guilabel:`Create - "(Type)"`. + :guilabel:`Education`, :guilabel:`Social Media`, or :guilabel:`Internal Certification`. To create + a new :guilabel:`Type`, enter the name of the type, then click :guilabel:`Create "(Type)"`. - :guilabel:`Display Type`: from the drop-down menu, choose :guilabel:`Classic` for typical work - experience, :guilabel:`Certification` for experience gained through a certification, or - :guilabel:`Course` for non-certified classes. + experience, or :guilabel:`Certification` for experience gained through a certification. - :guilabel:`Duration`: enter the start and end dates for the work experience. To select a date, - click the first empty field to reveal a calendar pop-up window. Proceed to use the :guilabel:`< - (left arrow)` and :guilabel:`> (right arrow)` icons to scroll to the desired month, then click on - the day to select it. Repeat this process to locate and select the end date. When the desired - dates have been selected, click :guilabel:`✔️ Apply`. + click the first empty field to reveal a calendar pop-up window. Proceed to use the + :icon:`oi-chevron-left` :guilabel:`(left arrow)` and :icon:`oi-chevron-right` :guilabel:`(right + arrow)` icons to scroll to the desired month, then click on the day to select it. Repeat this + process to locate and select the end date. When the desired dates have been selected, click + :icon:`fa-check` :guilabel:`Apply`. - :guilabel:`Description`: enter any relevant details in this field. Once all the information is entered, click the :guilabel:`Save & Close` button if there is only one entry to add, or click the :guilabel:`Save & New` button to save the current entry and create another resumé line. +.. image:: new_employee/resume-lines.png + :alt: A resumé entry form with all the information populated. + .. note:: After the new employee form is saved, the current position and company is automatically added to the :guilabel:`Resumé` tab, with the end date listed as `current`. @@ -146,139 +132,150 @@ another resumé line. .. _employees/skills: Skills -~~~~~~ +------ An employee's skills can be entered in the :guilabel:`Resumé` tab in the same manner that a resumé line is created. -In order to add a skill to an employee record, the skill types must be configured first. If no skill -types are configured, a :guilabel:`Create new Skills` button appears in the :guilabel:`Skills` -section of the :guilabel:`Resumé` tab. :ref:`Configure the skill types ` -before adding any skills to the employee record. +In order to add a skill to an employee record, the skill types must first be configured. By default, +Odoo comes with two :guilabel:`Skill Types` preconfigured: *Languages* and *Soft Skills*. +:ref:`Configure the rest of the skill types ` before adding any skills to the +employee record. -If the skill types are configured, a :guilabel:`Pick a skill from the list` button appears instead. -Click the :guilabel:`Pick a skill from the list` button, and select the following information for -each skill. - -.. image:: new_employee/select-skills.png - :align: center - :alt: A skill form with the information filled out. +When adding the first skill to an employee record, a :guilabel:`Pick a skill from the list` button +appears in the :guilabel:`Skills` section of the :guilabel:`Resumé` tab. Click the :guilabel:`Pick a +skill from the list` button, and select the following information for each skill. - :guilabel:`Skill Type`: select a :ref:`skill type ` by clicking the radio button next to the skill type. - :guilabel:`Skill`: after selecting a :guilabel:`Skill Type`, the corresponding skills associated with that selected :guilabel:`Skill Type` appear in a drop-down menu. For example, selecting :guilabel:`Language` as the :guilabel:`Skill Type` presents a variety of languages to select from - under the :guilabel:`Skills` field. Select the appropriate pre-configured skill, or type in a new - skill, then click :guilabel:`Create "(new skill)"`. + under the :guilabel:`Skills` field. Select the appropriate preconfigured skill from the list. + + .. important:: + If the desired skill does not appear in the list, it is **not** possible to add the new skill + from this window. New skills must be added from the :ref:`Skill Types ` + dashboard. + - :guilabel:`Skill Level`: pre-defined skill levels associated with the selected :guilabel:`Skill Type` appear in a drop-down menu. First, select a :guilabel:`Skill Level`, then the progress bar - automatically displays the pre-defined progress for that specific skill level. Skill levels and - progress can be modified in the :guilabel:`Skill Level` pop-up form, which is accessed via the - :guilabel:`Internal Link` arrow next to :guilabel:`Skill Level` field. + automatically displays the pre-defined progress for that specific skill level. Skill levels can be + created and modified from the :ref:`Skill Types ` dashboard. Click the :guilabel:`Save & Close` button if there is only one skill to add, or click the :guilabel:`Save & New` button to save the current entry and immediately add another skill. -To delete any line from the :guilabel:`Resumé` tab, click the :guilabel:`🗑️ (trash can)` icon to -delete the entry. Add a new line by clicking the :guilabel:`Add` button next to the corresponding -section. +At any point, a new line can be added by clicking the :guilabel:`ADD` button next to the +corresponding section. + +.. image:: new_employee/select-skills.png + :alt: A skill form with the information filled out. .. important:: Only users with :guilabel:`Officer: Manage all employees` or :guilabel:`Administrator` rights for - the *Employees* app can add or edit skills. + the **Employees** app can add or edit skills. .. _employees/skill-types: Skill types -*********** +~~~~~~~~~~~ In order to add a skill to an employee's form, the :guilabel:`Skill Types` must be configured. Go to -:menuselection:`Employees app --> Configuration --> Employee: Skill Types` to view the currently -configured skill types and create new skill types. +:menuselection:`Employees app --> Configuration --> Skill Types` to view the currently configured +skill types and create new skill types. .. note:: - The default skill of :guilabel:`Languages` is pre-configured as a skill *type*, but there are no - specific language *skills* listed within that skill type. The :guilabel:`Languages` skill type - must be fully configured before it can be used. + The default skill of :guilabel:`Languages` is preconfigured with twenty-one skills, and the + default :guilabel:`Soft Skills` is preconfigured with fifteen skills. -Click :guilabel:`New` and a new :guilabel:`Skill Type` form appears. Fill out all the details for -the new skill type. Repeat this for all the needed skill types. +Click the :guilabel:`New` button in the upper-left corner, and a new :guilabel:`Skill Type` form +appears. Fill out the following details for the new skill type. Repeat this for all the needed skill +types. - :guilabel:`Skill Type`: enter the name of the skill type. This acts as the parent category for more specific skills and should be generic. -- :guilabel:`Skills`: click :guilabel:`Add a line`, and enter the :guilabel:`Name` for the new +- :guilabel:`SKILLS`: click :guilabel:`Add a line`, and enter the :guilabel:`Name` for the new skill, then repeat for all other needed skills. -- :guilabel:`Levels`: click :guilabel:`Add a line`, and enter the :guilabel:`Name` of the level. - Next, click into the :guilabel:`Progress` field, and enter a percentage (0-100) for that level. - Repeat for all additional levels, as needed. -- :guilabel:`Default Level`: click the toggle on the level line to set that level as the default. - Typically, the lowest level is set as the default, but any level can be chosen. The toggle turns - green, indicating it is the default level for the skill. Only one level can be set as the default. +- :guilabel:`LEVELS`: click :guilabel:`Add a line`, and enter a :guilabel:`Name` and + :guilabel:`Progress` percentage (`0`-`100`) for each level. + + Set a :guilabel:`Default Level` by clicking the toggle on the desired line (only one level can be + selected). The toggle turns green to indicate the default level. Typically, the lowest level is + chosen, but any level can be selected. +- :guilabel:`DISPLAY`: click the colored box next to the :guilabel:`Color` field to reveal a list of + available colors for the skill type. Click on a color to select it. .. example:: - To add a math skill set, enter `Math` in the :guilabel:`Name` field. Next, in the - :guilabel:`Skills` field, enter `Algebra`, `Calculus`, and `Trigonometry`. Last, in the + To add a math skill set in yellow, enter `Math` in the :guilabel:`Name` field. Then, in the + :guilabel:`Skills` field, enter `Algebra`, `Calculus`, and `Trigonometry`. Next, in the :guilabel:`Levels` field enter `Beginner`, `Intermediate`, and `Expert`, with the - :guilabel:`Progress` listed as `25`, `50`, and `100`, respectively. Last, click :guilabel:`Set - Default` on the `Beginner` line to set this as the default skill level. + :guilabel:`Progress` listed as `25`, `50`, and `100`, respectively. Click :guilabel:`Set + Default` on the `Beginner` line to set this as the default skill level. Last, click the colored + box next to :guilabel:`Color`, and select yellow. .. image:: new_employee/math-skills.png - :align: center :alt: A skill form for a Math skill type, with all the information entered. -The :guilabel:`Skill Type` form automatically saves as data is entered. - .. tip:: - Once the form is completely filled out, click the :guilabel:`Save manually` button, represented - by a :guilabel:`cloud with an upwards arrow` icon at the top of the screen, and the - :guilabel:`Levels` rearrange in descending order, with the highest level at the top, and the - lowest at the bottom, regardless of the default level and the order they were entered. + Once the form is completely filled out, click the :icon:`fa-cloud-upload` :guilabel:`(Save + manually)` icon at the top of the screen, and the :guilabel:`Levels` rearrange in descending + order, with the highest level at the top, and the lowest at the bottom, regardless of the default + level and the order they were entered. .. _employees/work-info-tab: Work information tab --------------------- +==================== -The :guilabel:`Work Information` tab is where the employee's specific job related information is -found. Their working schedule, various roles, who approves their specific requests (time off, -timesheets, and expenses), their remote work schedule, and specific work location details are listed -here. +The :guilabel:`Work Information` tab contains job-related details such as the employee's schedule, +roles, approvers (for time off, timesheets, and expenses), remote work setup, and work location. Click on the :guilabel:`Work Information` tab to access this section, and enter the following -information for the new employee: +information for the new employee, for the various sections listed below. + +LOCATION +-------- -- :guilabel:`Location`: select the :guilabel:`Work Address` from the drop-down menu. To modify the - address, hover over the first line (if there are multiple lines) of the address to reveal an - :guilabel:`Internal Link` arrow. Click the :guilabel:`Internal Link` arrow to open up the company - form, and make any edits. +This section is visible for all employees, and does not require any other apps to be installed for +this section to be visible. + +- :guilabel:`Work Address`: select the :guilabel:`Work Address` from the drop-down menu. The current + company populates this field, by default. To modify the address, hover over the first line (if + there are multiple lines) of the address to reveal an :icon:`oi-arrow-right` :guilabel:`(Internal + Link)` arrow. Click the :icon:`oi-arrow-right` :guilabel:`(Internal Link)` arrow to open up the + company form, and make any edits. Use the breadcrumb links to navigate back to the new employee form when done. If a new work address is needed, add the address by typing it in the field, then click :guilabel:`Create (new address)` to add the address, or :guilabel:`Create and edit...` to add the new address and edit the address form. -- :guilabel:`Approvers`: to see this section, the user must have either :guilabel:`Administrator` or - :guilabel:`Officer: Manage all employees` rights set for the *Employees* application. Using the - drop-down menus, select the users responsible for approving an :guilabel:`Expense`, a - :guilabel:`Time Off` request, :guilabel:`Timesheet` entries, and :guilabel:`Attendance` records - for the employee. +- :guilabel:`Work Location`: using the drop-down menu, select where the :guilabel:`Work Address` is + located. The default options are :guilabel:`Home`, :guilabel:`Office`, or :guilabel:`Other`. - Hover over any of the selections to reveal the :guilabel:`Internal Link` arrow. + To add a new location, type in the location name, then click :guilabel:`Create (new location)` to + add the location, or :guilabel:`Create and edit...` to add the location, assign a :guilabel:`Work + Address`, and a :guilabel:`Cover Image`. - Click the :guilabel:`Internal Link` arrow to open a form with the approver's :guilabel:`Name`, - :guilabel:`Email Address`, :guilabel:`Company`, :guilabel:`Phone`, :guilabel:`Mobile`, and - :guilabel:`Default Warehouse` fields. These can be modified, if needed. +.. _employees/approvers: - Use the breadcrumb links to navigate back to the new employee form when done. +APPROVERS +--------- + +To see this section, the user must have either :guilabel:`Administrator` or :guilabel:`Officer: +Manage all employees` rights set for the **Employees** application. For the category to appear, the +respective app **must** be installed. For example, if the **Time Off** app is not installed, the +:guilabel:`Time Off` approver field does not appear. Only one selection can be made for each field. .. important:: The users that appear in the drop-down menu for the :guilabel:`Approvers` section **must** have *Administrator* rights set for the corresponding human resources role. - To check who has these rights, go to :menuselection:`Settings app --> Users --> → Manage - Users`. Then, click on an employee, and check the :guilabel:`Human Resources` section of the - :guilabel:`Access Rights` tab. + To check who has these rights, go to :menuselection:`Settings app` and click + :icon:`oi-arrow-right` :guilabel:`Manage Users` in the :guilabel:`Users` section. Then, click + on an employee, then click into the :guilabel:`Access Rights` tab. Scroll to the + :guilabel:`HUMAN RESOURCES` and check the various settings. - In order for the user to appear as an approver for :guilabel:`Expenses`, they **must** have either :guilabel:`Team Approver`, :guilabel:`All Approver`, or :guilabel:`Administrator` set @@ -286,254 +283,324 @@ information for the new employee: - In order for the user to appear as an approver for :guilabel:`Time Off`, they **must** have either :guilabel:`Officer:Manage all Requests` or :guilabel:`Administrator` set for the :guilabel:`Time Off` role. - - In order for the user to appear as an approver for :guilabel:`Timesheets`, they **must** have - either :guilabel:`Manager`, :guilabel:`Officer:Manage all contracts`, or - :guilabel:`Administrator` set for the :guilabel:`Payroll` role. + - In order for the user to appear as an approver for :guilabel:`Timesheets`, they **must** + have either :guilabel:`Officer:Manage all contracts` or :guilabel:`Administrator` set for the + :guilabel:`Payroll` role. + - In order for the user to appear as an approver for :guilabel:`Attendances`, they **must** + have :guilabel:`Administrator` set for the :guilabel:`Payroll` role. -- :guilabel:`Remote Work`: use the drop-down menu to select the default location the employee works - from each day of the week. The default options are :guilabel:`Home`, :guilabel:`Office`, or - :guilabel:`Other`. +- :guilabel:`Expense`: using the drop-down menus, select the user responsible for approving all + expenses for the employee. +- :guilabel:`Time Off`: using the drop-down menus, select the user responsible for approving all + time off requests from this employee. +- :guilabel:`Timesheet`: using the drop-down menus, select the user responsible for approving all + the employee's timesheet entries. +- :guilabel:`Attendance`: using the drop-down menus, select the user responsible for approving all + attendance entries for the employee. - A new location can be typed into the field, then click either :guilabel:`Create (new location)` to - add the location, or :guilabel:`Create and edit...` to add the new location and edit the form. +REMOTE WORK +----------- - After edits are done, click :guilabel:`Save & Close`, and the new location is added, and populates - the field. +This section **only** appears if the *Remote Work* setting is enabled in the configuration menu. - Leave the field blank (:guilabel:`Unspecified`) for non-working days like Saturday and Sunday. +Use the drop-down menu to select the default location the employee works, for each day of the week. +The default options are :guilabel:`Home`, :guilabel:`Office`, or :guilabel:`Other`. - .. note:: - It is also possible to add or modify work locations by navigating to :menuselection:`Employees - app --> Configuration --> Employee: Work Locations`. To modify a location, click on an existing - location, then make any changes on the form. - - Click :guilabel:`New` to create a new location, then enter the following information on the - form. All fields are **required**. - - - :guilabel:`Work Location`: enter the name for the location. This can be as general or as - specific, as needed, such as `Home` or `Building 1, Second Floor`, respectfully. - - :guilabel:`Work Address`: using the drop-down menu, select the address for the location. - - :guilabel:`Cover Image`: click on the icon to select it for the :guilabel:`Cover Image`. - Options are a :guilabel:`house` icon, an :guilabel:`office building` icon, and a - :guilabel:`GPS location marker` icon. - - :guilabel:`Company`: using the drop-down menu, select the company the location applies to. - The current company populates this field, by default. - - .. image:: new_employee/location.png - :align: center - :alt: A new work location form with all fields filled out. - -- :guilabel:`Schedule`: select the :guilabel:`Working Hours` and :guilabel:`Timezone` for the - employee. The :guilabel:`Internal Link` arrow opens a detailed view of the specific daily working - hours. Working hours can be modified or deleted here. +A new location can be typed into the field, then click either :guilabel:`Create (new location)` to +add the location, or :guilabel:`Create and edit...` to add the new location and edit the form. - .. note:: +After edits are done, click :guilabel:`Save & Close`, and the new location is added, and populates +the field. + +Leave the field blank (:guilabel:`Unspecified`) for non-working days, such as Saturday and Sunday. + +.. note:: + It is also possible to add or modify work locations by navigating to :menuselection:`Employees + app --> Configuration --> Work Locations`. To modify a location, click on an existing location, + then make any changes on the form. + + Click :guilabel:`New` to create a new location, then enter the following information on the form. + All fields are **required**. + + - :guilabel:`Work Location`: enter the name for the location. This can be as general or as + specific, as needed, such as `Home` or `Building 1, Second Floor`, respectfully. + - :guilabel:`Work Address`: using the drop-down menu, select the address for the location. + - :guilabel:`Cover Image`: click on the icon to select it for the :guilabel:`Cover Image`. + Options are a :icon:`fa-home` :guilabel:`(home)` icon, an :icon:`fa-building-o` + :guilabel:`(building)` icon, and a :icon:`fa-map-marker` :guilabel:`(map marker)` icon. + - :guilabel:`Company`: using the drop-down menu, select the company the location applies to. The + current company populates this field, by default. This field **only** appears in a + multi-company database. + + .. image:: new_employee/location.png + :alt: A new work location form with all fields filled out. + +.. _employees/schedule: + +SCHEDULE +-------- + +This section defines when the employee is expected to work. + +- :guilabel:`Working Hours`: using the drop-down menu, select the hours the employee is expected to + work. By default, a :guilabel:`Standard 40 hour/week` working schedule is available. If the + **Timesheets** app is installed, an :guilabel:`Appointment Resource Default Calendar` option is + also available. + + To view and modify the specific daily working hours, click the :icon:`oi-arrow-right` + :guilabel:`(Internal link)` arrow at the end of the :guilabel:`Working Hours` line. Working hours + can be modified or deleted here. + + .. note:: :guilabel:`Working Hours` are related to a company's working schedules, and an Employee **cannot** have working hours that are outside of a company's working schedule. - Each individual working schedule is company-specific. So, for multi-company databases, each - company needs to have its own working schedules set. + Each individual working schedule is company-specific. For multi-company databases, each company + **must** have its own working hours set. If an employee's working hours are not configured as a working schedule for the company, new working schedules can be added, or existing working schedules can be modified. - Working hours can be modified in the *Payroll* application, where they are referred to as + Working hours can be modified in the **Payroll** application, where they are referred to as :guilabel:`Working Schedules`. - For more information on how to create or modify :guilabel:`Working Schedules` in the *Payroll* - application, refer to the :doc:`../../hr/payroll` documentation. - -- :guilabel:`Planning`: select a role from the drop-down menu for both the :guilabel:`Roles` and - the :guilabel:`Default Role` fields. If the :guilabel:`Default Role` is selected as a role, it is - automatically added to the list of :guilabel:`Roles`. - -.. important:: - The users that appear in the drop-down menu for the :guilabel:`Approvers` section **must** have - *Administrator* rights set for the corresponding human resources role. - - To check who has these rights, go to :menuselection:`Settings app --> Users --> → Manage Users`. - Click on an employee, and check the :guilabel:`Human Resources` section of the :guilabel:`Access - Rights` tab. - - - In order for the user to appear as an approver for :guilabel:`Expenses`, they **must** have - either :guilabel:`Team Approver`, :guilabel:`All Approver`, or :guilabel:`Administrator` set - for the :guilabel:`Expenses` role. - - In order for the user to appear as an approver for :guilabel:`Time Off`, they **must** have - either :guilabel:`Officer` or :guilabel:`Administrator` set for the :guilabel:`Time Off` role. - - In order for the user to appear as an approver for :guilabel:`Timesheets`, they **must** have - either :guilabel:`Manager`, :guilabel:`Officer`, or :guilabel:`Administrator` set for the - :guilabel:`Payroll` role. - -.. note:: - :guilabel:`Working Hours` are related to a company's working times, and an employee **cannot** - have working hours that are outside of a company's working times. + For more information on how to create or modify :guilabel:`Working Schedules` in the + **Payroll** application, refer to the :doc:`../../hr/payroll` documentation. - Each individual working time is company-specific. So, for multi-company databases, each company - **must** have its own working hours set. + After the new working time is created, or an existing one is modified, the :guilabel:`Working + Hours` can be selected on the employee form. - If an employee's working hours are not configured as a working time for the company, new working - times can be added, or existing working times can be modified. +- :guilabel:`Timezone`: using the drop-down menu, select the timezone for the employee. - To add or modify a working time, go to the :menuselection:`Payroll app --> Configuration --> - Working Schedules`. Then, either add a new working time by clicking :guilabel:`New`, or edit an - existing one by selecting a :guilabel:`Working Time` from the list to modify it. +PLANNING +-------- - Refer to the :ref:`Working schedules ` section of the payroll - documentation for specific details on creating and editing working schedules. +This section is **only** visible if the **Planning** app is installed, as this section affects what +the employee can be assigned in the **Planning** app. - After the new working time is created, or an existing one is modified, the :guilabel:`Working - Hours` can be set on the employee form. In the :guilabel:`Schedule` section of the - :guilabel:`Work Information` tab, select the employee's working hours using the drop-down menu. +- :guilabel:`Roles`: using the drop-down menu, select all the roles the employee can perform. There + are no preconfigured roles available, so all roles must be :ref:`configured in the Planning app + `. There is no limit to the number of roles assigned to an employee. +- :guilabel:`Default Role`: using the drop-down menu, select the default role the employee will + typically perform. If the :guilabel:`Default Role` is selected before the :guilabel:`Roles` field + is configured, the selected role is automatically added to the list of :guilabel:`Roles`. .. _employees/private-info: Private information tab ------------------------ +======================= No information in the :guilabel:`Private Information` tab is required to create an employee, -however, some information in this section may be critical for the company's payroll department. In -order to properly process payslips and ensure all deductions are accounted for, the employee's -personal information should be entered. - -Here, the employee's :guilabel:`Private Contact`, :guilabel:`Family Status`, :guilabel:`Emergency` -contact, :guilabel:`Education`, :guilabel:`Work Permit`, and :guilabel:`Citizenship` information is -entered. Fields are entered either using a drop-down menu, ticking a checkbox, or typing in the -information. - -- :guilabel:`Private Contact`: enter the :guilabel:`Private Address`, :guilabel:`Email`, and - :guilabel:`Phone` for the employee. Then, enter the employee's :guilabel:`Bank Account Number` - using the drop-down menu. - - If the bank is not already configured (the typical situation when creating a new employee), enter - the bank account number, and click :guilabel:`Create and edit..`. A :guilabel:`Create Bank Account - Number` form loads. Fill in the necessary information, then click :guilabel:`Save & Close`. - - Next, select the employee's preferred :guilabel:`Language` from the drop-down menu. Then enter the - :guilabel:`Home-Work Distance` in the field. This field is only necessary if the employee is - receiving any type of commuter benefits. - - Lastly, enter the employee's license plate information in the :guilabel:`Private Car Plate` field. -- :guilabel:`Family Status`: select the current :guilabel:`Marital Status` using the drop-down menu, - either :guilabel:`Single`, :guilabel:`Married`, :guilabel:`Legal Cohabitant`, :guilabel:`Widower`, - or :guilabel:`Divorced`. If the employee has any dependent children, enter the :guilabel:`Number - of Dependent Children` in the field. -- :guilabel:`Emergency`: type in the :guilabel:`Contact Name` and :guilabel:`Contact Phone` number - of the employee's emergency contact in the respective fields. -- :guilabel:`Education`: select the highest level of education completed by the employee from the - :guilabel:`Certificate Level` drop-down menu. Default options include :guilabel:`Graduate`, - :guilabel:`Bachelor`, :guilabel:`Master`, :guilabel:`Doctor`, or :guilabel:`Other`. - - Type in the :guilabel:`Field of Study`, and the name of the :guilabel:`School` in the respective - fields. -- :guilabel:`Work Permit`: if the employee has a work permit, enter the information in this section. - Type in the :guilabel:`Visa No` (visa number), and/or :guilabel:`Work Permit No` (work permit - number) in the corresponding fields. - - Using the calendar selector, select the :guilabel:`Visa Expiration Date`, and/or the - :guilabel:`Work Permit Expiration Date`, to enter the expiration date(s). - - If available, upload a digital copy of the :guilabel:`Work Permit` document. Click - :guilabel:`Upload your file`, navigate to the work permit file in the file explorer, and click - :guilabel:`Open`. -- :guilabel:`Citizenship`: this section contains all the information relevant to the citizenship of - the employee. Some fields use a drop-down menu, as the :guilabel:`Nationality (Country)`, - :guilabel:`Gender`, and :guilabel:`Country of Birth` fields do. - - The :guilabel:`Date of Birth` uses a calendar selector to select the date. First, click on the - name of the month, then the year, to access the year ranges. Use the :guilabel:`< (left)` and - :guilabel:`> (right)` arrow icons, navigate to the correct year range, and click on the year. - Next, click on the month. Last, click on the day to select the date. - - Type in the information for the :guilabel:`Identification No` (identification number), - :guilabel:`Passport No` (passport number), and :guilabel:`Place of Birth` fields. - - Lastly, if the employee is **not** a resident of the country they are working in, activate the - checkbox next to the :guilabel:`Non-resident` field. +however, some information in this section may be necessary for the company's payroll department. - .. note:: - Depending on the localization setting, other fields may be present. For example, for the United - States, a :guilabel:`SSN No` (Social Security Number) field is present. +In order to properly process payslips and ensure all deductions are accounted for, it is recommended +to check with the accounting department and payroll department to ensure all required fields are +populated. -.. _employees/hr-settings: +Enter the various information in the following sections and fields of the :guilabel:`Private +Information` tab. Fields are entered either using a drop-down menu, ticking a checkbox, or typing in +the information. + + .. note:: + Depending on the localization setting, other fields may be present. For example, for the United + States, a :guilabel:`SSN No` (Social Security Number) field is present. -HR settings tab +PRIVATE CONTACT --------------- -This tab provides various fields for different information, depending on the country the company is -located. Different fields are configured for different locations, however some sections appear -regardless. +- :guilabel:`Private Address`: enter the employee's private home address. +- :guilabel:`Private Email`: enter the employee's personal email address. +- :guilabel:`Private Phone`: enter the employee's personal phone number. +- :guilabel:`Bank Account`: enter the bank account number for the employee, and click + :guilabel:`Create and edit..`. A :guilabel:`Create Bank Account` form loads with the bank account + number populating the :guilabel:`Account Number` field. Next, select the :guilabel:`Bank` using + the drop-down menu. + + If the bank is not already configured, click :guilabel:`Create and edit...` and a blank + :guilabel:`Create Bank` form loads, with the bank name populating the :guilabel:`Bank` field. + Next, enter the :guilabel:`Bank Identifier Code`, also referred to as a BIC or SWIFT code. Then + enter the :guilabel:`Bank Address`, :guilabel:`Phone`, and :guilabel:`Email`. Once the form is + complete, click :guilabel:`Save & Close`, and the new bank populates the :guilabel:`Bank` field. + + Next, enter the :guilabel:`ABA/Routing` number for the bank account, then select the + :guilabel:`Account Holder`, which is typically the employee. -- :guilabel:`Status`: select an :guilabel:`Employee Type` and, if applicable, a :guilabel:`Related - User`, with the drop-down menus. The :guilabel:`Employee Type` options include - :guilabel:`Employee`, :guilabel:`Student`, :guilabel:`Trainee`, :guilabel:`Contractor`, or - :guilabel:`Freelancer`. + Finally, click the :guilabel:`Send Money` toggle. This changes the toggle color to green, and the + status changes from :guilabel:`Untrusted` in black text, to :guilabel:`Trusted` in green text. + + .. image:: new_employee/bank.png + :alt: The Create Bank Account form with all the information filled out. .. important:: - Employees do **not** also need to be users. *Employees* do **not** count towards the Odoo - subscription billing, while *Users* **do** count towards billing. If the new employee should - also be a user, the user **must** be created. + **All** bank accounts must be marked as :guilabel:`Trusted`, if not payments cannot be + processed and sent to the bank account. Having an :guilabel:`Untrusted` bank account for an + employee will cause an error in the **Payroll** application. + +- :guilabel:`Home-Work Distance`: enter the number, in miles or kilometers, the employee commutes to + work, in one direction. The unit of measure can be changed from kilometers (:guilabel:`km`) to + miles (:guilabel:`mi`) using the drop-down menu. This field is only necessary if the employee is + receiving any type of commuter benefits or tax deductions based on commute distances. +- :guilabel:`Private Car Plate`: enter the license plate for the employee's personal car. + +EMERGENCY +--------- + +This section details the person to contact in the event of an emergency. + +- :guilabel:`Contact Name`: enter the emergency contact's name. +- :guilabel:`Contact Phone`: enter the emergency contact's phone number. It is recommended to enter + a phone number that the person has the most access to, typically a mobile phone. + +FAMILY STATUS +------------- + +This section is used for tax purposes, and affects the **Payroll** app. Enter the following +information in the fields. + +- :guilabel:`Marital Status`: select the marital status for the employee using the drop-down menu. + The default options are :guilabel:`Single`, :guilabel:`Married`, :guilabel:`Legal Cohabitant`, + :guilabel:`Widower`, and :guilabel:`Divorced`. + + If :guilabel:`Married` or :guilabel:`Legal Cohabitant` is selected, two additional fields appear: + :guilabel:`Spouse Complete Name` and :guilabel:`Spouse Birthdate`. Enter these fields with the + respective information. +- :guilabel:`Number of Dependent Children`: enter the number of dependent children. This number is + the same number used for calculating tax deductions, and should follow all tax regulations + regarding applicable dependents. + +CITIZENSHIP +----------- + +This section outlines all the information relating to the employee's citizenship. This section is +primarily for employees who are working in a different country than their citizenship. For employees +working outside of their home country, for example on a work visa, this information may be required. +Information for all fields may not be available. + +- :guilabel:`Nationality (Country)`: using the drop-down menu, select the country the employee is + from. +- :guilabel:`Identification No`: enter the employee's identification number in this field. +- :guilabel:`SSN No`: enter the employee's social security number. +- :guilabel:`Passport No`: enter the employee's passport number. +- :guilabel:`Gender`: select the employee's gender from the drop-down menu. The default options are + :guilabel:`Male`, :guilabel:`Female`, and :guilabel:`Other`. +- :guilabel:`Date of Birth`: using the calendar selector, select the birthday of the employee. +- :guilabel:`Place of Birth`: enter the city or town the employee was born. +- :guilabel:`Country of Birth`: using the drop-down menu, select the country the employee was born. +- :guilabel:`Non-resident`: tick this checkbox if the employee lives in a foreign country. + +EDUCATION +--------- + +This section allows for only one entry, and should be populated with the highest degree the employee +has earned. + +- :guilabel:`Certificate Level`: using the drop-down menu, select the highest degree the employee + has earned. The default options are :guilabel:`Graduate`, :guilabel:`Bachelor`, + :guilabel:`Master`, :guilabel:`Doctor`, and :guilabel:`Other`. +- :guilabel:`Field of Study`: type in the subject the employee studied, such as `Business` or + `Computer Science`. +- :guilabel:`School`: type in the name of the school the employee earned the degree from. + +WORK PERMIT +----------- + +This section should be filled in if the employee is working on some type of work permit. This +section may be left blank if they do not require any work permits for employment. + +- :guilabel:`Visa No`: enter the employee's visa number. +- :guilabel:`Work Permit No`: enter the employee's work permit number. +- :guilabel:`Visa Expiration Date`: using the calendar selector, select the date the employee's visa + expires. +- :guilabel:`Work Permit Expiration Date`: using the calendar selector, select the date the + employee's work permit expires. +- :guilabel:`Work Permit`: click :guilabel:`Upload your file`, then navigate to the work permit file + in the file explorer, and click :guilabel:`Select` to add the permit. + +.. _employees/payroll: + +Payroll tab +=========== + +Depending on the installed :doc:`localization <../payroll/payroll_localizations>`, the sections and +fields in this tab may vary considerably. Due to the specific nature of localizations and the +variety of information that may be requested in this tab, it is recommended to check with the +accounting department to fill out this section correctly. + +The following fields are universal for all localizations: + +- :guilabel:`Legal Name`: enter the legal name for the employee. This is the name that typically is + used for filing taxes. +- :guilabel:`Payslip Language`: enter the desired language to be used when printing payslips for + this employee. +- :guilabel:`Registration Number of the Employee`: enter the employees registration number. + +.. seealso:: + :doc:`Payroll localizations <../payroll/payroll_localizations>` - After the employee is created, click the :guilabel:`⚙️ (gear)` icon, then click - :guilabel:`Create User`. A :guilabel:`Create User` form appears. +.. _employees/hr-settings: - Type in the :guilabel:`Name` and :guilabel:`Email Address`. Next, select the - :guilabel:`Company` from the drop-down menu. +Settings tab +============ - Then, enter the :guilabel:`Phone` and :guilabel:`Mobile` numbers in the respective fields. +This tab provides various fields for different applications within the database. Depending on what +applications are installed, different fields may appear in this tab. - If a photo is available, click the :guilabel:`Edit` icon (which appears as a :guilabel:`✏️ - (pencil)` icon) in the lower-left corner of the image box, which is located in the top-right - corner of the form. +STATUS +------ - A file explorer pops up. Navigate to the file, then click :guilabel:`Open` to select it. - Finally, click :guilabel:`Save` after all the information is entered, and the employee record - is automatically updated with the newly-created user populating the :guilabel:`Related User - field`. +- :guilabel:`Employee Type`: using the drop-down menu, select the *type* of employee. The default + options are :guilabel:`Employee`, :guilabel:`Worker`, :guilabel:`Student`, :guilabel:`Trainee`, + :guilabel:`Contractor`, and :guilabel:`Freelancer`. +- :guilabel:`Related User`: using the drop-down menu, select a user in the database to link to this + employee. - Users can also be created manually. For more information on how to manually add a user, refer - to the :doc:`../../general/users/` document. + .. important:: + Employees do **not** need to be users of the database. -- :guilabel:`Attendance/Point of Sale/Manufacturing`: the employee's :guilabel:`PIN Code` and - :guilabel:`Badge ID` can be entered here, if the employee needs/has one. Click - :guilabel:`Generate` next to the :guilabel:`Badge ID` to create a badge ID. - - The :guilabel:`PIN Code` is used to sign in and out of the *Attendance* app kiosk, and a - :abbr:`POS (Point Of Sale)` system. -- :guilabel:`Payroll`: if applicable, enter the :guilabel:`Registration Number of the Employee` in - this section. - - Depending on the localization setting, the other items that appear in this field vary based on - location. In addition, other sections may appear in this tab based on location. It is recommended - to check with the payroll and/or accounting departments to ensure this section, as well as any - other sections relating to payroll that may appear, are filled in correctly. -- :guilabel:`Application Settings`: enter the employee's :guilabel:`Billing Time Target` for the - billing rate leader board in the *Timesheets* application. Next, enter the :guilabel:`Hourly Cost` - in a XX.XX format. This is factored in when the employee is working at a :doc:`work center - <../../inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers>`. + *Employees* do **not** count towards the Odoo subscription billing, while *Users* **do** count + towards billing. If the new employee should also be a user, the user **must** be created. - If applicable, enter the :guilabel:`Fleet Mobility Card` number. + After the employee is created, click :guilabel:`Create User` at the end of the + :guilabel:`Related User` line. A :guilabel:`Create User` form appears. -.. note:: - Manufacturing costs are added to the costs for producing a product, if the value of the - manufactured product is **not** a fixed amount. This cost does **not** affect the *Payroll* - application. + The employee name populates the :guilabel:`Name` field by default. If the :guilabel:`Email + Address`, :guilabel:`Phone`, :guilabel:`Mobile`, and :guilabel:`photo` are populated on the + employee form, the corresponding fields are auto-populated on the :guilabel:`Create User` form. -.. image:: new_employee/hr-settings.png - :align: center - :alt: Enter any information prompted in the HR Settings tab for the employee. + Once the form is completed, click the :guilabel:`Save` button. The user is created, and + populates the :guilabel:`Related User` field. -.. _employees/docs: + Users can also be created manually. For more information on how to manually add a user, refer + to the :doc:`../../general/users/` document. -Documents -========= +APPLICATION SETTINGS +-------------------- -All employee-related documents are stored in the *Documents* app. The number of associated documents -is displayed in the :guilabel:`Documents` smart button above the employee record. Click on the smart -button to access all documents. +This section affects the **Fleet** and **Manufacturing** apps. Enter the following information in +this section. -Refer to :doc:`documentation <../../productivity/documents>` on the *Documents* app for more -information. +- :guilabel:`Hourly Cost`: enter the hourly cost for the employee, in a XX.XX format. This cost is + factored in when the employee is working at a :doc:`work center + <../../inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers>`. -.. image:: new_employee/documents.png - :align: center - :alt: All uploaded documents associated with the employee appear in the documents smart-button. + .. note:: + Manufacturing costs are added to the costs for producing a product, if the value of the + manufactured product is **not** a fixed amount. This cost does **not** affect the **Payroll** + application. + +- :guilabel:`Fleet Mobility Card`: if applicable, enter the :guilabel:`Fleet Mobility Card` number + +ATTENDANCE/POINT OF SALE +------------------------ + +This section determines how employees sign in to either the **Attendances** or **Point Of Sale** +apps, and only appear if either of these apps is installed. + +- :guilabel:`PIN Code`: enter the employee's pin number in this field. This code is used to sign in + and out of **Attendances** app kiosks, and a :abbr:`POS (Point Of Sale)` system. +- :guilabel:`Badge ID`: click :guilabel:`Generate` at the end of the :guilabel:`Badge ID` line to + create a badge number. Once generated, the badge number populates the :guilabel:`Badge ID` field, + and :guilabel:`Generate` changes to :guilabel:`Print Badge`. Click :guilabel:`Print Badge` to + create a PDF file of the employee's badge. The badge can be printed and used to log into a + :abbr:`POS (point of sale)` system or :ref:`check-in ` on an + **Attendances** app kiosk. diff --git a/content/applications/hr/employees/new_employee/bank.png b/content/applications/hr/employees/new_employee/bank.png new file mode 100644 index 0000000000..8f2c110c72 Binary files /dev/null and b/content/applications/hr/employees/new_employee/bank.png differ diff --git a/content/applications/hr/employees/new_employee/documents.png b/content/applications/hr/employees/new_employee/documents.png deleted file mode 100644 index d16cda319a..0000000000 Binary files a/content/applications/hr/employees/new_employee/documents.png and /dev/null differ diff --git a/content/applications/hr/employees/new_employee/employee-new.png b/content/applications/hr/employees/new_employee/employee-new.png deleted file mode 100644 index 056cf9b9e1..0000000000 Binary files a/content/applications/hr/employees/new_employee/employee-new.png and /dev/null differ diff --git a/content/applications/hr/employees/new_employee/hr-settings.png b/content/applications/hr/employees/new_employee/hr-settings.png deleted file mode 100644 index 6ab67b66c8..0000000000 Binary files a/content/applications/hr/employees/new_employee/hr-settings.png and /dev/null differ diff --git a/content/applications/hr/employees/new_employee/job-description-fields.png b/content/applications/hr/employees/new_employee/job-description-fields.png index 8636c4f649..86d3f71407 100644 Binary files a/content/applications/hr/employees/new_employee/job-description-fields.png and b/content/applications/hr/employees/new_employee/job-description-fields.png differ diff --git a/content/applications/hr/employees/new_employee/location.png b/content/applications/hr/employees/new_employee/location.png index 99ad31a4ae..c671a272a4 100644 Binary files a/content/applications/hr/employees/new_employee/location.png and b/content/applications/hr/employees/new_employee/location.png differ diff --git a/content/applications/hr/employees/new_employee/math-skills.png b/content/applications/hr/employees/new_employee/math-skills.png index d75dfd21e1..11e294efe4 100644 Binary files a/content/applications/hr/employees/new_employee/math-skills.png and b/content/applications/hr/employees/new_employee/math-skills.png differ diff --git a/content/applications/hr/employees/new_employee/new-employee-form.png b/content/applications/hr/employees/new_employee/new-employee-form.png index 16ba08e55c..917069120a 100644 Binary files a/content/applications/hr/employees/new_employee/new-employee-form.png and b/content/applications/hr/employees/new_employee/new-employee-form.png differ diff --git a/content/applications/hr/employees/new_employee/resume-lines.png b/content/applications/hr/employees/new_employee/resume-lines.png index ca225aa3dc..77b3c67beb 100644 Binary files a/content/applications/hr/employees/new_employee/resume-lines.png and b/content/applications/hr/employees/new_employee/resume-lines.png differ diff --git a/content/applications/hr/employees/new_employee/select-skills.png b/content/applications/hr/employees/new_employee/select-skills.png index ee7ec1b3b2..b2a81ca27f 100644 Binary files a/content/applications/hr/employees/new_employee/select-skills.png and b/content/applications/hr/employees/new_employee/select-skills.png differ diff --git a/content/applications/hr/employees/offboarding.rst b/content/applications/hr/employees/offboarding.rst index e6fe15e5db..cfda7e8136 100644 --- a/content/applications/hr/employees/offboarding.rst +++ b/content/applications/hr/employees/offboarding.rst @@ -2,16 +2,164 @@ Offboarding =========== -When an employee leaves the company, it is important to ensure their employee record is updated to -reflect their departure, log the reason why, close any open activities associated with the -employee, and provide them with any important documents. +When an employee leaves the company, it is important to have an :ref:`offboarding plan +` to ensure all necessary steps are followed, such as returning equipment, +revoking access to business systems, filling out HR forms, having an exit interview, and more. +Depending on the company, there could be several different offboarding plans, configured for +specific departments or divisions, that have different requirements and steps from the main +offboarding plan. + +In addition to an offboarding plan, the employee record must be :ref:`updated to reflect their +departure `, log the reason why they left, close any open activities associated +with the employee, and :ref:`provide them with any important documents `. + +.. _employees/offboarding: + +View offboarding plan +===================== + +Before offboarding can begin, it is recommended to check the default offboarding plan that comes +preconfigured with the **Employees** app. To view the current default plan, navigate to +:menuselection:`Employees app --> Configuration --> Activity Plan`. Click :guilabel:`Offboarding` to +view the detailed offboarding plan form. + +Offboarding plan steps +---------------------- + +The default :guilabel:`Offboarding` plan is minimal, with two default steps (three if the **Fleet** +app is installed). All steps are :guilabel:`To-Do` activities, and are scheduled for the day the +offboarding plan is launched (:guilabel:`0 days Before Plan Date`). + +- :guilabel:`Organize knowledge transfer inside the team`: The manager must ensure all knowledge the + employee has relating to their job position, is either documented or shared with colleagues so + there is no knowledge gap. +- :guilabel:`Take Back Fleet`: The fleet manager ensures any vehicles assigned to the employee are + either unassigned (available for other employees) or the next driver is assigned. This step only + appears if the **Fleet** app is installed. +- :guilabel:`Take Back HR Materials`: The manager must obtain any documents and materials the HR + department requires. It is recommended to check with the HR department to ensure everything + required for this step is completed. + +.. image:: offboarding/offboarding.png + :alt: The three default steps in the Offboarding plan. + +Modify offboarding plan +======================= + +The default offboarding plan is minimal, so that modifications can be made to accommodate any +company's offboarding needs. Every company has different requirements, therefore it is necessary to +add the required steps to the offboarding plan. + +If the offboarding plan is universal, add or modify the default offboarding plan. If the offboarding +plan needed is only for a specific department, then a new plan should be created, specifically for +that department. + +To modify the default plan, first navigate to :menuselection:`Employees app --> Configuration --> +Activity Plan`, then click on :guilabel:`Offboarding`. + +To modify a step, click on the step and an :guilabel:`Open: Activities` pop-up window appears. Make +any desired modifications to the step, then click :guilabel:`Save` to accept the changes and close +the pop-up window. + +To add a new step, click :guilabel:`Add a line` at the bottom of the listed activities in the +:guilabel:`Activities To Create` tab, and a blank :guilabel:`Create Activities` pop-up window +appears. Enter all the information in the pop-up window, then click :guilabel:`Save & Close` if +there are no other steps to add, or click :guilabel:`Save & New` if more steps are needed. + +Configure all the desired steps for the offboarding plan. + +Create offboarding plan +======================= + +For some companies, specific offboarding plans may be necessary for some departments. For these +cases, a new department-specific offboarding plan may be needed. + +To create a new offboarding plan, first navigate to :menuselection:`Employees app --> +Configuration --> Activity Plan`. Click the :guilabel:`New` button in the upper-left corner, and a +blank plan form loads. + +Enter the following information on the form: + +- :guilabel:`Plan Name`: the specific name for the plan. +- :guilabel:`Model`: This field specifies where this plan can be used. In this case, in the + **Employees** app. This field is not able to be modified. +- :guilabel:`Department`: if left blank (the default setting) the plan is available for all + departments. To make the plan department-specific, select a department using the drop-down menu. + +Next, add the various steps for the plan by clicking :guilabel:`Add a line` at the bottom of the +listed activities in the :guilabel:`Activities To Create` tab, and a blank :guilabel:`Create +Activities` pop-up window appears. + +Enter the following information in the pop-up window: + +- :guilabel:`Activity Type`: Using the drop-down menu, select the specific activity to be scheduled. + The default options are :guilabel:`Email`, :guilabel:`Call`, :guilabel:`Meeting`, + :guilabel:`To-Do`, or :guilabel:`Upload Document`. If the **Sign** app is installed, a + :guilabel:`Request Signature` option is available. +- :guilabel:`Summary`: Enter a short description for the step. +- :guilabel:`Assignment`: Using the drop-down menu, select the person assigned to perform the + activity. The default options are: :guilabel:`Ask at launch`, :guilabel:`Default user`, + :guilabel:`Coach`, :guilabel:`Manager`, and :guilabel:`Employee`. If the **Fleet** app is + installed, a :guilabel:`Fleet Manager` option is available. + + .. note:: + The selection for the :guilabel:`Assignment` role is in relation to the employee. If + :guilabel:`Coach` is selected, the employee's coach is assigned to the activity. + + If :guilabel:`Default user` is selected, an :guilabel:`Assigned to` field appears. Using the + drop-down menu, select the user who will always be assigned this activity. + +- :guilabel:`Interval`: Configure the fields in this line to determine the due date of the activity. + Enter a number in the first field, then, using the drop-down menus in the following two fields, + configure when the due date should be created; (`#`) of :guilabel:`days`, :guilabel:`weeks`, or + :guilabel:`months`, either :guilabel:`Before Plan Date` or :guilabel:`After Plan Date`. + +When the :guilabel:`Create Activities` for is completed, click :guilabel:`Save & Close` if there are +no other steps to add, or click :guilabel:`Save & New` to add more steps, as needed. + +.. example:: + A company specializing in after-school art programs has two separate offboarding plans, one for + the teachers working in the field, and one for office workers. + + The offboarding plan for the teachers is set for the :guilabel:`Art Program Teachers` department, + and includes specialized tasks relating to those jobs. These include ensuring all art supplies + are catalogued and returned, all student feedback forms are turned in, and all access badges and + keys for the various locations are returned. + + .. image:: offboarding/offboarding-teachers.png + :alt: An offboarding plan configured for art teachers. + +Launch offboarding plan +======================= + +After an employee has given notice (typically two weeks) or once the company has decided to +terminate the working relationship with the employee, the offboarding plan should be launched. +Navigate to the :menuselection:`Employees app` and click on the departing employee profile. Click +the :guilabel:`Launch Plan` button, and a blank :guilabel:`Launch Plan` pop-up window loads. + +.. image:: offboarding/launch-plan-button.png + :alt: The Launch Plan button on the employee profile. + +Using the drop-down menu, select the desired offboarding plan in the :guilabel:`Plan` field. Then, +using the calendar selector, set a date in the :guilabel:`Plan Date` field. This is typically the +day the employee gave notice, but any date can be selected. + +The right-side of the :guilabel:`Launch Plan` pop-up window displays all the steps in the selected +plan, grouped by what was selected in the :guilabel:`Assignment` fields for the various plan steps. + +Once the :guilabel:`Plan` and :guilabel:`Plan Date` fields are configured, click the +:guilabel:`Schedule` button, and Odoo schedules everything in the plan, according to their +respective due dates. All scheduled activities appear in the chatter of the employee profile. + +.. _employees/archive: Archive an employee =================== -In Odoo, when an employee leaves the company they must be *archived*. To archive an employee, first -navigate to the :menuselection:`Employees app`. From here, locate the employee who is leaving the -company, and click on their employee card. +In Odoo, when an employee leaves the company they must be *archived*. This step should be done +*after* the employee has been fully offboarded. To archive an employee, first navigate to the +:menuselection:`Employees app`. From here, locate the employee who is leaving the company, and click +on their employee card. The employee form loads, displaying all their information. Click the :icon:`fa-gear` :guilabel:`(gear)` icon in the top-left corner, and a drop-down menu appears. Click @@ -27,9 +175,11 @@ Fill out the following fields on the form: given notice. - :guilabel:`Resigned`: Select this option when the employee no longer wishes to be employed, and the employee has given notice. - - :guilabel:`Retired`: Select this option when the employee is retiring. + - :guilabel:`Resigned: Retired`: Select this option when the employee is retiring. - :guilabel:`Became Freelance`: Select this option when the employee is no longer working for the company, but is becoming a freelance worker instead. + - :guilabel:`Mutual Agreement`: Select this option when both parties have agreed to terminate + their working relationship. - :guilabel:`Contract End Date`: Using the calendar selector, select the last day the employee is working for the company. @@ -42,13 +192,13 @@ Fill out the following fields on the form: - :guilabel:`Contract`: applies an end date for the current contract. - :guilabel:`Company Car`: removes the employee as the driver for their current company car, and :ref:`assigns the next driver `, if applicable. - - :guilabel:`Time Off`: cancels any time off requests after the contract end date. - - :guilabel:`Allocations`: removes the employee from any accrual plans they are on. + - :guilabel:`Equipment`: unassigns the employee from any assigned equipment. - :guilabel:`HR Info`: Tick the checkbox next to :guilabel:`Send Access Link` to send a download link to the employee's personal email address, containing all their personal HR files. -- :guilabel:`Private Email`: This field appears if the :guilabel:`HR Info` checkbox is ticked. Enter - the private email address for the employee. +- :guilabel:`Private Email`: This field appears if the :guilabel:`HR Info` checkbox is ticked. If + there is a private email listed on the employee profile, this field is automatically populated. If + no private email address is on their record, enter the private email address for the employee. When the form is complete, click :guilabel:`Apply`. The employee record is archived, an email with a download link to their personal documents is sent to the employee's private email address (if @@ -57,7 +207,6 @@ form. The chatter logs the :guilabel:`Departure Date` and :guilabel:`Departure R access link was emailed. .. image:: offboarding/termination.png - :align: center :alt: The employee termination form with all fields filled out. .. note:: diff --git a/content/applications/hr/employees/offboarding/launch-plan-button.png b/content/applications/hr/employees/offboarding/launch-plan-button.png new file mode 100644 index 0000000000..3b1b15b748 Binary files /dev/null and b/content/applications/hr/employees/offboarding/launch-plan-button.png differ diff --git a/content/applications/hr/employees/offboarding/offboarding-teachers.png b/content/applications/hr/employees/offboarding/offboarding-teachers.png new file mode 100644 index 0000000000..9a9e7983cb Binary files /dev/null and b/content/applications/hr/employees/offboarding/offboarding-teachers.png differ diff --git a/content/applications/hr/employees/offboarding/offboarding.png b/content/applications/hr/employees/offboarding/offboarding.png new file mode 100644 index 0000000000..9ab310bd8e Binary files /dev/null and b/content/applications/hr/employees/offboarding/offboarding.png differ diff --git a/content/applications/hr/employees/offboarding/termination.png b/content/applications/hr/employees/offboarding/termination.png index 22f82b58b1..5d13443363 100644 Binary files a/content/applications/hr/employees/offboarding/termination.png and b/content/applications/hr/employees/offboarding/termination.png differ diff --git a/content/applications/hr/employees/onboarding.rst b/content/applications/hr/employees/onboarding.rst new file mode 100644 index 0000000000..55d0d02115 --- /dev/null +++ b/content/applications/hr/employees/onboarding.rst @@ -0,0 +1,164 @@ +========== +Onboarding +========== + +When a new employee is hired, it is important to have an onboarding procedure that can be followed. +This ensures that information, equipment, and training are provided to the employee and any other +necessary steps for the business are assigned to the correct individuals. + +Proper onboarding ensures that new employees are given all the information and tools needed to be +successful in their roles and have a smooth transition to their new job. + +View onboarding plan +==================== + +Before onboarding can begin, it is recommended to check the default onboarding plan that comes +preconfigured with the **Employees** app. To view the current default plan, navigate to +:menuselection:`Employees app --> Configuration --> Activity Plan`. Click :guilabel:`Onboarding` to +view the detailed onboarding plan form. + +.. _onboarding/plan-form: + +The plan form displays the following information: + +- :guilabel:`Plan Name`: the specific name for the onboarding plan. +- :guilabel:`Model`: specifies where this plan can be used. In this case, in the **Employees** app. +- :guilabel:`Department`: if left blank (the default setting) this plan is available for all + departments. Limit the use of the plan to a specific department by selecting the department using + the drop-down menu. +- :guilabel:`Activities To Create`: this tab lists all the onboarding steps. Each row displays: + + - :guilabel:`Activity Type`: the specific activity for the step. The default options are + :guilabel:`Email`, :guilabel:`Call`, :guilabel:`Meeting`, :guilabel:`To-Do`, or + :guilabel:`Upload Document`. If the **Sign** app is installed, a :guilabel:`Request Signature` + option is available. + - :guilabel:`Summary`: a one line description of the step. + - :guilabel:`Assignment`: chooses who completes the activity, relative to the new hire: + + - :guilabel:`Ask at launch`: choose the user in the :guilabel:`Assigned To` field when + :ref:`launching the onboarding plan `. + - :guilabel:`Default user`: choose a user who always handles this activity. Defined in the + :guilabel:`Assigned to` field. + - :guilabel:`Manager`: assigns the employee's manager as defined on the employee record. + - :guilabel:`Coach`: assigns the employee's coach as defined on the employee record. + - :guilabel:`Employee`: the new hire completes the activity. + - :guilabel:`Fleet Manager`: assigns the designated **Fleet** app manager. This option is only + available if the **Fleet** app is installed. + + - :guilabel:`Assigned to`: this field remains blank, unless :guilabel:`Default user` is selected + for the :guilabel:`Assignment` field. If :guilabel:`Default user` is selected, this field is + populated with the selected user. + - :guilabel:`Document to sign`: the corresponding document requiring a signature. + - :guilabel:`Interval`: the time when the activity is active. + - :guilabel:`Unit`: the set time interval, either :guilabel:`days`, :guilabel:`weeks`, or + :guilabel:`months`. + - :guilabel:`Trigger`: how scheduling is determined for the activity. Options are either + :guilabel:`Before Plan Date` or :guilabel:`After Plan Date`. + + .. example:: + A laptop must be set up and registered to a new employee the day before they start work. The + person who performs this step should always be the IT Manager, Abby Jones. + + To configure this activity with these parameters, the :guilabel:`Activity Type` is set to + :guilabel:`To-Do`, with a summary of :guilabel:`Assign Laptop`. The :guilabel:`Assignment` + field is set to :guilabel:`Default user`, and the :guilabel:`Assigned to` field is set to + :guilabel:`Abby Jones`. The :guilabel:`Interval` is :guilabel:`1`, and the :guilabel:`Unit` + is set to :guilabel:`days`. The :guilabel:`Trigger` is :guilabel:`Before Plan Date`. + + .. image:: onboarding/activity-plan.png + :alt: An activity configured to assign a laoptop the day before an employee starts work. + +Onboarding plan steps +--------------------- + +The default :guilabel:`Onboarding` plan includes three default steps. All steps are +:guilabel:`To-Do` activities, and are scheduled for the day the onboarding plan is launched +(:guilabel:`0 days Before Plan Date`). + +- :guilabel:`Setup IT Materials`: the manager must gather and configure all IT materials. +- :guilabel:`Plan Training`: the manager must plan the training for the new employee. +- :guilabel:`Training`: the new employee must complete the training planned by the manager. + +.. image:: onboarding/onboarding.png + :alt: The three default steps in the Onboarding plan. + +.. _employees/modify-plan: + +Modify onboarding plan +====================== + +A single onboarding plan works only if the flow works for the entire company. + +.. note:: + If the onboarding plan is universal, add to or modify the default onboarding plan. If + department-specific onboarding plans are needed, :ref:`create a new onboarding plan + `. + +To modify the default plan, first navigate to :menuselection:`Employees app --> Configuration --> +Activity Plan`, then click on :guilabel:`Onboarding`. + +To modify a step, click on it. In the :guilabel:`Open: Activities` pop-up window, make any desired +modifications to the step, then click :guilabel:`Save`. + +To add a new step, click :guilabel:`Add a line` at the bottom of the listed activities in the +:guilabel:`Activities To Create` tab, and a blank :guilabel:`Create Activities` pop-up window +appears. Enter all the information in the pop-up window, then click :guilabel:`Save & Close` if +there are no other steps to add, or click :guilabel:`Save & New` if more steps are needed. + +.. _employees/create-plan: + +Create onboarding plan +====================== + +Some companies require different onboarding plans, when there are department-specific onboarding +procedures that do not apply to the whole company. For these cases, a new department-specific +onboarding plan must be created. + +To create a new onboarding plan, :ref:`navigate to the desired plan and configure all the desired +steps `. + +.. example:: + A company specializing in the manufacturing and selling of outdoor metal furniture may have a + large factory that produces the products, and a separate sales office. This company may have two + separate onboarding plans, one for factory workers, and one for office workers. + + The onboarding plan for the factory workers is set for the :guilabel:`Manufacturing` department, + and includes specialized tasks relating to factory jobs. These include gathering the new + employees uniform and safety gear, assigning a safety course, emailing their team about the new + hire, going over benefits, and more. + + .. image:: onboarding/factory-onboarding.png + :alt: An onboarding plan configured for factory workers. + +.. _employees/launch-plan: + +Launch onboarding plan +====================== + +After an employee has been hired and their employee profile :ref:`is created +`, navigate to the desired employee's profile by clicking on their Kanban +card on the **Employees** app dashboard, then click the :guilabel:`Launch Plan` button on their +employee profile, and a blank :guilabel:`Launch Plan` pop-up window loads. + +In the :guilabel:`Plan` field, choose the desired onboarding plan. Then, using the calendar +selector, set a date in the :guilabel:`Plan Date` field. This is typically the employee's first day, +but any date can be selected. + +The right side of the :guilabel:`Launch Plan` pop-up window displays all the steps in the selected +plan, grouped by what was selected in the :guilabel:`Assignment` fields on the :ref:`plan form +`. + +Once the :guilabel:`Plan` and :guilabel:`Plan Date` fields are configured, click the +:guilabel:`Schedule` button, and Odoo schedules everything in the plan, according to their +respective due dates. + +All scheduled activities appear in the both chatter of the employee profile, and in the chatter of +the user's with assignments relating to the plan. + +.. note:: + If any activity assignments were configured to :guilabel:`Ask at launch`, an :guilabel:`Assigned + to` field appears on the :guilabel:`Launch Plan` pop-up window. Using the drop-down menu, select + the user responsible for all the unassigned activities. + +.. image:: onboarding/onboarding-chatter.png + :alt: All onboarding tasks scheduled in the chatter. diff --git a/content/applications/hr/employees/onboarding/activity-plan.png b/content/applications/hr/employees/onboarding/activity-plan.png new file mode 100644 index 0000000000..af782f5d2b Binary files /dev/null and b/content/applications/hr/employees/onboarding/activity-plan.png differ diff --git a/content/applications/hr/employees/onboarding/factory-onboarding.png b/content/applications/hr/employees/onboarding/factory-onboarding.png new file mode 100644 index 0000000000..b1b46d0210 Binary files /dev/null and b/content/applications/hr/employees/onboarding/factory-onboarding.png differ diff --git a/content/applications/hr/employees/onboarding/onboarding-chatter.png b/content/applications/hr/employees/onboarding/onboarding-chatter.png new file mode 100644 index 0000000000..5e3f6e3c21 Binary files /dev/null and b/content/applications/hr/employees/onboarding/onboarding-chatter.png differ diff --git a/content/applications/hr/employees/onboarding/onboarding.png b/content/applications/hr/employees/onboarding/onboarding.png new file mode 100644 index 0000000000..bc1b5d0b5a Binary files /dev/null and b/content/applications/hr/employees/onboarding/onboarding.png differ diff --git a/content/applications/hr/employees/presence.png b/content/applications/hr/employees/presence.png new file mode 100644 index 0000000000..3dfefba18c Binary files /dev/null and b/content/applications/hr/employees/presence.png differ diff --git a/content/applications/hr/fleet.rst b/content/applications/hr/fleet.rst index 9ec17ef926..2565e91cac 100644 --- a/content/applications/hr/fleet.rst +++ b/content/applications/hr/fleet.rst @@ -1,94 +1,10 @@ -:show-content: +:nosearch: ===== Fleet ===== -This document outlines the configurations and settings for the *Fleet* application, for both -:ref:`settings ` and :ref:`manufacturers `. - -.. _fleet/settings: - -Settings -======== - -To access the settings menu, go to :menuselection:`Fleet app --> Configuration --> Settings`. Only -two settings need configuration: :guilabel:`End Date Contract Alert` and :guilabel:`New Vehicle -Request`. - -.. image:: fleet/fleet-settings.png - :align: center - :alt: Settings available for the Fleet application. - -End Date Contract Alert ------------------------ - -The :guilabel:`End Date Contract Alert` field how many days before the end of a vehicle contract an -alert should be sent. The responsible people receive an email informing them a vehicle contract is -about to expire in the number of days defined in this field. - -.. note:: - To determine who the responsible person is for a contract, open an individual contract. The - person listed as :guilabel:`Responsible` under the :guilabel:`Contract Information` section of - the contract is the person who will receive the alert. - - To access all contracts, navigate to :menuselection:`Fleet app --> Fleet --> Contracts` and all - contracts appear in the list. Click on a :guilabel:`Contract` to view it. - - An individual contract can also be found by navigating to :menuselection:`Fleet app --> Fleet --> - Fleet` and clicking on an individual vehicle. On the vehicle form, click the - :guilabel:`Contracts` smart button at the top of the page. The contract(s) associated with this - vehicle only appears in the list. Click on an individual contract to open it. The - :guilabel:`Responsible` person is listed on the contract. - -New Vehicle Request -------------------- - -The :guilabel:`New Vehicle Request` field sets a limit on how many new vehicles are requested based -on fleet availability. An employee filling out the salary configurator form (after being offered a -position), will *not* be able to request a new car if the number of existing cars is greater than -the number specified in the :guilabel:`New Vehicle Request` field. Enter the specific number limit -for existing available cars in this field. - -.. example:: - If the :guilabel:`New Vehicle Request` limit is set to 20 vehicles, and there are 25 vehicles - available, an employee would not be able to request a new vehicle. If there are only 10 cars - available, then the employee would be able to request a new vehicle. - -.. _fleet/manufacturers: - -Manufacturers -============= - -Odoo *Fleet* comes pre-configured with sixty-six commonly used car and bicycle manufacturers in the -database, along with their logos. To view the pre-loaded manufacturers, go to :menuselection:`Fleet -app --> Configuration --> Manufacturers`. - -The manufacturers appear in an alphabetical list. Each manufacturer's card lists how many specific -models are configured for each particular manufacturer. Odoo comes with forty-six preconfigured -:doc:`models ` from four major auto manufacturers, and one major bicycle manufacturer: -Audi, BMW, Mercedes, Opel (cars), and Eddy Merckx (bicycle). - -.. image:: fleet/manufacturer.png - :align: center - :alt: Manufacturer card with the amount of models listed. - -Add a manufacturer ------------------- - -To add a new manufacturer to the database, click :guilabel:`Create`. A manufacturer form will load. -Only two pieces of information are needed, the :guilabel:`Name` of the manufacturer, and the logo. -Type the name of the manufacturer in the name field, and select an image to upload for the logo. -When the information is entered, click :guilabel:`Save`. - -.. seealso:: - - :doc:`fleet/models` - - :doc:`fleet/new_vehicle` - - :doc:`fleet/service` - - :doc:`fleet/accidents` - .. toctree:: - :titlesonly: fleet/models fleet/new_vehicle diff --git a/content/applications/hr/fleet/accidents.rst b/content/applications/hr/fleet/accidents.rst index 3f7951038e..415e5a47d2 100644 --- a/content/applications/hr/fleet/accidents.rst +++ b/content/applications/hr/fleet/accidents.rst @@ -5,16 +5,17 @@ Accidents When managing a fleet, accidents are inevitable. Tracking accidents is crucial for understanding vehicle maintenance costs and identifying safe drivers. -Odoo's *Fleet* app offers multiple ways to track accidents. Below are step-by-step instructions for -only **one** method to monitor accidents and repair costs. +Odoo's **Fleet** app offers multiple ways of tracking accidents. Below are step-by-step instructions +for one possible method to monitor accidents and repair costs. Structure ========= -For this example, to track accidents, two :ref:`service types ` are created: -`Accident - Driver's Fault` and `Accident - No Fault`. +For this use case, go to :menuselection:`Fleet app --> Fleet --> Services`. On the :ref:`service +form `, two :ref:`service types ` are created: `Accident - +Driver's Fault` and `Accident - No Fault`. -This tracks various repairs associated with accidents, organized by who was at fault. +This setup records repairs associated with accidents and organizes them by fault. When an accident occurs, a service record is created. The specific repairs needed for the accident are logged in the *Description* of the service record, and the details about the accident are logged @@ -27,18 +28,18 @@ driver, or cost. To manage accidents, the creation of service records is **required**. Refer to the :doc:`service` documentation for detailed instructions on creating service records - in Odoo's *Fleet* app. + in Odoo's **Fleet** app. Log accidents and repairs ========================= -To log an accident, and initiate the repair process, the first step is to :ref:`create a service +To log an accident and initiate the repair process, the first step is to :ref:`create a service record ` detailing the specific repairs needed. .. note:: Some accidents require multiple repairs with several different vendors. For these scenarios, a separate service record is needed for each vendor performing repairs. To keep records organized, - it is recommended to keep the *Notes* field identical, as well as attaching the same important + it is recommended to keep the *Notes* field identical, and attach the same important documentation, such as a police report. Navigate to :menuselection:`Fleet app --> Fleet --> Services` to view the main :guilabel:`Services` @@ -48,8 +49,8 @@ Enter the following information on the form: - :guilabel:`Description`: enter the description of repairs needed to fully repair the vehicle, such as `Bodywork`, `Windshield Replacement`, or `Replacement Bumper, Tires, and Windows`. -- :guilabel:`Service Type`: for this example, select either `Accident - Driver's Fault` or - `Accident - No Fault`, depending on the situation. +- :guilabel:`Service Type`: for this example, select either `Accident - Driver's Fault` or `Accident + - No Fault`, depending on the situation. When entering either of these two :guilabel:`Service Types` for the first time, type in the new service type, then click :guilabel:`Create (new service type)`. A :guilabel:`Create Service Type` @@ -90,13 +91,12 @@ the desired record, and click :guilabel:`Open` to upload the file. documents. .. image:: accidents/service-form.png - :align: center :alt: Enter the information for an accident repair. Service stages ============== -In Odoo's *Fleet* app, there are four default service stages: +In Odoo's **Fleet** app, there are four default service stages: .. tabs:: @@ -133,7 +133,6 @@ Services`. Next, click on the individual service record to open the detailed ser desired stage in the top-right corner, above the service form, to change the status. .. image:: accidents/running.png - :align: center :alt: The stages as seen from the service form. .. _fleet/Kanban: @@ -151,7 +150,6 @@ services appear in a Kanban view, organized by their respective :guilabel:`Statu Drag-and-drop the service record to the desired stage. .. image:: accidents/drag-n-drop.png - :align: center :alt: The Kanban view of stages, with a card being dragged and dropped to the Running stage. Accident reporting @@ -174,22 +172,22 @@ Navigate to :menuselection:`Fleet app --> Fleet --> Services` to view the :guila dashboard. All service records are displayed in a :icon:`oi-view-list` :guilabel:`(List)` view, grouped alphabetically, by :guilabel:`Service Type`. -The two service types created for accident tracking appear in the list: :guilabel:`Accident - -Driver Fault` and :guilabel:`Accident - No Fault`. +The two service types created for accident tracking appear in the list: :guilabel:`Accident - Driver +Fault` and :guilabel:`Accident - No Fault`. Each grouping displays the number of records within each type, and lists the individual records beneath each grouping title. .. example:: - In this example, there are six accidents where the driver was at fault, and four accidents that - were not the driver's fault. This dashboard also displays the estimated total :guilabel:`Cost` - for all the accidents in each group. + In this example, there are three accidents where the driver was at fault, and one accident that + was not the driver's fault. This dashboard also displays the estimated total :guilabel:`Cost` for + all the accidents in each group. - An estimated `$19,164.81` dollars are for driver-caused accident repairs, and an estimated - `$2,548.21` dollars are for no-fault accidents. + An estimated `$3,284.00` dollars are costs from driver-caused accident repairs. The no-fault + accident has no cost associated with it, since the repair has not been completed, and no estimate + exists yet. .. image:: accidents/group-accidents.png - :align: center :alt: Accident services, with the total costs highlighted. .. note:: @@ -208,8 +206,8 @@ Analysis` report. This report displays a :icon:`fa-bar-chart` :guilabel:`(Bar C (:guilabel:`Date : (year)`), by default. The :guilabel:`Sum`, represented by a gray dotted line, is the combined total of both the :guilabel:`Contract` and :guilabel:`Service` costs. -To view the total cost by vehicle, click the :icon:`fa-caret-down` :guilabel:`(down arrow)` icon at -the right of the search bar, revealing a drop-down menu. Click :guilabel:`Vehicle` in the +To view the total cost by vehicle, click the :icon:`fa-caret-down` :guilabel:`(Toggle Search Bar)` +icon at the right of the search bar, revealing a drop-down menu. Click :guilabel:`Vehicle` in the :icon:`oi-group` :guilabel:`Group By` column, and the data is organized by vehicle. This displays the true cost for each vehicle, including both the contract cost (such as the monthly @@ -218,7 +216,6 @@ data popover window, which displays the vehicle name and the total cost. This al complete view of the vehicle cost. .. image:: accidents/total-costs.png - :align: center :alt: The Cost Analysis report, displaying total costs by vehicle. To view the individual cost details for both contract costs and repairs, click the @@ -227,7 +224,6 @@ Analysis` dashboard. This displays each vehicle on a separate line, and displays :guilabel:`Contract` cost and :guilabel:`Service` cost, as well as the :guilabel:`Total` cost. .. image:: accidents/fleet-pivot.png - :align: center :alt: The Cost Analysis report, displaying the contract and service costs separately, as well as the total. @@ -244,10 +240,10 @@ records in the :guilabel:`New` and :guilabel:`Running` stages can be time-saving large number of records in the *Services* dashboard. Navigate to :menuselection:`Fleet app --> Fleet --> Services`, where all service requests are -organized by :guilabel:`Service Type`. Next, click the :icon:`fa-caret-down` :guilabel:`(down -arrow)` icon at the right of the search bar, revealing a drop-down menu. Click :guilabel:`Add Custom -Filter` in the :icon:`fa-filter` :guilabel:`Filters` column, and a :guilabel:`Add Custom Filter` -pop-up window appears. +organized by :guilabel:`Service Type`. Next, click the :icon:`fa-caret-down` :guilabel:`(Toggle +Search Panel)` icon at the right of the search bar, revealing a drop-down menu. Click :guilabel:`Add +Custom Filter` in the :icon:`fa-filter` :guilabel:`Filters` column, and a :guilabel:`Add Custom +Filter` pop-up window appears. Three drop-down fields need to be configured on the pop-up window. @@ -266,15 +262,15 @@ the other fields as-is. Click the :guilabel:`Add` button at the bottom to add the new custom filter. .. image:: accidents/custom-filters.png - :align: center :alt: The filter settings to be added to only display new and running services. This slight modification only presents services in the :guilabel:`New` and :guilabel:`Running` stages. This is a helpful report for a company managing a high number of repairs at any given time. To have this report appear as the default report when opening the :guilabel:`Services` dashboard, -click the :icon:`fa-caret-down` :guilabel:`(down arrow)` icon at the far-right of the search bar. -Next, click :guilabel:`Save current search`, beneath the :icon:`fa-star` :guilabel:`Favorites` -column, which reveals another drop-down column beneath it. Tick the checkbox beside -:guilabel:`Default Filter`, then click :guilabel:`Save`. Then, this customized :guilabel:`Services` -dashboard appears, by default, anytime the :guilabel:`Services` dashboard is accessed. +click the :icon:`fa-caret-down` :guilabel:`(Toggle Search Panel)` icon at the far-right of the +search bar. Next, click :guilabel:`Save current search`, beneath the :icon:`fa-star` +:guilabel:`Favorites` column, which reveals another drop-down column beneath it. Tick the checkbox +beside :guilabel:`Default Filter`, then click :guilabel:`Save`. Then, this customized +:guilabel:`Services` dashboard appears, by default, any time the :guilabel:`Services` dashboard is +accessed. diff --git a/content/applications/hr/fleet/accidents/custom-filters.png b/content/applications/hr/fleet/accidents/custom-filters.png index 60846cf2cc..2a27a3a83e 100644 Binary files a/content/applications/hr/fleet/accidents/custom-filters.png and b/content/applications/hr/fleet/accidents/custom-filters.png differ diff --git a/content/applications/hr/fleet/accidents/drag-n-drop.png b/content/applications/hr/fleet/accidents/drag-n-drop.png index 848de513dc..70a547c40e 100644 Binary files a/content/applications/hr/fleet/accidents/drag-n-drop.png and b/content/applications/hr/fleet/accidents/drag-n-drop.png differ diff --git a/content/applications/hr/fleet/accidents/fleet-pivot.png b/content/applications/hr/fleet/accidents/fleet-pivot.png index cffef235a1..7ac5e34df5 100644 Binary files a/content/applications/hr/fleet/accidents/fleet-pivot.png and b/content/applications/hr/fleet/accidents/fleet-pivot.png differ diff --git a/content/applications/hr/fleet/accidents/group-accidents.png b/content/applications/hr/fleet/accidents/group-accidents.png index 03cb664825..8fddf182e8 100644 Binary files a/content/applications/hr/fleet/accidents/group-accidents.png and b/content/applications/hr/fleet/accidents/group-accidents.png differ diff --git a/content/applications/hr/fleet/accidents/running.png b/content/applications/hr/fleet/accidents/running.png index e45e21aa1b..54b008ded1 100644 Binary files a/content/applications/hr/fleet/accidents/running.png and b/content/applications/hr/fleet/accidents/running.png differ diff --git a/content/applications/hr/fleet/accidents/service-form.png b/content/applications/hr/fleet/accidents/service-form.png index de9c31e982..d4350a0757 100644 Binary files a/content/applications/hr/fleet/accidents/service-form.png and b/content/applications/hr/fleet/accidents/service-form.png differ diff --git a/content/applications/hr/fleet/accidents/total-costs.png b/content/applications/hr/fleet/accidents/total-costs.png index 2b656035e3..ca883feb05 100644 Binary files a/content/applications/hr/fleet/accidents/total-costs.png and b/content/applications/hr/fleet/accidents/total-costs.png differ diff --git a/content/applications/hr/fleet/manufacturer.png b/content/applications/hr/fleet/manufacturer.png deleted file mode 100644 index 6a0e3071f0..0000000000 Binary files a/content/applications/hr/fleet/manufacturer.png and /dev/null differ diff --git a/content/applications/hr/fleet/models.rst b/content/applications/hr/fleet/models.rst index 95514c1190..f8a3ac9283 100644 --- a/content/applications/hr/fleet/models.rst +++ b/content/applications/hr/fleet/models.rst @@ -1,80 +1,75 @@ -============== -Vehicle models -============== +====================== +Models & manufacturers +====================== + +Odoo's **Fleet** app categorizes each vehicle by *manufacturer* and *model* (e.g. `BMW`, `X2`). +Before the vehicle can be added to the Odoo database, its :ref:`manufacturer ` +and a :ref:`model ` records must already exist in the database. + +.. _fleet/manufacturers: + +Manufacturers +============= + +Odoo's **Fleet** app comes preconfigured with sixty-six commonly used car and bicycle manufacturers +in the database, along with their logos. To view the pre-loaded manufacturers, go to +:menuselection:`Fleet app --> Configuration --> Manufacturers`. + +The default filter, :guilabel:`With Models`, displays only manufacturers that already have vehicle +models. Remove the default filter to view *all* manufacturers. + +Manufacturers re listed alphabetically, and each card shows how many specific :ref:`models +` are configured for each particular manufacturer. + +.. image:: models/manufacturer.png + :alt: Manufacturer card with the amount of models listed. + +.. _fleet/add-manufacturers: + +Add a manufacturer +------------------ + +To add a new manufacturer to the database, click :guilabel:`New` in the upper-left corner, to open a +blank manufacturers form. Type the name of the manufacturer in the :guilabel:`Name` field, and +select an image to upload for the logo. + +.. _fleet/models: + +Models +====== When adding a vehicle to the fleet, specify the vehicle model to maintain updated records, which keeps track of specific details, like maintenance schedules and parts compatibility. -Odoo comes with preconfigured car models from four major auto manufacturers: Audi, BMW, Mercedes, -and Opel. - -If a new vehicle model joins the fleet, and it is not one of the preconfigured models from these -manufacturers, the model (and/or manufacturer) **must** be :ref:`added to the -database `. - -Preconfigured models -==================== - -The following models are preconfigured in Odoo, and do not need to be added to the database: - -+-------+--------------+-----------+--------------+ -| AUDI | BMW | Mercedes | Opel | -+=======+==============+===========+==============+ -| A1 | Serie 1 | Class A | Agilia | -+-------+--------------+-----------+--------------+ -| A3 | Serie 3 | Class B | Ampera | -+-------+--------------+-----------+--------------+ -| A4 | Serie 5 | Class C | Antara | -+-------+--------------+-----------+--------------+ -| A5 | Serie 6 |Class CL | Astra | -+-------+--------------+-----------+--------------+ -| A6 | Serie 7 | Class CLS | AstraGTC | -+-------+--------------+-----------+--------------+ -| A7 | Serie Hybrid | Class E | Combo Tour | -+-------+--------------+-----------+--------------+ -| A8 | Serie M | Class GL | Corsa | -+-------+--------------+-----------+--------------+ -| Q3 | Serie X | Class GLK | Insignia | -+-------+--------------+-----------+--------------+ -| Q5 | Serie Z4 | Class M | Meriva | -+-------+--------------+-----------+--------------+ -| Q7 | | Class R | Mokka | -+-------+--------------+-----------+--------------+ -| TT | | Class S | Zafira | -+-------+--------------+-----------+--------------+ -| | | Class SLK | Zafira Tourer| -+-------+--------------+-----------+--------------+ -| | | Class SLS | | -+-------+--------------+-----------+--------------+ +Unlike :ref:`manufacturers `, models do **not** come preconfigured in the +**Fleet** app. When a new vehicle model joins the fleet, the model (and, if necessary, the +manufacturer) **must** be :ref:`added to the database `. .. _fleet/add-model: -Add a new model -=============== +Add a model +----------- -To add a new vehicle model, navigate to :menuselection:`Fleet app --> Configuration --> Models: -Models`. Click :guilabel:`New`, and in a new vehicle model form, enter the following information on -the form. +To add a new vehicle model, navigate to :menuselection:`Fleet app --> Configuration --> Models`. +Click :guilabel:`New` in the upper-left corner, and enter the following information on the new model +form. .. note:: - Be advised, some fields are specific to Belgian based companies, so not all fields or sections - may be visible depending on the location of the company. + Depending on the installed :doc:`localization <../../finance/fiscal_localizations>`, some fields + or sections may not appear. -- :guilabel:`Model name`: enter the model name in the field. -- :guilabel:`Manufacturer`: select the manufacturer from the drop-down menu. If the manufacturer is - not configured, type in the manufacturer, and click :guilabel:`Create` or :guilabel:`Create and - edit..`. +- :guilabel:`Model name`: Enter the model name in the field. +- :guilabel:`Manufacturer`: Using the drop-down menu, select the manufacturer. If it is not + configured, :ref:`add the manufacturer ` +- :guilabel:`Vehicle Type`: Using the drop-down menu, select one of two preconfigured vehicle types, + either :guilabel:`Car` or :guilabel:`Bike`. - .. note:: - When the manufacturer is selected, if it is one of the default manufacturers in *Odoo*, the - logo for the manufacturer automatically loads in the image box in the top-right corner. + .. important:: + Additional vehicle types can **not** be added. **Fleet** keeps them fixed to preserve its + **Payroll** integration, where vehicles may count as employee benefits. -- :guilabel:`Vehicle Type`: select one of two preconfigured vehicle types, either :guilabel:`Car` or - :guilabel:`Bike`, from the drop-down menu. The vehicle types are hardcoded in Odoo, and are - integrated with the *Payroll* application, since vehicles can be part of an employee's benefits. - Adding additional vehicle types is *not* possible as it affects payroll. -- :guilabel:`Category`: select a category for the vehicle from the drop-down menu. To create a new - category, type in the category and then click :guilabel:`Create (new category)`. +- :guilabel:`Category`: Using the drop-down menu, select a :ref:`category ` for + the vehicle or :ref:`create a new one `. Information tab --------------- @@ -83,28 +78,26 @@ In the :guilabel:`Information` tab, specify details about the car model, such as passenger capacity, cost settings (applicable to the Belgium localization only), and engine information. -Model section -~~~~~~~~~~~~~ +Model +~~~~~ -- :guilabel:`Seats Number`: enter how many passengers the vehicle can accommodate. -- :guilabel:`Doors Number`: enter the number of doors the vehicle has. -- :guilabel:`Color`: enter the color of the vehicle. -- :guilabel:`Model Year`: enter the year the vehicle was manufactured. -- :guilabel:`Trailer Hitch`: tick this checkbox if the vehicle has a trailer hitch installed. +- :guilabel:`Seats Number`: Enter how many passengers the vehicle can accommodate. +- :guilabel:`Doors Number`: Enter the number of doors the vehicle has. +- :guilabel:`Model Year`: Enter the year the vehicle was manufactured. +- :guilabel:`Trailer Hitch`: Tick this checkbox if the vehicle has a trailer hitch installed. -Salary section -~~~~~~~~~~~~~~ +Salary +~~~~~~ -.. note:: - The :guilabel:`Salary` section **only** appears for Belgian-based companies, and **only** if the - company has their localization setting set to Belgium. The cost values are all *monthly*, with - the exception of the :guilabel:`Catalog Value (VAT Incl.)`. +The :guilabel:`Salary` section **only** appears if the company has their localization setting set to +Belgium. The cost values are all *monthly*, with the exception of the :guilabel:`Catalog Value (VAT +Incl.)`. -- :guilabel:`Can be requested`: tick this checkbox if employees can request this model vehicle, if a +- :guilabel:`Can be requested`: Tick this checkbox if employees can request this model vehicle, if a vehicle is part of their employee contract. - :guilabel:`Catalog Value (VAT Incl.)`: enter the :abbr:`MSRP (Manufacturer's Suggested Retail Price)` for the vehicle at the time of purchase or lease. -- :guilabel:`C02 fee`: represents the carbon dioxide emission fee paid to the Belgian government. +- :guilabel:`C02 fee`: Represents the carbon dioxide emission fee paid to the Belgian government. This value is automatically calculated, based on Belgian laws and regulations, and **cannot** be modified. The value is based on the figure entered in the :guilabel:`CO2 Emissions` field (in the :guilabel:`Engine` section of the :guilabel:`Information` tab) on the vehicle form. @@ -112,55 +105,66 @@ Salary section .. important:: Modifying the :guilabel:`CO2 Emissions` field adjusts the value in the :guilabel:`CO2 fee` field. -- :guilabel:`Cost (Depreciated)`: enter the monthly vehicle cost, which appears in the salary +- :guilabel:`Cost (Depreciated)`: Enter the monthly vehicle cost, which appears in the salary configurator for future employees. This value impacts the gross and net salary of the employee assigned to the vehicle. This figure is depreciated over time, according to local tax laws. The :guilabel:`Cost (Depreciated)` does **not** depreciate automatically on the *vehicle model*, it only depreciates based on the *contract* linked to a specific vehicle. -- :guilabel:`Total Cost (Depreciated)`: this value is the combination of the :guilabel:`Cost +- :guilabel:`Total Cost (Depreciated)`: This value is the combination of the :guilabel:`Cost (Depreciated)` and the :guilabel:`C02 fee` fields. It also depreciated over time. Engine ~~~~~~ -- :guilabel:`Fuel Type`: select the type of fuel the vehicle uses from the drop-down menu. The - options are :guilabel:`Diesel`, :guilabel:`Gasoline`, :guilabel:`Hybrid Diesel`, :guilabel:`Hybrid - Gasoline`, :guilabel:`Plug-in Hybrid Diesel`, :guilabel:`Plug-in Hybrid Gasoline`, - :guilabel:`CNG`, :guilabel:`LPG`, :guilabel:`Hydrogen`, or :guilabel:`Electric`. -- :guilabel:`CO2 Emissions`: enter the average carbon dioxide emissions the vehicle produces in +- :guilabel:`Fuel Type`: Using the drop-down menu, select the type of fuel the vehicle uses. The + default options are :guilabel:`Diesel`, :guilabel:`Gasoline`, :guilabel:`Full Hybrid` + :guilabel:`Plug-in Hybrid Diesel`, :guilabel:`Plug-in Hybrid Gasoline`, :guilabel:`CNG`, + :guilabel:`LPG`, :guilabel:`Hydrogen`, or :guilabel:`Electric`. +- :guilabel:`Range`: Enter the distance the vehicle can travel on one tank of gas, or one battery + charge, in kilometers. +- :guilabel:`CO2 Emissions`: Enter the average carbon dioxide emissions the vehicle produces in grams per kilometer (g/km). This information is provided by the car manufacturer. -- :guilabel:`CO2 Standard`: enter the standard amount of carbon dioxide in grams per kilometer +- :guilabel:`CO2 Standard`: Enter the standard amount of carbon dioxide in grams per kilometer (g/km) for a similar-sized vehicle. -- :guilabel:`Transmission`: select :guilabel:`Manual` or :guilabel:`Automatic` transmission from the - drop-down menu. -- :guilabel:`Power`: if the vehicle is electric or hybrid, enter the power the vehicle uses in - kilowatts (kW). -- :guilabel:`Horsepower`: enter the vehicle's horsepower in this field. -- :guilabel:`Horsepower Taxation`: enter the amount that is taxed, based on the size of the +- :guilabel:`Transmission`: Using the drop-down menu, select the type of transmission, either + :guilabel:`Manual` or :guilabel:`Automatic`. +- :guilabel:`Power Unit`: Using the drop-down menu, select how the vehicle's power is measured, + either in kilowatts or horsepower. +- :guilabel:`Power`: If the vehicle is electric or hybrid, enter the power the vehicle uses in + kilowatts (:guilabel:`kW`). This field only appears if :guilabel:`kW` is selected for the + :guilabel:`Power` field. +- :guilabel:`Horsepower`: Enter the vehicle's horsepower in this field. This field only appears if + :guilabel:`Horsepower` is selected for the :guilabel:`Power` field. +- :guilabel:`Horsepower Taxation`: Enter the amount that is taxed, based on the size of the vehicle's engine. This is determined by local taxes and regulations, and varies depending on the location. It is recommended to check with the accounting department to ensure this value is - correct. -- :guilabel:`Tax Deduction`: this field auto-populates, according to the engine specifications, and - **cannot** be modified. The percentage is based on the localization settings and local tax laws. + correct. This field only appears if :guilabel:`Horsepower` is selected for the :guilabel:`Power` + field. +- :guilabel:`Horsepower Taxation`: Enter the amount of taxes incurred according to the engine + specifications. The number is dependent on the local tax laws, therefore it is recommended to + check with the accounting department to ensure the correct taxation amount is entered. This field + only appears if the :guilabel:`Power` field is set to :guilabel:`Horsepower`. +- :guilabel:`Tax Deduction`: The percentage that can be deducted from taxes is populated based on + the localization, and **cannot** be modified. This field only appears for certain localizations. Vendors tab ----------- -Specify the vendors a vehicle can be purchased from in this tab. With proper setup, requests for -quotations for vehicles can be easily created through Odoo's *Purchase* app. +Specify the vendors a vehicle can be purchased from in this tab. With proper setup, :doc:`requests +for quotations <../../inventory_and_mrp/purchase/manage_deals/rfq>` for vehicles can be created +through Odoo's **Purchase** app. -To add a vendor, click :guilabel:`Add`, which opens an :guilabel:`Add: Vendors` pop-up window, with -a list of all the vendors currently in the database. Add a vendor by ticking the checkbox next to -the vendor name, then click :guilabel:`Select`. There is no limit to the number of vendors that can -be added to this list. +To add a vendor, click :guilabel:`Add` in the upper-left corner of the :guilabel:`Vendors` tab. This +opens an :guilabel:`Add: Vendors` pop-up window, with a list of all the vendors currently in the +database. Add a vendor by ticking the checkbox next to the vendor name, then click +:guilabel:`Select`. No limitations exist on the number of vendors that can be added to this list. -If a vendor is not in the database, add a vendor by clicking :guilabel:`New` in the bottom-left of -the :guilabel:`Add: Vendors` pop-up window. In the :guilabel:`Create Vendors` form that appears, -enter the necessary information, then click :guilabel:`Save & Close` to add the vendor, or click -:guilabel:`Save & New` to add the current vendor and create another new vendor. +If a vendor is *not* already in the database, add a vendor by clicking :guilabel:`New` in the +bottom-left of the :guilabel:`Add: Vendors` pop-up window. In the :guilabel:`Create Vendors` form +that appears, enter the necessary information, then click :guilabel:`Save & Close` to add the +vendor, or click :guilabel:`Save & New` to add the current vendor and create another new vendor. .. image:: models/vendor.png - :align: center :alt: Vendor form to fill out when adding a new vendor. .. _fleet/categories: @@ -168,36 +172,34 @@ enter the necessary information, then click :guilabel:`Save & Close` to add the Model category ============== -To best organize a fleet, it is recommended to have vehicle models housed under a specific category, -to easily see what kinds of vehicles are in the fleet. Model categories are set on the :ref:`vehicle -model form `. +To aid with fleet organization, it is recommended to have vehicle models housed under a specific +category. Model categories are set on the :ref:`vehicle model form `. -Odoo does **not** come with any models preconfigured; all models **must** be added. +Odoo does **not** come with any categories preconfigured; all categories **must** be added. -To view any models currently set up in the database, navigate to :menuselection:`Fleet app --> -Configuration --> Models: Categories`. All models are displayed in a list view. +To view any categories currently set up in the database, navigate to :menuselection:`Fleet app --> +Configuration --> Categories`. All categories are displayed in a list view. + +.. _fleet/new-category: Add a new model category ------------------------ To add a new category, click the :guilabel:`New` button in the top-left corner of the -:guilabel:`Categories` page. A new entry line appears at the bottom of the list. Type in the new -category, then either click :guilabel:`Save`, or click anywhere on the screen, to save the entry. +:guilabel:`Categories` dashboard. A new entry line appears at the bottom of the list. Type in the +new category, then either click :guilabel:`Save`, or click anywhere on the screen, to save the +entry. To reorganize how the categories appear in the list, click on the :icon:`oi-draggable` :guilabel:`(draggable)` icon to the left of any desired category name, and drag the line to the desired position. -The order of the list does not affect the database in any way. However, it may be preferable to view -the vehicle categories in a specific order, for example, by size, or the numbers of passengers the -vehicle can carry. +The order of the list does *not* affect the database in any way. However, it may be preferable to +view the vehicle categories in a specific order, for example, by size, or the number of passengers +the vehicle can carry. .. note:: When used with the **Inventory** app, the :guilabel:`Max Weight` and :guilabel:`Max Volume` fields track a vehicle's capacity. This helps manage in-house deliveries by :doc:`showing how much space and weight remain for loading products <../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch>`. - -.. image:: models/categories.png - :align: center - :alt: List view of the models in the fleet. diff --git a/content/applications/hr/fleet/models/categories.png b/content/applications/hr/fleet/models/categories.png deleted file mode 100644 index d738930a98..0000000000 Binary files a/content/applications/hr/fleet/models/categories.png and /dev/null differ diff --git a/content/applications/hr/fleet/models/manufacturer.png b/content/applications/hr/fleet/models/manufacturer.png new file mode 100644 index 0000000000..3f2e2f981b Binary files /dev/null and b/content/applications/hr/fleet/models/manufacturer.png differ diff --git a/content/applications/hr/fleet/models/vendor.png b/content/applications/hr/fleet/models/vendor.png index e601ad7220..d26cb49ec6 100644 Binary files a/content/applications/hr/fleet/models/vendor.png and b/content/applications/hr/fleet/models/vendor.png differ diff --git a/content/applications/hr/fleet/new_vehicle.rst b/content/applications/hr/fleet/new_vehicle.rst index 827d511b10..5a08b07216 100644 --- a/content/applications/hr/fleet/new_vehicle.rst +++ b/content/applications/hr/fleet/new_vehicle.rst @@ -1,86 +1,151 @@ -============ -New vehicles -============ +=============== +Adding vehicles +=============== -Odoo's *Fleet* app manages all vehicles, and the accompanying documentation that comes with vehicle -maintenance, and drivers records. +Odoo's **Fleet** app manages all vehicles, and the accompanying documentation that comes with +vehicle maintenance and driver records. Upon opening the :menuselection:`Fleet` application, all vehicles are organized within the -:guilabel:`Vehicles` dashboard, which is the default dashboard for the *Fleet* application. Each -vehicle is displayed in its corresponding Kanban stage, based on its status. The default stages are -:guilabel:`New Request`, :guilabel:`To Order`, :guilabel:`Registered`, and :guilabel:`Downgraded`. +:guilabel:`Vehicles` dashboard, which is the default dashboard. Each vehicle is displayed in its +corresponding Kanban stage, based on its status. The default stages are :guilabel:`New Request`, +:guilabel:`To Order`, :guilabel:`Registered`, and :guilabel:`Downgraded`. -To add a new vehicle to the fleet from the :guilabel:`Vehicles` page, click the :guilabel:`New` +.. _fleet/settings: + +Settings +======== + +Before registering any vehicles, review two **Fleet** settings that directly affect day-to-day +operations and employee benefits: + +- :ref:`End Date Contract Alert ` — emails the contract's *Responsible* person a + set number of days before the vehicle agreement expires, so renewals or returns aren't missed. +- :ref:`New Vehicle Request ` — (Belgian Payroll localization only) blocks employees + from requesting a new company car through the salary configurator, once the available vehicles + already exceeds the defined limit, helping control benefits costs. + +To access the settings menu, go to :menuselection:`Fleet app --> Configuration --> Settings`. + +.. _fleet/end-contract: + +End Date Contract Alert +----------------------- + +The :guilabel:`End Date Contract Alert` field shows how many days before the end of a vehicle +contract an alert should be sent. The :ref:`responsible parties ` receive an +email informing them that a vehicle contract is about to expire in the number of days defined in +this field. + +.. image:: new_vehicle/fleet-settings.png + :alt: Settings available for the Fleet application. + +.. _fleet/responsible: + +Responsible parties +~~~~~~~~~~~~~~~~~~~ + +To determine the responsible person is for a contract, open an individual contract. The person +listed as :guilabel:`Responsible` under the :guilabel:`Contract Information` section of the contract +receives the alert. + +To open a contract from a list of all contracts, navigate to :menuselection:`Fleet app --> Fleet --> +Contracts` and all contracts appear in the list. Click on a :guilabel:`Contract` to open it. In the +:guilabel:`Information` section of the contract, look under :guilabel:`Responsible` to see who +receives expiration alerts. + +An individual contract can also be opened from a specific vehicle by navigating to +:menuselection:`Fleet app --> Fleet --> Fleet` and clicking on an individual vehicle. On the vehicle +form, click the :guilabel:`Contracts` smart button at the top of the page. Only contracts associated +with the vehicle appear in the list. Click on an individual contract to open it. The +:guilabel:`Responsible` person is listed on the contract. + +.. _fleet/request: + +New Vehicle Request (Belgian Payroll - Fleet) +--------------------------------------------- + +Enter the maximum fleet size that may be reached through the salary-configurator flow. When the +total number of available vehicles (vehicles without an assigned driver) is equal to or below this +limit, employees can request a new company car. Once the available vehicles exceeds the limit, the +request option is hidden. + +.. example:: + If the :guilabel:`New Vehicle Request` limit is set to 20 vehicles, and there are 25 vehicles + available, employees cannot request a new car and must select from the 25 already available. If + there are only 10 cars available, then the employee would be able to request a new vehicle. + +.. note:: + This settings option **only** appears if the :guilabel:`Belgian-Payroll-Fleet` module is + installed for the Belgian localization. + +Add a vehicle +============= + +To add a new vehicle to the fleet from the :guilabel:`Vehicles` dashboard, click the :guilabel:`New` button in the top-left corner, and a blank vehicle form loads. Then, proceed to enter the vehicle information on the vehicle form. -The form auto-saves as data is entered. However, the form can be saved manually at any time by -clicking the *save manually* option, represented by a :guilabel:`(cloud upload)` icon, located in -the top-left corner of the page. - .. _fleet/new_vehicle/vehicle-form: Vehicle form fields =================== -- :guilabel:`Model`: select the vehicle's model from the drop-down menu. Once a model is selected, - additional fields may appear on the form. - - If the model is not listed, type in the model name, and click either :guilabel:`Create "model"`, - or :guilabel:`Create and edit...` to :ref:`create a new model and edit the model details - `. -- :guilabel:`License Plate`: enter the vehicle's license plate number in this field. -- :guilabel:`Tags`: select any tags from the drop-down menu, or type in a new tag. There is no limit +- :guilabel:`Model`: Using the drop-down menu, select the vehicle's model. Once a model is selected, + additional fields may appear on the form. If the model is not listed, type in the model name, and + click either :guilabel:`Create "model"`, or :guilabel:`Create and edit...` to :ref:`create a new + model and edit the model details `. +- :guilabel:`License Plate`: Enter the vehicle's license plate number. +- :guilabel:`Tags`: Select any tags from the drop-down menu, or type in a new tag. There is no limit on the amount of tags that can be selected. .. image:: new_vehicle/model.png - :align: center :alt: The new vehicle form, showing the model section. .. note:: - The :guilabel:`Model` is the only required field on the new vehicle form. When a model is + The :guilabel:`Model` is the *only* required field on the new vehicle form. When a model is selected, other fields appear on the vehicle form, and relevant information auto-populates the fields that apply to the model. If some of the fields do not appear, this may indicate there is no model selected. .. _fleet/new_vehicle/new-driver: -Driver section --------------- +Driver +------ This section of the vehicle form relates to the person who is currently driving the car, as well as any plans for a change in the driver in the future, and when. -- :guilabel:`Driver`: select the driver from the drop-down menu, or type in a new driver and click - either :guilabel:`Create "driver"` or :guilabel:`Create and edit...` to :ref:`create a new driver, - and edit the driver details `. +- :guilabel:`Driver`: Using the drop-down menu, select the driver for the vehicle. If the driver is + not listed, :ref:`create the new driver, and edit the driver details + `. .. important:: - A driver does **not** have to be an employee. When creating a new driver, the driver is added - to the *Fleet* application, **not** the *Employees* application. + A driver does *not* have to be an employee. When creating a new driver, the driver is added to + the **Fleet** app, *not* the **Employees** app. - If the *Contacts* application is installed, the driver information is also stored in the - *Contacts* application. + If the **Contacts** app is installed, the driver information is also stored there. -- :guilabel:`Mobility Card`: if the selected driver has a mobility card listed on their employee - card in the *Employees* application, the mobility card number appears in this field. If there is - no mobility card listed, and one should be added, :ref:`edit the employee record - ` in the *Employees* application. -- :guilabel:`Future Driver`: if the next driver for the vehicle is known, select the next driver +- :guilabel:`Mobility Card`: If the selected driver has a mobility card (such as a gas card) listed + on their employee record in the **Employees** application, the mobility card number automatically + appears in this field. If there is no mobility card listed, and one should be added, :ref:`edit + the employee record ` in the **Employees** application. +- :guilabel:`Future Driver`: If the next driver for the vehicle is known, select the next driver from the drop-down menu. Or, type in the next driver and click either :guilabel:`Create "future driver"` or :guilabel:`Create and edit...` to :ref:`create a new future driver, and edit the driver details `. -- :guilabel:`Plan To Change Car`: if the current driver set for this vehicle plans to change their - vehicle - either because they are waiting on a new vehicle that is being ordered, or this is a - temporary vehicle assignment, and they know which vehicle they are driving next - check this box. - Do **not** check this box if the current driver does not plan to change their vehicle. -- :guilabel:`Assignment Date`: using the drop-down calendar, select when the vehicle is available - for another driver. Select the date by navigating to the correct month and year using the - :guilabel:`⬅️ (left arrow)` and :guilabel:`➡️ (right arrow)` icons. Then, click on the specific - day. If this field is left blank, that indicates the vehicle is currently available, and can be - reassigned to another driver. If it is populated, the vehicle is not available for another driver - until the selected date. -- :guilabel:`Company`: select the company from the drop-down menu. This field only appears in a + + .. note:: + If this field is populated, a :guilabel:`Apply New Driver` button appears on the vehicle form. + Click the :guilabel:`Apply New Driver` button to change the driver information. + +- :guilabel:`Plan To Change Car`: Tick this box when the current driver already knows they'll switch + to another vehicle, whether they are awaiting an ordered car, using this one only temporarily, or + are leaving the company. +- :guilabel:`Assignment Date`: Using the calendar selector, select when the vehicle is available for + another driver. If this field is left blank, that indicates the vehicle is currently available, + and can be assigned to another driver. If it is populated, the vehicle is not available for + another driver until the selected date. +- :guilabel:`Company`: Select the company from the drop-down menu. This field only appears in a multi-company database. .. _fleet/new_vehicle/add-driver: @@ -96,185 +161,51 @@ First, type in the name of the new driver in either the :guilabel:`Driver` or :g Driver` field, then click :guilabel:`Create and edit...`. A :guilabel:`Create Driver` or :guilabel:`Create Future Driver` form appears, depending on which field initiated the form. -Both the :guilabel:`Create Driver` and :guilabel:`Create Future Driver` forms are identical. - -.. _fleet/new_vehicle/general-info: +Both the :guilabel:`Create Driver` and :guilabel:`Create Future Driver` forms are identical, and are +stored in the **Contacts** app. :doc:`Configure the new contact <../../essentials/contacts>`, then +click :guilabel:`Save & Close`. .. note:: Depending on the installed applications, different tabs or fields may be visible on the :guilabel:`Create Driver` and :guilabel:`Create Future Driver` forms. -General information -******************* - -Fill out the following information on the top-half of the form: - -- :guilabel:`Individual` or :guilabel:`Company`: choose if the driver being added is an individual - driver or a company. Click the radio button to make a selection. - - When a selection is made, some fields may disappear from the form. If any of the fields below are - not visible, that is because :guilabel:`Company` was selected instead of :guilabel:`Individual`. -- :guilabel:`Name`: enter the name of the driver or company in this field. -- :guilabel:`Company Name...`: using the drop-down menu, select the company the driver is associated - with. - - If the :guilabel:`Company` radio button is selected at the top of the form, this field does not - appear. -- :guilabel:`Contact`: enter the contact information in this section. - - If desired, the :guilabel:`Contact` field can be changed to a different type of contact. Click on - :guilabel:`Contact` to reveal a drop-down menu. The available options to select are - :guilabel:`Contact`, :guilabel:`Invoice Address`, :guilabel:`Delivery Address`, - :guilabel:`Follow-up Address`, or :guilabel:`Other Address`. - - If desired, select one of these other options for the :guilabel:`Contact` field, and enter the - corresponding information. - - If the :guilabel:`Company` radio button is selected at the top of the form, this field is labeled - :guilabel:`Address` and cannot be modified. - -- :guilabel:`Tax ID`: enter the driver or company's tax ID in this field. -- :guilabel:`Job Position`: enter the driver's job position in this field. If the - :guilabel:`Company` radio button is selected at the top of the form, this field does not appear. -- :guilabel:`Phone`: enter the driver or company's phone number in this field. -- :guilabel:`Mobile`: enter the driver or company's mobile number in this field. -- :guilabel:`Email`: enter the driver or company's email address in this field. -- :guilabel:`Website`: enter the driver or company's website address in this field. -- :guilabel:`Title`: using the drop-down menu, select the driver's title in this field. The default - options are :guilabel:`Doctor`, :guilabel:`Madam`, :guilabel:`Miss`, :guilabel:`Mister`, and - :guilabel:`Professor`. - - If the :guilabel:`Company` radio button is selected at the top of the form, this field does not - appear. -- :guilabel:`Tags`: using the drop-down menu, select any tags that apply to the driver or company. - - To add a new tag, type in the tag, then click :guilabel:`Create "tag"`. - - There is no limit to the number of tags that can be selected. - -.. image:: new_vehicle/create-driver.png - :align: center - :alt: The top portion of the create driver form. - -Contacts & Addresses tab -************************ - -After completing the top-half of the :guilabel:`Create Driver` or :guilabel:`Create Future Driver` -form, add any other contacts and addresses associated with the driver or company in this tab. - -To add a new contact, click the :guilabel:`Add` button, and a :guilabel:`Create Contact` pop-up -window appears. - -Before entering the necessary information on the form, select the type of contact being added from a -series radio button options located at the top of the form. Those options are: - -- :guilabel:`Contact`: select this option to add general contact details for employees of the - associated company. -- :guilabel:`Invoice Address`: select this option to add a preferred address for all invoices. When - added to the form, this address is selected by default when sending an invoice to the associated - company. -- :guilabel:`Delivery Address`: select this option to add a preferred address for all deliveries. - When added to the form, this address is selected by default when delivering an order to the - associated company. -- :guilabel:`Follow-up Address`: select this option to add a preferred address for all follow-up - correspondence. When added to the form, this address is selected by default when sending reminders - about overdue invoices. -- :guilabel:`Other Address`: select this option to add any other necessary addresses for the company - or driver. - -.. image:: new_vehicle/create-contact.png - :align: center - :alt: The create contact form with all parts filled in. - -Depending on the :guilabel:`Contact Type`, some optional fields may not be visible. The available -fields are identical to the fields in the :ref:`general information -` section of the new driver form. - -Add any notes to the :guilabel:`Internal notes...` section of the form. - -After entering all of the information, click either :guilabel:`Save & Close` to add the one new -contact, or :guilabel:`Save & New` to add the current address record and create another address -record. - -As contacts are added to this tab, each contact appears in a separate box, with an icon indicating -what type of contact is listed. - -.. example:: - An :guilabel:`Invoice Address` displays a :guilabel:`💲 (dollar sign)` icon inside that specific - address box, whereas a :guilabel:`Delivery Address` displays a :guilabel:`🚚 (truck)` icon - inside. - - .. image:: new_vehicle/contacts-address.png - :align: center - :alt: The create contact form with all parts filled in. - -Sales & Purchase tab -******************** - -Enter the following sales and purchasing information, in the :guilabel:`Sales & Purchase` tab of the -:guilabel:`Create Driver` or :guilabel:`Create Future Driver` pop-up form for the various sections -below. - -Depending on the other installed applications, additional fields and sections may appear. The -following are all default fields for the *Fleet* application **only**. - -Sales section -^^^^^^^^^^^^^ - -- :guilabel:`Salesperson`: using the drop-down menu, select the user who is the main point of - contact for sales with this driver's company. - - This person **must** be an internal user of the company, meaning they can log into the database as - a user. - -Misc -^^^^ - -- :guilabel:`Company ID`: if the company has an ID number, **other than** its *tax ID*, enter it in - this field. -- :guilabel:`Reference`: enter any text to give more information regarding the contact person. This - is an internal note to provide any additional information. - - .. example:: - A company has several people with the same name, John Smith. The :guilabel:`Reference` field - could state `John Smith at X205 - purchaser` to provide additional details. - -Internal Notes tab -****************** - -Add any notes that pertain to the driver, or any other necessary information, in this tab. - -Vehicle section ---------------- +.. _fleet/new_vehicle/general-info: -This section of the vehicle form relates to the physical details of the vehicle. +Vehicle +------- -If a preexisting vehicle in the database was selected for the :guilabel:`Model` field in the top -portion of the form, some fields may auto-populate, and additional fields may also appear. +This section captures key physical details of a vehicle. Selecting an existing Model may auto-fill +some fields. Fill in the following fields on the form: -- :guilabel:`Category`: using the drop-down menu, select the vehicle category from the available - options. To create a new category, type in the new category name, then click :guilabel:`Create - "category"`. -- :guilabel:`Order Date`: using the drop-down calendar, select the date the vehicle was ordered. -- :guilabel:`Registration Date`: using the drop-down calendar, select the date the vehicle was - registered. -- :guilabel:`Cancellation Date`: using the drop-down calendar, select the date the vehicle lease - expires, or when the vehicle is no longer available. -- :guilabel:`Chassis Number`: enter the chassis number in the field. This is known in some countries - as the :abbr:`VIN (Vehicle Identification Number)` number. -- :guilabel:`Last Odometer`: enter the last known odometer reading in the number field. Using the +- :guilabel:`Category`: Using the drop-down menu, select the vehicle category from the available + options. If the **Inventory** app is installed, the category affects any configured :doc:`dispatch + management system + <../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch>`. +- :guilabel:`Order Date`: Using the calendar selector, select the date the vehicle was ordered. + Keeping track of how long vehicles have been in the fleet can help when making decisions on + expensive repairs, or help decide when to surrender a vehicle. +- :guilabel:`Registration Date`: Using the calendar selector, select the date the vehicle was + registered. Many regions require proper registration, so keeping track of registration dates is + important. +- :guilabel:`Cancellation Date`: Using the calendar selector, select the date the vehicle lease + expires, or when the vehicle is no longer part of the fleet (e.g., sold, plates surrendered). +- :guilabel:`Chassis Number`: Enter the chassis number in the field. This is known in some countries + as the :abbr:`VIN (Vehicle Identification Number)` number. Every vehicle has a unique number, so + in the event of a theft or accident, a vehicle can be identified with this unique number. +- :guilabel:`Last Odometer`: Enter the last known odometer reading in the number field. Using the drop-down menu next to the number field, select whether the odometer reading is in kilometers - :guilabel:`(km)` or miles :guilabel:`(mi)`. -- :guilabel:`Fleet Manager`: select the fleet manager from the drop-down menu, or type in a new - fleet manager, and click either :guilabel:`Create` or :guilabel:`Create and Edit`. -- :guilabel:`Location`: type in the specific location where the vehicle is typically located in this + :guilabel:`(km)` or miles :guilabel:`(mi)`. Keeping track of a vehicle's mileage is crucial when + determining the value of the vehicle for both tax purposes and resale value. +- :guilabel:`Fleet Manager`: Select the fleet manager from the drop-down menu, or type in a new + fleet manager, and click either :guilabel:`Create` or :guilabel:`Create and edit...`. +- :guilabel:`Location`: Type in the specific location where the vehicle is typically located in this field. The entry should clearly explain where the vehicle can be found, such as `Main Garage` or - `Building 2 Parking Lot`. + `Building 2 Parking Lot`. This is crucial information for companies with many locations where + vehicles are stored. .. image:: new_vehicle/new-vehicle-type.png - :align: center :alt: The new vehicle form, showing the vehicle tax section. Tax Info tab @@ -289,45 +220,52 @@ applications or localization settings. Fiscality ~~~~~~~~~ -- :guilabel:`Horsepower Taxation`: enter the amount that is taxed based on the size of the vehicle's +- :guilabel:`Horsepower Taxation`: Enter the amount that is taxed based on the size of the vehicle's engine. This is determined by local taxes and regulations, and varies depending on the location. It is recommended to check with the accounting department to ensure this value is correct. +- :guilabel:`Disallowed Expenses Rate`: Configure the dates and percentages of the vehicle-related + costs (fuel, maintenance, depreciation, etc.) that **cannot** be deducted from the company's + taxable income. Contract ~~~~~~~~ -- :guilabel:`First Contract Date`: select the start date for the vehicle's first contract using the - drop-down calendar. Typically this is the day the vehicle is purchased or leased. -- :guilabel:`Catalog Value (VAT Incl.)`: enter the MSRP (Manufacturer's Suggested Retail Price) for - the vehicle at the time of purchase or lease. -- :guilabel:`Purchase Value`: enter the purchase price or the value of the lease for the vehicle. -- :guilabel:`Residual Value`: enter the current value of the vehicle. +- :guilabel:`First Contract Date`: Select the start date for the vehicle's first contract using the + calendar selector. Typically this is the day the vehicle is purchased or leased. +- :guilabel:`Catalog Value (VAT Incl.)`: Enter the :abbr:`MSRP (Manufacturer's Suggested Retail + Price)` for the vehicle at the time of purchase or lease. +- :guilabel:`Purchase Value`: Enter the purchase price or the original value of the lease for the + vehicle. +- :guilabel:`Residual Value`: Enter the current value of the vehicle. .. note:: The values listed above affect the accounting department. It is recommended to check with the accounting department for more information and/or assistance with these values. .. image:: new_vehicle/new-vehicle-tax.png - :align: center :alt: The new vehicle form, showing the vehicle tax section. Model tab --------- -If the model for the new vehicle is already configured in the database, the :guilabel:`Model` tab -will be populated with the corresponding information. If the model is not already in the database -and the :guilabel:`Model` tab needs to be configured, :ref:`configure the new vehicle model -`. +If the model for the new vehicle is already configured in the database, the :guilabel:`MODEL` and +:guilabel:`ENGINE` sections are populated with the corresponding information. If the model is *not* +already in the database and the :guilabel:`Model` tab needs to be configured, :ref:`configure the +new vehicle model `. Check the information in the :guilabel:`Model` tab to ensure it is accurate. For example, the color of the vehicle, or if a trailer hitch is installed, are examples of common information that may need updating. -.. image:: new_vehicle/model-tab.png - :align: center - :alt: The new vehicle form, showing the vehicle tax section. - Note tab -------- Enter any notes for the vehicle in this section. + +.. image:: new_vehicle/model-tab.png + :alt: The new vehicle form, showing the vehicle tax section. + +.. seealso:: + - :doc:`../fleet/models` + - :doc:`../fleet/service` + - :doc:`../fleet/accidents` diff --git a/content/applications/hr/fleet/new_vehicle/contacts-address.png b/content/applications/hr/fleet/new_vehicle/contacts-address.png deleted file mode 100644 index 1ec4d8c7e3..0000000000 Binary files a/content/applications/hr/fleet/new_vehicle/contacts-address.png and /dev/null differ diff --git a/content/applications/hr/fleet/new_vehicle/create-contact.png b/content/applications/hr/fleet/new_vehicle/create-contact.png deleted file mode 100644 index 52b8935e42..0000000000 Binary files a/content/applications/hr/fleet/new_vehicle/create-contact.png and /dev/null differ diff --git a/content/applications/hr/fleet/new_vehicle/create-driver.png b/content/applications/hr/fleet/new_vehicle/create-driver.png deleted file mode 100644 index 50a3b097c9..0000000000 Binary files a/content/applications/hr/fleet/new_vehicle/create-driver.png and /dev/null differ diff --git a/content/applications/hr/fleet/fleet-settings.png b/content/applications/hr/fleet/new_vehicle/fleet-settings.png similarity index 100% rename from content/applications/hr/fleet/fleet-settings.png rename to content/applications/hr/fleet/new_vehicle/fleet-settings.png diff --git a/content/applications/hr/fleet/new_vehicle/model-tab.png b/content/applications/hr/fleet/new_vehicle/model-tab.png index 265f026afa..0f5eb55d39 100644 Binary files a/content/applications/hr/fleet/new_vehicle/model-tab.png and b/content/applications/hr/fleet/new_vehicle/model-tab.png differ diff --git a/content/applications/hr/fleet/new_vehicle/model.png b/content/applications/hr/fleet/new_vehicle/model.png index e38b5af00d..736e748e4b 100644 Binary files a/content/applications/hr/fleet/new_vehicle/model.png and b/content/applications/hr/fleet/new_vehicle/model.png differ diff --git a/content/applications/hr/fleet/new_vehicle/new-vehicle-tax.png b/content/applications/hr/fleet/new_vehicle/new-vehicle-tax.png index 87b2b95258..d238ccbd17 100644 Binary files a/content/applications/hr/fleet/new_vehicle/new-vehicle-tax.png and b/content/applications/hr/fleet/new_vehicle/new-vehicle-tax.png differ diff --git a/content/applications/hr/fleet/new_vehicle/new-vehicle-type.png b/content/applications/hr/fleet/new_vehicle/new-vehicle-type.png index ded83bd900..d11de154ee 100644 Binary files a/content/applications/hr/fleet/new_vehicle/new-vehicle-type.png and b/content/applications/hr/fleet/new_vehicle/new-vehicle-type.png differ diff --git a/content/applications/hr/fleet/service.rst b/content/applications/hr/fleet/service.rst index 4b5014d26a..34383cf36e 100644 --- a/content/applications/hr/fleet/service.rst +++ b/content/applications/hr/fleet/service.rst @@ -6,6 +6,9 @@ To properly maintain a fleet of vehicles, regular maintenance as well as periodi needed. Scheduling repairs and managing services for an entire fleet is necessary to ensure all vehicles are in good working order when they are needed. +Services, such as regular maintenance, like oil changes or tire rotations, can be logged in advance. +Other repairs are logged as they occur. + .. _fleet/service-form: Create service records @@ -18,54 +21,48 @@ To log a service for a vehicle, go to the main :guilabel:`Services` dashboard by Fill out the information on the form. The only two fields that are required to be populated are :guilabel:`Service Type` and :guilabel:`Vehicle`. -The service form automatically saves as data is entered. However, the form can be saved manually at -any time by clicking the :guilabel:`Save manually` option, represented by a :guilabel:`(cloud -upload)` icon. - The fields on the form are: -- :guilabel:`Description`: enter a brief description of the service. -- :guilabel:`Service Type`: select the type of service performed using the drop-down menu. Or, enter - a new type of service, and click either :guilabel:`Create "service type"` or :guilabel:`Create and - edit...` to :ref:`add the service type and configure it `. +- :guilabel:`Description`: Enter a brief description of the service in this field. +- :guilabel:`Service Type`: Using the drop-down menu, select the type of service performed. If the + desired service does not exist, enter a new type of service, and click either :guilabel:`Create + "(service type)"` or :guilabel:`Create and edit...` to :ref:`add the service type and configure it + `. .. important:: - :guilabel:`Service Types` are **not** pre-configured in Odoo. When logging a service for the - first time, the *type* of service needs to be :ref:`created ` before it can be - selected. - -- :guilabel:`Date`: using the calendar popover window, select the date the service was provided, or - is scheduled to be performed. Navigate to the desired month using the :guilabel:`< > (arrow)` - icons, then click on the date to select it. -- :guilabel:`Cost`: enter the cost of the service. -- :guilabel:`Vendor`: select the vendor who performed the service using the drop-down menu. If the - vendor has not already been entered in the system, type in the vendor name, and click either - :guilabel:`Create` to add them, or :guilabel:`Create and edit...` to :ref:`add and configure the - vendor `. -- :guilabel:`Vehicle`: select the vehicle that was serviced from the drop-down menu. When the + Only one :guilabel:`Service Type` comes preconfigured in Odoo: :guilabel:`Vendor Bill`. + +- :guilabel:`Date`: Using the calendar selector, select the date the service was provided, or is + scheduled to be performed. Navigate to the desired month using the :icon:`oi-chevron-left` + :icon:`oi-chevron-right` :guilabel:`(arrow)` icons, then click on the date to select it. +- :guilabel:`Cost`: Enter the estimated cost of the service, if available. If the service is for a + future repair, this field should be left blank. This field is updated as estimates are received, + and again, when the final repair cost is known. +- :guilabel:`Vendor`: Using the drop-down menu, select the vendor who is performing the service. If + the vendor has not already been entered in the system, :ref:`add and configure the vendor + `. +- :guilabel:`Vehicle`: Using the drop-down menu, select the vehicle that was serviced. When the vehicle is selected, the :guilabel:`Driver` field is populated, and the unit of measure for the :guilabel:`Odometer Value` field appears. -- :guilabel:`Driver`: the current driver listed for the selected vehicle is populated when the +- :guilabel:`Driver`: The vehicle's current driver automatically populates this field when the :guilabel:`Vehicle` is selected. If the driver needs to be changed, another driver can be selected - from the drop-down menu. -- :guilabel:`Odometer Value`: enter the odometer reading when the service was done. The units of - measure are either in kilometers (:guilabel:`km`) or miles (:guilabel:`mi`), depending on how the - selected vehicle was configured. - - When the :guilabel:`Vehicle` is selected, the unit of measure for this field is populated. This - comes from the vehicle form. + using the drop-down menu. +- :guilabel:`Odometer Value`: Enter the odometer reading from when the service was done. The units + of measure are either in kilometers (:guilabel:`km`) or miles (:guilabel:`mi`), depending on how + the selected vehicle was configured. .. tip:: - To change from kilometers to miles, or vice versa, click the :guilabel:`Internal Link` button - to the right of the vehicle selected in the :guilabel:`Vehicle` field. + To change from kilometers to miles, or vice versa, click the :icon:`oi-arrow-right` + :guilabel:`(Internal Link)` icon to the right of the vehicle selected in the :guilabel:`Vehicle` + field. Change the unit of measure, then navigate back to the service form, via the breadcrumb links. The unit of measure is then updated in the :guilabel:`Odometer Value` field. -- :guilabel:`Notes`: enter any notes for the repair at the bottom of the service form. +- :guilabel:`NOTES`: Enter any notes for the repair at the bottom of the service form. For example, + this can include estimate details or parts being replaced. .. image:: service/new-service.png - :align: center :alt: Enter the information for a new service. The required fields are Service Type and Vehicle. .. _fleet/new-type: @@ -73,8 +70,7 @@ The fields on the form are: Create service type ------------------- -Service types must be created from a service form. There is no other way to access the list of -service types. +The **only** method to create service types is from a :ref:`service form `. On the :ref:`service form `, type in the name of the new :guilabel:`Service Type` in the corresponding field. Then, click :guilabel:`Create and edit...`, and a @@ -98,163 +94,19 @@ When done, click :guilabel:`Save & Close`. Create vendor ------------- -When a service is done for the first time, typically, the vendor is not in the database yet. It is -best practice to add the full details for a vendor in the database, so that any necessary -information can be easily retrieved. +When a service is performed for the first time, typically, the vendor's record has not yet been +added to the database. It is best practice to add the full details for a vendor in the database, so +that any necessary information can be retrieved. -On the :ref:`service form `, type in the name of the new :guilabel:`Vendor` in -the corresponding field. Then, click :guilabel:`Create and edit...`, and a :guilabel:`Create -Vendor` form appears. - -The vendor name entered on the service form populates the :guilabel:`Name` field, by default. This -field can be modified, if desired. +Vendors are added with the **Contacts** app. Refer to the :doc:`documentation +<../../essentials/contacts>` for more details. .. note:: Different tabs or fields may be visible on the :guilabel:`Create Vendor` form, depending on what other applications are installed. -General information -~~~~~~~~~~~~~~~~~~~ - -Fill out the following information in the top-half of the form: - -- :guilabel:`Individual` or :guilabel:`Company`: select whether the new vendor being added is an - individual or a company, by clicking the corresponding radio button. - - When a selection is made, some fields may disappear from the form. If any of the fields below are - not visible, that is because :guilabel:`Company` was selected, instead of :guilabel:`Individual`. -- :guilabel:`Name`: enter a name for the individual or company in this field. -- :guilabel:`Company Name`: using the drop-down menu, select the company that the vendor is - associated with, if any. - - If the :guilabel:`Company` radio button at the top of the form is selected, this field does not - appear. -- :guilabel:`Contact`: enter the contact information in this section. - - If desired, the :guilabel:`Contact` field can be changed to a different type of contact. Click on - :guilabel:`Contact` to reveal a drop-down menu. The available options to select are - :guilabel:`Contact`, :guilabel:`Invoice Address`, :guilabel:`Delivery Address`, - :guilabel:`Follow-up Address`, or :guilabel:`Other Address`. - - If desired, select one of these other options for the :guilabel:`Contact` field, and enter the - corresponding information. - - If :guilabel:`Company` is selected for the :guilabel:`Individual` or :guilabel:`Company` field, - this field is labeled :guilabel:`Address`, and **cannot** be modified. - -- :guilabel:`Tax ID`: enter the vendor's tax ID in this field. -- :guilabel:`Job Position`: enter the vendor's job position in this field. If the - :guilabel:`Company` radio button at the top of the form is selected, this field does not appear. -- :guilabel:`Phone`: enter the vendor's phone number in this field. -- :guilabel:`Mobile`: enter the vendor's mobile number in this field. -- :guilabel:`Email`: enter the vendor's email address in this field. -- :guilabel:`Website`: enter the vendor's website address in this field. -- :guilabel:`Title`: using the drop-down menu, select the vendor's title in this field. The default - options are :guilabel:`Doctor`, :guilabel:`Madam`, :guilabel:`Miss`, :guilabel:`Mister`, and - :guilabel:`Professor`. - - If the :guilabel:`Company` radio button at the top of the form is selected, this field does not - appear. -- :guilabel:`Tags`: using the drop-down menu, select any tags that apply to the vendor. - - To add a new tag, type in the tag, then click :guilabel:`Create "tag"`. - - There is no limit to the number of tags that can be selected. -- :guilabel:`Image`: a photo of either the main contact person, or the company logo, can be added to - the form. Hover over the :guilabel:`📷 (camera)` box, in the top-right of the form, to reveal a - :guilabel:`✏️ (pencil)` icon, and click it. A file explorer window appears. Navigate to the - desired file, then click :guilabel:`Open` to select it. - -.. image:: service/create-vendor.png - :align: center - :alt: The top portion of the create vendor form. - -Contacts & Addresses tab -************************ - -After the top-half of the :guilabel:`Create Vendor` form is filled out, add any other contacts and -addresses associated with the vendor in this tab. - -Click the :guilabel:`Add` button to add a new contact, and a :guilabel:`Create Contact` pop-up -window appears. - -Select one of the appropriate contact type options from the radio buttons, located at the top of the -pop-up window. Those options are as follows: - -- :guilabel:`Contact`: select this option to add general contact details for employees of the - associated vendor. -- :guilabel:`Invoice Address`: select this option to add a preferred address for all invoices. When - added to the form, this address is selected by default when sending an invoice to the associated - vendor. -- :guilabel:`Delivery Address`: select this option to add a preferred address for all deliveries. - When added to the form, this address is selected by default when delivering an order to the - associated vendor. -- :guilabel:`Follow-up Address`: select this option to add a preferred address for all follow-up - correspondence. When added to the form, this address is selected by default when sending reminders - about overdue invoices. -- :guilabel:`Other Address`: select this option to add any other necessary addresses for the vendor. - -.. image:: service/vendor-contact.png - :align: center - :alt: The create contact form with all parts filled in. - -.. note:: - If an option *other than* :guilabel:`Contact` is selected for the contact type, an - :guilabel:`Address` section appears on the form. Enter the address details in the - :guilabel:`Address` section. - -Add any notes to the :guilabel:`Internal notes...` section of the form. - -After all of the information is added, click either :guilabel:`Save & Close` to add the one new -contact, or :guilabel:`Save & New` to add the current address record and create another address -record. - -As contacts are added to this tab, each contact appears in a separate box, with an icon indicating -what type of contact is listed. - -.. example:: - A :guilabel:`Delivery Address` displays a :guilabel:`⛟ (truck)` icon inside that specific address - box, whereas an :guilabel:`Invoice Address` displays a :guilabel:`💵 (dollar bill)` icon inside. - - .. image:: service/contact-tab.png - :align: center - :alt: The create contact form with all parts filled in. - -Sales & Purchase tab -******************** - -Enter the following sales and purchasing information for the various sections below. Depending on -the other installed applications, additional fields and sections may appear. The following are all -default fields for the *Fleet* application only. - -Sales -^^^^^ - -- :guilabel:`Salesperson`: using the drop-down menu, select a user as the main point of contact for - sales with this vendor. - - This person **must** be an internal user of the company, meaning they can log into the database as - a user. - -Misc -^^^^ - -- :guilabel:`Company ID`: if the company has an ID number **other than** its *tax ID*, enter it in - this field. -- :guilabel:`Reference`: enter any text to give more information regarding the contact. This is an - internal note to provide any additional information. - - .. example:: - A company has several people with the same name, Mary Jones. The :guilabel:`Reference` field - could state `Mary Jones at X108 - returns` to provide additional details. - -Internal Notes tab -****************** - -Add any notes that pertain to the vendor, or any other necessary information, in this tab. - -List of services -================ +View services +============= To view all services logged in the database, including old and new requests, navigate to :menuselection:`Fleet app --> Fleet --> Services`. All services appear in a list view, including all @@ -283,236 +135,4 @@ Each service listed displays the following information: At the bottom of the :guilabel:`Cost` column, the total cost of all services and repairs are listed. .. image:: service/services.png - :align: center :alt: The full list of services in the Odoo database. - -View services -------------- - -It is recommended to view the list of services in one of several pre-configured ways to better view -the information presented. In the top-right corner of the list, there are several icons that when -clicked, sort the data in different ways. - -.. image:: service/views.png - :align: center - :alt: The icons in the top right corner than can be clicked to present the information in - different ways. - -List view -~~~~~~~~~ - -The default view of the service records is a list view. This presents all the services, first -grouped alphabetically by type of service, then grouped by status. - -The information can be re-sorted by any column. At the top of each column, hover over the column -name, and an arrow appears in the far-right of that column. Click the arrow to sort the data by that -specific column. - -The default sorting is in descending alphabetical order (A to Z), represented by a :guilabel:`⌄ -(down arrow)` icon. Click the :guilabel:`⌄ (down arrow)` icon to reverse the alphabetical order (Z -to A). The :guilabel:`⌄ (down arrow)` icon changes to an :guilabel:`^ (up arrow)` icon. - -The two exceptions to this sorting are the default :guilabel:`Date` column and the :guilabel:`Cost` -column. The :guilabel:`Date` column sorts the information in chronological order (January to -December), instead of alphabetical order. The :guilabel:`Cost` column sorts the information by -repair price, from lowest to highest. - -Add a service -************* - -To add a service record from the list view, click the :guilabel:`New` button, and a service form -loads. :ref:`Enter all the information ` on the service form. - -The form automatically saves as data is entered. - -Kanban view -~~~~~~~~~~~ - -To view services by their stage, click the :guilabel:`Kanban` button, which is the second icon in -the top-right corner, and appears as two different length bars beneath a line. - -All services are organized by service type, and appear in the corresponding Kanban column. - -The number of repairs for each type of service appears in the far-right of each Kanban column -header. - -The collective status of the scheduled activities for each service type appears in the color-coded -bar beneath each Kanban column title. Repairs with activities scheduled in the future appear green, -activities due today appear yellow, overdue activities appear red, and repairs with no activities -scheduled appear gray. - -Each Kanban card displays a color-coded activity-related icon, such as a :guilabel:`🕘 (clock)` icon -or :guilabel:`📞 (phone)` icon, for example. These icons indicate both the type of scheduled -activity and the status. The status of the activity corresponds to the colors in the status bar. -Click on an activity icon to view the details of that specific activity. - -The length of the color bar is proportionate to the number of corresponding activities with that -specific status in that particular stage. Hover over a color section to reveal the number of service -records in that specific grouping. - -.. image:: service/kanban.png - :align: center - :alt: The service records presented in a Kanban view. - -To view **only** the records with a specific status, click the desired color bar section. The -background color for the column changes to a pale hue of the same color (either green, yellow, red, -or gray), and the color bar appears striped instead of solid. **Only** repairs and services with the -selected status appear in the column. - -.. image:: service/kanban-status.png - :align: center - :alt: The oil change service records showing only repairs with past-due activities. - -.. _fleet/schedule-activity: - -Schedule activities -******************* - -To schedule an activity for a repair or service from the Kanban view, click the activity icon in the -lower-right corner of the service record, and click :guilabel:`+ Schedule an activity`. A -:guilabel:`Schedule Activity` pop-up window appears. - -.. note:: - Depending on what kind of activity, if any, is scheduled, the activity icon may appear - differently. For example, a :guilabel:`📞 (phone)` appears if a phone call is scheduled, or an - :guilabel:`✉️ (envelope)` appears if an email is scheduled. - -Enter the following information on the form: - -- :guilabel:`Activity Type`: using the drop-down menu, select the activity being scheduled. The - default options are :guilabel:`Email`, :guilabel:`Call`, :guilabel:`Meeting`, :guilabel:`To-Do`, - and :guilabel:`Upload Document`. -- :guilabel:`Summary`: enter a short description of the activity, such as `Schedule oil change`. -- :guilabel:`Due Date`: using the calendar popover, select the date the activity must be completed. - Using the :guilabel:`< (left)` and :guilabel:`> (right)` arrow icons, navigate to the desired - month, then click on the date to select it. -- :guilabel:`Assigned to`: using the drop-down menu, select the user responsible for the activity. -- :guilabel:`Notes`: add any notes or details in the blank area in the bottom-half of the form. - -When the :guilabel:`Schedule Activity` is completed, click :guilabel:`Schedule` to schedule the -activity, or click :guilabel:`Done & Schedule Next` to schedule the current activity and schedule -another activity for the same repair. - -.. seealso:: - For more detailed information regarding activities, refer to the main :doc:`activities - <../../essentials/activities>` document. - -Add a service -************* - -A new repair can be added from this view. Click the :guilabel:`➕ (plus icon)` in the top-right -corner of the Kanban column, and a new block appears at the top of the column, beneath the Kanban -title. - -Enter a :guilabel:`Title` for the service or repair, then click :guilabel:`Add`. A -:guilabel:`Create` service form appears in a pop-up window. :ref:`Enter all the information -` on the service form, then click :guilabel:`Save & Close` to add the record. -The new record now appears in the Kanban column. - -Graph view -~~~~~~~~~~ - -Another way to view the data is in a graph. To change to the graph view, click the :guilabel:`Graph` -icon, which is the third icon in the top-right, and appears as a small graph. - -The default graph view displays the service information in a stacked bar chart, grouped by -:guilabel:`Service Type`. The X-axis represents the :guilabel:`Service Type` and the Y-axis -represents the :guilabel:`Cost`. - -Each column visually represents the total cost for all repairs and services for that specific -:guilabel:`Service Type`. Hover over any bar to reveal a popover window that displays the total -:guilabel:`Cost` for the service and repairs the bar represents. - -The graph can change to either a :guilabel:`Line Chart` or a :guilabel:`Pie Chart` by clicking the -corresponding button above the graph. Additionally, the graph can display the data in either -:guilabel:`Stacked`, :guilabel:`Descending`, or :guilabel:`Ascending` order, by clicking the -corresponding buttons. - -.. image:: service/bar-chart.png - :align: center - :alt: A bar chart view of the services and repairs, with the various option buttons highlighted. - -Pivot view -~~~~~~~~~~ - -Another way to view the service data is in a spreadsheet pivot table. Click the :guilabel:`Pivot` -icon, which is the fourth icon in the top-right, and appears as a small spreadsheet. - -The default way the data is presented shows the total cost of each type of service. The horizontal -rows represent the various types of service, with a different service type in its own line. The -vertical columns represent the total costs for each specific type of service, further divided by the -type of service. - -.. image:: service/pivot.png - :align: center - :alt: The default pivot table view of the services. - -The table can either be inserted in a spreadsheet or downloaded, if desired. - -To add the pivot table to a spreadsheet in Odoo, first, the appearance of the pivot table must -change. The default pivot table view does not allow it to be inserted into a spreadsheet (the -:guilabel:`Insert in Spreadsheet` button is grayed out). - -First, click the :guilabel:`➖ (minus)` icon to the left of :guilabel:`Total` at the top of the pivot -table. This collapses the service types, leaving only a single :guilabel:`Cost` column visible. - -Then, click the :guilabel:`Insert in Spreadsheet` button, which is no longer grayed out, and a -:guilabel:`Select a spreadsheet to insert your pivot` pop-up window appears. Two tabs are visible in -this pop-up window, a :guilabel:`Spreadsheets` tab and a :guilabel:`Dashboards` tab. - -Click the desired tab to indicate where the spreadsheet should be placed, either in a -:guilabel:`Spreadsheet` or on a :guilabel:`Dashboard`. After clicking the desired option, click -:guilabel:`Confirm`. The spreadsheet then loads on the screen. - -.. note:: - Spreadsheets are stored in Odoo's *Documents* application, while dashboards are stored in Odoo's - *Dashboards* application. - -Click :guilabel:`Services` in the top-left corner to navigate back to the previous pivot table view. - -To download the table in an *xlsx* format, click the download xlsx icon, represented by a -:guilabel:`⬇️ (down arrow above a line)` icon. - -.. seealso:: - For more detailed information regarding reporting, refer to the main :doc:`reporting - <../../essentials/reporting>` document. - -Activity view -~~~~~~~~~~~~~ - -To view the scheduled activities for services or repairs, click the :guilabel:`🕗 (clock)` activity -icon in the top-right corner of the screen. This presents all activities, organized by vehicle and -activity type. - -The vertical columns are organized by activity type, and the horizontal lines are organized by -vehicle. - -The entries are color-coded according to the status of each activity. Green activities are scheduled -in the future, yellow activities are due today, and red activities are overdue. - -The user responsible for the activity appears in a photo in the lower-left corner of each activity -entry. - -The due date of each activity is written in the top-center of each activity entry. - -A color-coded bar at the top of each activity column indicates the status of the activities within -that column. - -The number of activities for each activity type is written on the right side of the color-coded bar -beneath the column name. - -.. image:: service/activity-view.png - :align: center - :alt: The activity view, with the columns called out, and an activity box highlighted. - -Schedule an activity -******************** - -To add a service record from the activity view, click :guilabel:`+ Schedule an activity` in the -bottom-left corner of the list, and a :guilabel:`Search: Services` pop-up window loads. Click the -service that the activity is being scheduled for, and a :guilabel:`Schedule Activity` form loads. - -:ref:`Enter all the information ` on the activity form. - -When the form is complete, click the :guilabel:`Schedule` button. Then, both pop-up windows close, -and the activity now appears on the activity view. diff --git a/content/applications/hr/fleet/service/activity-view.png b/content/applications/hr/fleet/service/activity-view.png deleted file mode 100644 index be4fa86021..0000000000 Binary files a/content/applications/hr/fleet/service/activity-view.png and /dev/null differ diff --git a/content/applications/hr/fleet/service/bar-chart.png b/content/applications/hr/fleet/service/bar-chart.png deleted file mode 100644 index 432b6c2589..0000000000 Binary files a/content/applications/hr/fleet/service/bar-chart.png and /dev/null differ diff --git a/content/applications/hr/fleet/service/contact-tab.png b/content/applications/hr/fleet/service/contact-tab.png deleted file mode 100644 index cad578e365..0000000000 Binary files a/content/applications/hr/fleet/service/contact-tab.png and /dev/null differ diff --git a/content/applications/hr/fleet/service/create-vendor.png b/content/applications/hr/fleet/service/create-vendor.png deleted file mode 100644 index 03973be059..0000000000 Binary files a/content/applications/hr/fleet/service/create-vendor.png and /dev/null differ diff --git a/content/applications/hr/fleet/service/kanban-status.png b/content/applications/hr/fleet/service/kanban-status.png deleted file mode 100644 index b150232155..0000000000 Binary files a/content/applications/hr/fleet/service/kanban-status.png and /dev/null differ diff --git a/content/applications/hr/fleet/service/kanban.png b/content/applications/hr/fleet/service/kanban.png deleted file mode 100644 index 20ee1243a4..0000000000 Binary files a/content/applications/hr/fleet/service/kanban.png and /dev/null differ diff --git a/content/applications/hr/fleet/service/new-service.png b/content/applications/hr/fleet/service/new-service.png index 79285e5314..2bce950f1c 100644 Binary files a/content/applications/hr/fleet/service/new-service.png and b/content/applications/hr/fleet/service/new-service.png differ diff --git a/content/applications/hr/fleet/service/pivot.png b/content/applications/hr/fleet/service/pivot.png deleted file mode 100644 index 7ffb43ea53..0000000000 Binary files a/content/applications/hr/fleet/service/pivot.png and /dev/null differ diff --git a/content/applications/hr/fleet/service/services.png b/content/applications/hr/fleet/service/services.png index bdc8986a32..0554e40af3 100644 Binary files a/content/applications/hr/fleet/service/services.png and b/content/applications/hr/fleet/service/services.png differ diff --git a/content/applications/hr/fleet/service/vendor-contact.png b/content/applications/hr/fleet/service/vendor-contact.png deleted file mode 100644 index f52f44f3cd..0000000000 Binary files a/content/applications/hr/fleet/service/vendor-contact.png and /dev/null differ diff --git a/content/applications/hr/fleet/service/views.png b/content/applications/hr/fleet/service/views.png deleted file mode 100644 index b178dc5c21..0000000000 Binary files a/content/applications/hr/fleet/service/views.png and /dev/null differ diff --git a/content/applications/hr/frontdesk.rst b/content/applications/hr/frontdesk.rst index cab7024a30..08832ed56d 100644 --- a/content/applications/hr/frontdesk.rst +++ b/content/applications/hr/frontdesk.rst @@ -17,6 +17,8 @@ Configuration The first item to configure with the **Frontdesk** application is the station, followed by any drink selections that might optionally be offered. +.. _frontdesk/stations: + Stations -------- diff --git a/content/applications/hr/frontdesk/visitors.rst b/content/applications/hr/frontdesk/visitors.rst index 7b7d2c2aa5..aa349d4766 100644 --- a/content/applications/hr/frontdesk/visitors.rst +++ b/content/applications/hr/frontdesk/visitors.rst @@ -2,9 +2,9 @@ Visitors ======== -In the Odoo *Frontdesk* application, a *visitor* is defined as any non-employee (e.g., repair -person, job candidate, etc.). These visitors can be logged upon arrival and departure for security -purposes. This ensures an accurate list of people on the premises. +In the Odoo **Frontdesk** application, a *visitor* refers to any non-employee (e.g., repair person, +job candidate, auditor, etc.). Visitor arrivals and departures can be logged for security purposes, +ensuring an accurate record of who is on the premises. .. _frontdesk/list: @@ -29,15 +29,17 @@ in: - :guilabel:`CheckIn`: the date and time the guest checked in. - :guilabel:`Checkout`\*: the date and time the guest checked out. In the default view, only guests with a :guilabel:`Checked-In` or :guilabel:`Planned` status are visible. Guests with check-out - times are only visible if the :guilabel:`Today` filter is not active. + times are only visible if the :guilabel:`Today` filter is removed. - :guilabel:`Duration`: the amount of time the guest has been checked in for. - :guilabel:`Station`: the location of where the guest checked in. - :guilabel:`Status`: the status of the guest. The options are :guilabel:`Checked-In`, :guilabel:`Planned`, :guilabel:`Checked-Out`, or :guilabel:`Cancelled`. - :guilabel:`Email`\*: the guest's email address. +- :guilabel:`Company`\*: the company the guest is there to visit. This field is only available if in + a multi-company database. -\* These fields are not visible in the default :guilabel:`Visitor` list. These must be enabled -using the :icon:`oi-settings-adjust` :guilabel:`(settings adjust)` icon in the top-right of the +\* These fields are not visible in the default :guilabel:`Visitor` list. These must be enabled using +the :icon:`oi-settings-adjust` :guilabel:`(adjust settings)` icon in the top-right corner of the list. To the far-right of the titled columns on the :guilabel:`Visitors` page, there is an untitled @@ -46,9 +48,9 @@ column, where a guest's status can be updated. When a guest leaves, click the available :guilabel:`Check out` button to update the guest's record, and log the date and time they left. -If a scheduled guest arrives, and they did not check in using the *Frontdesk* kiosk, they can be -checked in here, by clicking the available :guilabel:`Check in` button to log the date and time they -arrived. +If a scheduled guest arrives, and they did not check in using a **Frontdesk** kiosk, they can be +checked in from this list, by clicking the available :guilabel:`Check in` button to log the date and +time they arrived. Beside the untitled status column, a :guilabel:`Drink Served` button appears, but only if that particular visitor requested a drink. @@ -56,19 +58,34 @@ particular visitor requested a drink. When their drink has been served, click the :guilabel:`Drink Served` button to indicate the drink has been delivered to the guest. Once clicked, that button disappears. +On the far-right of the line, a :guilabel:`Print Badge` button appears for *planned* visitors +**only**. Click this button to download a PDF file of the visitor's badge. The badge displays the +date and time the visitor checked in, the visitor's name and company, who they are visiting, and the +logo of the company they are visiting. + +.. note:: + The PDF badge can be printed onto adhesive labels for the visitor to wear, or onto paper that can + be placed into a plastic badge holder. + .. image:: visitors/visitors.png - :align: center :alt: The full list of currently checked in visitors, with the drinks to be served highlighted. If any column is not visible, or if a visible column is preferred to be hidden, click the -:icon:`oi-settings-adjust` :guilabel:`(additional options)` icon, located at the end of the column -name list. Doing so, reveals a reveals a drop-down menu of column options to enable or disable. A -:icon:`fa-check` :guilabel:`(check)` icon indicates the column is visible. +:icon:`oi-settings-adjust` :guilabel:`(adjust settings)` icon, located at the end of the top line. +Doing so, reveals a drop-down menu of column options to enable or disable. A :icon:`fa-check` +:guilabel:`(check)` icon indicates the column is visible. + +.. _frontdesk/planned: Planned visitors ================ -Enter expected guest information in advance by creating a planned guest in the *Frontdesk* app. +When guests are expected, such as job candidates, government officials, or new suppliers, it can be +helpful to enter the visitor information in advance. When the visitors arrive, they can utilize the +*Quick Check In* option on the kiosk, rather than entering all their information manually upon +arrival. + +Enter expected guest information in advance by creating a planned guest in the **Frontdesk** app. To create a planned guest, navigate to :menuselection:`Frontdesk app --> Visitors`, and click :guilabel:`New`. Then, enter the same information as any other :ref:`visitor ` on @@ -77,9 +94,9 @@ the guest form that appears. The only required fields are the visitor's :guilabe .. important:: If a guest is planned in advance, they must be checked in from the list on the - :guilabel:`Visitors` page in the *Frontdesk* application (:menuselection:`Frontdesk app --> - Visitors`). If a planned guest checks in using a kiosk, they will be checked in separately, and - their planned visitor entry remains listed as :guilabel:`Planned`. + :guilabel:`Visitors` page in the **Frontdesk** application (:menuselection:`Frontdesk app --> + Visitors`). If a planned guest checks in using a kiosk, they are checked in separately from their + planned visitor entry, and their planned visitor entry remains listed as :guilabel:`Planned`. The :guilabel:`Planned` status of a planned guest **only** changes to :guilabel:`Checked-In` when they are checked in *inside* the application's :guilabel:`Visitors` list. @@ -99,8 +116,8 @@ Visitor check in When a visitor arrives at a facility, they approach a :ref:`Frontdesk kiosk `, and click :guilabel:`Check in`. The information requested from the visitor is what was configured for -that specific *Frontdesk* station. If any information is required, the field displays a red asterisk -(\*). The visitor **must** enter the required information in order to check in. +that specific **Frontdesk** station. If any information is required, the field displays a red +asterisk (\*). The visitor **must** enter the required information in order to check in. Once all the information is entered, the visitor taps the :guilabel:`Check In` button. @@ -108,6 +125,16 @@ Once all the information is entered, the visitor taps the :guilabel:`Check In` b At any point in the check-in process, if ten seconds pass with no selection, the kiosk returns to the main welcome screen. +Planned visitor check in +~~~~~~~~~~~~~~~~~~~~~~~~ + +When a :ref:`planned visitor ` arrives at a facility, they first approach a +:ref:`Frontdesk kiosk `. If there are planned visitors for that day, a +:guilabel:`Quick Check In` panel appears on the right-side of the kiosk, asking :guilabel:`Are you +one of these people?` Beneath the question is a list of all visitors schedule to arrive that day. + +Click on the corresponding name in the list to check-in. + Drinks ------ @@ -116,7 +143,7 @@ confirmation screen loads, along with the question: :guilabel:`Do you want somet The visitor can tap either :guilabel:`Yes, please`, or :guilabel:`No, thank you`. -If they select :guilabel:`Yes, please`, a drink selection screen appears, and the pre-configured +If they select :guilabel:`Yes, please`, a drink selection screen appears, and the preconfigured options are listed. The visitor then taps the desired selection, or, if they do not want anything, they can tap the :guilabel:`Nothing, thanks` button at the bottom of the screen. @@ -130,8 +157,8 @@ Once the visitor has checked in, the person they are visiting, and any other use configured to be notified when check-ins occur at the kiosk, are notified. The notification is either by email, SMS message, a *Discuss* chat, or any combination of those three options. -If the visitor requested a drink, the user(s) configured as the :guilabel:`People to Notify` on the -drink form, are notified, via the *Discuss* application. The message that appears is: +If the visitor requested a drink, the users configured as the :guilabel:`People to Notify` on the +drink form are notified, via the *Discuss* application. The message that appears is: :guilabel:`(Visitor Name) just checked-in. They requested (Drink Name).` Once the drink has been delivered to the guest, the person who delivered the drink is responsible @@ -158,7 +185,7 @@ Click the :guilabel:`Check out` button near the end of the line for the visitor are marked as checked-out, the visitor disappears from the list. .. important:: - Visitors do **not** check themselves out when they leave. It is important for *Frontdesk* users + Visitors do **not** check themselves out when they leave. It is important for **Frontdesk** users to check out visitors for accurate record keeping. Always have an accurate list of who is on the premises at any given time. This is important for diff --git a/content/applications/hr/frontdesk/visitors/visitors.png b/content/applications/hr/frontdesk/visitors/visitors.png index 708c6b35b2..b55d41ad3f 100644 Binary files a/content/applications/hr/frontdesk/visitors/visitors.png and b/content/applications/hr/frontdesk/visitors/visitors.png differ diff --git a/content/applications/hr/lunch.rst b/content/applications/hr/lunch.rst index 1bd877ee33..2e39bbf23d 100644 --- a/content/applications/hr/lunch.rst +++ b/content/applications/hr/lunch.rst @@ -4,30 +4,35 @@ Lunch ===== -The *Lunch* application in Odoo allows users a convenient way to order food and pay for their meal +The **Lunch** application in Odoo allows users to conveniently order food and pay for their meal directly from the database. -Before employees can use the *Lunch* application, there are a number of configurations to consider: -settings, vendors, locations, products, product categories, and alerts. Once these are created, -employees can view offerings and order food. +Before employees can use the **Lunch** application, there are a number of configurations that need +to be made: :ref:`settings `, :doc:`vendors `, :ref:`locations +`, :doc:`products `, and :ref:`product categories +`. Once these are created and configured, employees can view offerings and +order food. + +.. _lunch/settings: Settings ======== -Only two settings are needed to configure in the *Lunch* app: overdraft settings and notifications. -To access the settings, navigate to :menuselection:`Lunch app --> Configuration: Settings`. +In the :guilabel:`Settings` menu, only two items need to be configured: overdraft settings and +notifications. To access the settings, navigate to :menuselection:`Lunch app --> Configuration --> +Settings`. Configure the following: -- :guilabel:`Lunch Overdraft`: enter the maximum overdraft amount for employees. The currency - format is determined by the localization setting of the company. -- :guilabel:`Reception notification`: set the message users receive via the *Discuss* app when their - food has been delivered. The default message `Your lunch has been delivered. Enjoy your meal!` - populates this field, but can be modified, if desired. +- :guilabel:`Lunch Overdraft`: enter the maximum overdraft amount for employees. The currency format + is determined by the localization setting of the company. +- :guilabel:`Reception notification`: set the message users receive via the **Discuss** app when + their food has been delivered. The default message `Your lunch has been delivered. Enjoy your + meal!` populates this field, but can be modified, if desired. .. tip:: - If in a database with multiple languages installed, many forms in the *Lunch* application have - the option of entering translations for various fields. + If a database has multiple languages installed, many forms in the **Lunch** application have the + option of entering translations for various fields. If translations are available to be configured, a language code appears next to a translatable field on a form. To add translations for that field, click the two letter language code (for @@ -36,8 +41,8 @@ Configure the following: The following is an example for the :guilabel:`Reception notification` field in the settings menu: - Navigate to :menuselection:`Lunch app --> Configuration: Settings`. Click the :guilabel:`EN` In - the top-right of the text box beneath the :guilabel:`Reception notification` section. A + Navigate to :menuselection:`Lunch app --> Configuration --> Settings`. Click the :guilabel:`EN` + In the top-right of the text box beneath the :guilabel:`Reception notification` section. A :guilabel:`Translate: company_lunch_notify_message` pop-up window loads with the option to enter a translation for the other languages used by the database. @@ -48,17 +53,18 @@ Configure the following: Enter the text that should appear for each language, then click :guilabel:`Save`. .. image:: lunch/translation.png - :align: center :alt: The translation text box, with the current language highlighted, and the Arabic translation field highlighted. +.. _lunch/locations: + Locations ========= -By default, Odoo creates an `HQ Office` location when the *Lunch* application is installed. If a +By default, Odoo creates an `HQ Office` location when the **Lunch** application is installed. If a company has more than one location, they must be configured. -To add a location, navigate to :menuselection:`Lunch app --> Configuration: Locations`. The +To add a location, navigate to :menuselection:`Lunch app --> Configuration --> Locations`. The currently configured locations appear in a list view. Click the :guilabel:`New` button in the top-left corner and a blank line appears beneath the last location in the list. @@ -69,23 +75,23 @@ address field. Repeat this for all locations that need to be added. .. image:: lunch/locations.png - :align: center :alt: A list view of the locations with the new button highlighted. Alerts ====== -It is possible to set up alerts that can either be displayed in the *Lunch* app, or be sent to -specific employees via the *Discuss* app. +It is possible to set up alerts that can either be displayed in the **Lunch** app, or be sent to +specific employees via the **Discuss** app. -No alerts are pre-configured by default. To set up an alert, navigate to :menuselection:`Lunch app ---> Configuration: Alerts`. Click the :guilabel:`New` button in the top-left corner and a blank +No alerts are preconfigured by default. To set up an alert, navigate to :menuselection:`Lunch app +--> Configuration --> Alerts`. Click the :guilabel:`New` button in the top-left corner and a blank lunch alert form loads. Enter the following information on the form: - :guilabel:`Alert Name`: enter a name for the alert. This should be short and descriptive, such as - `New Lunch Vendor` or `Order by 11`. This field is **required**. -- :guilabel:`Display`: select whether the alert is visible in the *Lunch* app (:guilabel:`Alert in - app)` or sent to employees via the *Discuss* app in a chat window (:guilabel:`Chat notification`). + `New Lunch Vendor` or `Order by 11:00 AM`. This field is **required**. +- :guilabel:`Display`: select whether the alert is visible in the **Lunch** app (:guilabel:`Alert in + app)` or sent to employees via the **Discuss** app in a chat window (:guilabel:`Chat + notification`). - :guilabel:`Recipients`: this field only appears if :guilabel:`Chat notification` is selected for the :guilabel:`Display` option. Select who receives the chat alert. The options are: @@ -93,8 +99,8 @@ lunch alert form loads. Enter the following information on the form: ordered last month`, or :guilabel:`Employee who ordered last year`. - :guilabel:`Location`: select the locations the alert should appear for from the drop-down menu. - Multiple locations can be selected. This field is **required**, therefore, if the alert applies - to all locations, select all the locations from the drop-down menu. + Multiple locations can be selected. This field is **required**, therefore, if the alert applies to + all locations, select all the locations from the drop-down menu. - :guilabel:`Show Until`: if the alert should expire on a specific date, select the date from the calendar picker. - :guilabel:`Active`: this option is on (appears green) by default. To turn off the alert, click the @@ -109,7 +115,6 @@ lunch alert form loads. Enter the following information on the form: the :guilabel:`Time` field. .. image:: lunch/alert.png - :align: center :alt: An alert form with all of the information filled out for a chat alert sent at 10:30 AM, asking employees to submit orders by 11:30 AM. diff --git a/content/applications/hr/lunch/locations.png b/content/applications/hr/lunch/locations.png index 4140198b64..3c924d4bb3 100644 Binary files a/content/applications/hr/lunch/locations.png and b/content/applications/hr/lunch/locations.png differ diff --git a/content/applications/hr/lunch/management.rst b/content/applications/hr/lunch/management.rst index 30b05fd7c1..82fdad11e6 100644 --- a/content/applications/hr/lunch/management.rst +++ b/content/applications/hr/lunch/management.rst @@ -2,7 +2,7 @@ Lunch management ================ -In Odoo's *Lunch* application, it is required to have someone manage the orders, vendors, and +In Odoo's **Lunch** application, it is required to have someone manage the orders, vendors, and products. In addition, someone must be responsible for the orders, and notifying employees when their orders have arrived. This can be the same person. @@ -11,16 +11,16 @@ Orders can be :ref:`cancelled `, :ref:`sent to the vendor `, either from the :ref:`Today's Orders ` dashboard, or the :ref:`Control Vendors ` dashboard. -To manage the *Lunch* app, users need the appropriate :guilabel:`Administrator` rights. These can be -set by navigating to the :menuselection:`Settings app` and selecting :guilabel:`Manage Users`. Then, -click on the desired user to view their access rights. +To manage the **Lunch** app, users need the appropriate :guilabel:`Administrator` rights. These can +be set by navigating to the :menuselection:`Settings app` and selecting :guilabel:`Manage Users`. +Then, click on the desired user to view their access rights. For more information on access rights, refer to the :doc:`Access rights <../../general/users/access_rights/>` documentation. .. note:: Only users with administration rights are able to view the :guilabel:`Manager` and - :guilabel:`Configuration` menus in the *Lunch* application. + :guilabel:`Configuration` menus in the **Lunch** application. .. _lunch/todays-orders: @@ -47,7 +47,6 @@ The following information appears in the list: multi-company database. .. image:: management/today.png - :align: center :alt: The list that appears in the Today's Orders dashboard, with the filters and top column names highlighted. @@ -56,19 +55,18 @@ The following information appears in the list: Cancel orders ------------- -All users can cancel an order, not just managers of the *Lunch* app. +All users can cancel an order, not only managers of the **Lunch** app. To cancel an order from a vendor, individual products **must** be cancelled one at a time. -On the :guilabel:`Today's Orders` dashboard, a :guilabel:`✖️ Cancel` button is shown at the -far-right of each product line that can be cancelled. Click the :guilabel:`✖️ Cancel` button to -cancel the order for that individual product. +On the :guilabel:`Today's Orders` dashboard, a :icon:`fa-times` :guilabel:`Cancel` button is shown +at the far-right of each product line that can be cancelled. Click the :icon:`fa-times` +:guilabel:`Cancel` button to cancel the order for that individual product. .. note:: Only products with a red :guilabel:`Status` tag of :guilabel:`Ordered` can be cancelled. .. image:: management/cancel.png - :align: center :alt: Order lines with the cancel button highlighted. .. _lunch/send-orders: @@ -76,7 +74,7 @@ cancel the order for that individual product. Send orders ----------- -The first step in managing the *Lunch* app is to send the orders to the vendors. +The first step in managing the **Lunch** app is to send the orders to the vendors. When orders are ready to be sent, the manager responsible for sending orders **must** send the orders to the vendor, outside of the database (call, online order, etc.). @@ -86,11 +84,10 @@ next to each vendor's name and phone number. Once sent, the :guilabel:`Send Orders` button changes to a :guilabel:`Confirm Orders` button, and the :guilabel:`Status` column is updated from red :guilabel:`Ordered` tags to blue :guilabel:`Sent` -tags, indicating the order has been sent to the vendor. Users who have placed orders in the *Lunch* -app rely on the :guilabel:`Status` tags to track their orders. +tags, indicating the order has been sent to the vendor. Users who have placed orders in the +**Lunch** app rely on the :guilabel:`Status` tags to track their orders. .. image:: management/send.png - :align: center :alt: A vendor's order with the X Cancel and Send Orders buttons highlighted. .. _lunch/confirm-orders: @@ -108,28 +105,28 @@ Once confirmed, the :guilabel:`Confirm Orders` button disappears, and the :guila is updated from blue :guilabel:`Sent` tags to green :guilabel:`Received` tags, indicating the vendor has delivered the orders. -In addition, the :guilabel:`✖️ Cancel` button at the end of each product line changes to a -:guilabel:`✉️ Send Notification` button. +In addition, the :icon:`fa-times` :guilabel:`Cancel` button at the end of each product line changes +to a :icon:`fa-envelope` :guilabel:`Send Notification` button. If needed, instead of confirming all of the individual products from a vendor, individual products -can be confirmed one at a time. To confirm an individual product, click the :guilabel:`✔️ Confirm` -button at the end of the individual product line. When confirming individual products with this -method, the :guilabel:`Confirm Orders` button remains on the vendor line. +can be confirmed one at a time. To confirm an individual product, click the :icon:`fa-check` +:guilabel:`Confirm` button at the end of the individual product line. When confirming individual +products with this method, the :guilabel:`Confirm Orders` button remains on the vendor line. .. image:: management/confirm.png - :align: center :alt: The Today's Orders dashboard, with the two different ways to confirm an order highlighted. .. example:: A vendor receives an order for three pizzas, and an order of garlic knots. When the delivery is - made to the company, the *Lunch* manager notices the garlic knots are missing. + made to the company, the **Lunch** manager notices the garlic knots are missing. The manager first marks the three pizzas as received, by individually confirming the products - with the :guilabel:`✔️ Confirm` button at the end of each product line. + with the :icon:`fa-check` :guilabel:`Confirm` button at the end of each product line. - Later, when the vendor delivers the garlic knots, the manager can either click the :guilabel:`✔️ - Confirm` button at the end of the line for the garlic knots, or click the :guilabel:`Confirm - Orders` button that appears next to the vendor's name and phone number. + Later, when the vendor delivers the garlic knots, the manager can either click the + :icon:`fa-check` :guilabel:`Confirm` button at the end of the line for the garlic knots, or + click the :guilabel:`Confirm Orders` button that appears next to the vendor's name and phone + number. .. _lunch/notify: @@ -142,9 +139,9 @@ their orders have been delivered, and are ready to be picked up. Unlike sending and confirming orders, notifications must be sent individually, and cannot be sent in a batch. -To notify the user their product has arrived, click the :guilabel:`✉️ Send Notification` button at -the end of each product line. An email is sent to the user informing them their products have been -delivered. +To notify the user their product has arrived, click the :icon:`fa-envelope` :guilabel:`Send +Notification` button at the end of each product line. An email is sent to the user informing them +their products have been delivered. .. _lunch/control_vendors: @@ -177,14 +174,13 @@ Orders can be :ref:`cancelled `, :ref:`sent to the vendor ` dashboard and the :ref:`Control Vendors ` dashboard is that the *Today's Orders* dashboard **only** displays orders for the current day, while the :guilabel:`Control Vendors` dashboard - displays **all** orders made in the *Lunch* app. + displays **all** orders made in the **Lunch** app. .. seealso:: - :doc:`../lunch` diff --git a/content/applications/hr/lunch/management/cancel.png b/content/applications/hr/lunch/management/cancel.png index 7362633187..d3ad99fbd5 100644 Binary files a/content/applications/hr/lunch/management/cancel.png and b/content/applications/hr/lunch/management/cancel.png differ diff --git a/content/applications/hr/lunch/management/confirm.png b/content/applications/hr/lunch/management/confirm.png index 5a1884a11a..bb03847a76 100644 Binary files a/content/applications/hr/lunch/management/confirm.png and b/content/applications/hr/lunch/management/confirm.png differ diff --git a/content/applications/hr/lunch/management/control.png b/content/applications/hr/lunch/management/control.png index 5e590432fd..249b8dd8a6 100644 Binary files a/content/applications/hr/lunch/management/control.png and b/content/applications/hr/lunch/management/control.png differ diff --git a/content/applications/hr/lunch/management/send.png b/content/applications/hr/lunch/management/send.png index a8e0de95dd..f96ad825b6 100644 Binary files a/content/applications/hr/lunch/management/send.png and b/content/applications/hr/lunch/management/send.png differ diff --git a/content/applications/hr/lunch/management/today.png b/content/applications/hr/lunch/management/today.png index 44e7a9eee2..7f48a7dc4a 100644 Binary files a/content/applications/hr/lunch/management/today.png and b/content/applications/hr/lunch/management/today.png differ diff --git a/content/applications/hr/lunch/orders.rst b/content/applications/hr/lunch/orders.rst index 712460f414..7aedcf33a6 100644 --- a/content/applications/hr/lunch/orders.rst +++ b/content/applications/hr/lunch/orders.rst @@ -4,8 +4,11 @@ Orders ====== -When the *Lunch* application is opened, the :guilabel:`Order Your Lunch` dashboard loads. This view -is also accessed by navigating to :menuselection:`Lunch app --> My Lunch --> New Order`. +The **Lunch** app lets employees place lunch orders, see what's available each day, and check their +account balance, all from one place. + +When the **Lunch** application is opened, the :guilabel:`Order Your Lunch` dashboard loads. This +view is also accessible by navigating to :menuselection:`Lunch app --> My Lunch --> New Order`. The :guilabel:`Order Your Lunch` dashboard provides a summary of lunch offerings, the user's account information, and the current day's orders, along with their statuses. @@ -14,9 +17,9 @@ Order Your Lunch ================ On the main :guilabel:`Order Your Lunch` dashboard, all the necessary information needed to place an -order is visible. The default filter for the products is :guilabel:`Available Today`, which is -present in the :guilabel:`Search...` bar. This filter shows only products that can be purchased that -day, based on the :ref:`vendor's availability `. +order is visible. Enable the :guilabel:`Available Today` filter in the search bar by clicking into +the search bar and selecting :guilabel:`Available Today`. This filter shows only products that can +be purchased that day, based on the :ref:`vendor's availability `. The left-side of the dashboard displays the various :guilabel:`Categories` of products available, along with the :guilabel:`Vendors` supplying the products. To the right of each line is a number, @@ -38,21 +41,21 @@ view. Each product card displays the name, cost, vendor, photo, and description the product is configured as new, it also displays a :guilabel:`New` tag. .. image:: orders/dashboard.png - :align: center - :alt: The *Lunch* app dashboard with all areas highlighted. + :alt: The Lunch app dashboard. .. note:: - Anywhere a vendor's name is listed in the *Lunch* app, such as on Kanban product cards, their + Anywhere a vendor's name is listed in the **Lunch** app, such as on Kanban product cards, their phone number is listed, as well. -The products can also be displayed in a list view, by clicking the :guilabel:`≣ (four parallel -lines)` icon in the top-right corner of the dashboard. +The products can also be displayed in a list view, by clicking the :icon:`oi-view-list` +:guilabel:`(List)` icon in the top-right corner of the dashboard. Placing orders ============== To place a lunch order, navigate to the main :guilabel:`Order Your Lunch` dashboard, by either -opening the *Lunch* app, or by navigating to :menuselection:`Lunch app --> My Lunch --> New Order`. +opening the **Lunch** app, or by navigating to :menuselection:`Lunch app --> My Lunch --> New +Order`. Add products to an order ------------------------ @@ -60,10 +63,10 @@ Add products to an order From the :guilabel:`Order Your Lunch` dashboard, click on a desired product to add to an order, and the product appears in a :guilabel:`Configure Your Order` pop-up window. -At the top of the pop-up window is the product image, name, and price. Beneath that, there is a -potential :guilabel:`Extras` field, showcasing any :ref:`extra items or options `. -Tick the checkbox next to any desired extras present in the :guilabel:`Extras` field to add them to -the order. +At the top of the pop-up window is the product image, name, and price. Beneath that, there are +potential :guilabel:`Extras` fields, showcasing any :ref:`extra items or options `, +such as toppings or drinks. Tick the checkbox next to any desired extras present in the +:guilabel:`Extras` fields to add them to the order. Each extra option is organized by a category, complete with its name and price. As extras are selected, the displayed price at the top of the pop-up window updates to reflect all current @@ -77,8 +80,7 @@ When all selections for the product have been made, click the :guilabel:`Add To lower-left of the pop-up window. To cancel the order, click the :guilabel:`Discard` button. .. image:: orders/pizza.png - :align: center - :alt: The pop-up window for a personal pizza, with all the extras highlighted and selected. + :alt: The pop-up window for a personal pizza, with all the extras selected. Errors ~~~~~~ @@ -102,7 +104,6 @@ changes to the :guilabel:`Configure Your Order` pop-up window. one and only one Free Beverage with Purchase`. .. image:: orders/error.png - :align: center :alt: The :guilabel:`Validation Error` pop-up window with the specific error for the free beverage displayed. @@ -121,30 +122,30 @@ The available tags that can be displayed for each item are: - :guilabel:`To Order`: the product has been added to the cart, but has not been purchased yet by the user. - :guilabel:`Ordered`: the product has been purchased by the user, and is waiting to be sent to the - vendor by a *Lunch* app manager. -- :guilabel:`Sent`: the order for the product has been sent to the vendor by a *Lunch* app manager. + vendor by a **Lunch** app manager. +- :guilabel:`Sent`: the order for the product has been sent to the vendor by a **Lunch** app + manager. - :guilabel:`Received`: the product has been delivered by the vendor to the user's location, and has - been verified as received by a *Lunch* app manager. + been verified as received by a **Lunch** app manager. -Product quantities can be adjusted by clicking the :guilabel:`➕ (plus sign)` or :guilabel:`➖ (minus -sign)` to the left of the listed product. The product price adjusts in real-time to display the cost -for the currently selected quantity of the product. +Product quantities can be adjusted by clicking the :icon:`fa-plus` :guilabel:`(plus)` or +:icon:`fa-minus` :guilabel:`(minus)` icons to the left of the listed product. The product price +adjusts in real-time to display the cost for the currently selected quantity of the product. The right side of the :guilabel:`Your Order` summary displays the purchasing information. The :guilabel:`Total` amount for the entire day's lunch order is displayed. The :guilabel:`Already Paid` field indicates how much has been paid that day towards the :guilabel:`Total` amount. The :guilabel:`To Pay` field displays how much of the remaining :guilabel:`Total` amount must be paid, -in order to place the currently configured order. +in order to place the currently configured order. .. image:: orders/your-order.png - :align: center - :alt: The Your Orders section of the dashboard, with the purchasing information highlighted. + :alt: The 'Your Orders' section of the dashboard, with purchasing information. .. tip:: Users can place multiple orders throughout the day, and are not restricted to only placing one lunch order each day. Multiple orders might need to be placed, due to users forgetting to add items to an order, or if there are multiple meals that are available to be purchased for the - office ()not just lunch), and so on. + office (not only lunch), and so on. Depending on the various vendors, and how the vendors and products are configured, it is possible to order breakfast, lunch, dinner, coffee, and/or snacks. @@ -154,9 +155,9 @@ Submit an order To place the order, click the :guilabel:`Order Now` button on the right-side of the :guilabel:`Your Order` summary. The user is charged the amount that is displayed in the :guilabel:`To Pay` field, -and the cost is deducted from their *Lunch* account balance. +and the cost is deducted from their **Lunch** account balance. -Once the order is placed, the tags for the items just purchased in the :guilabel:`Your Order` field +Once the order is placed, the tags for the purchased items in the :guilabel:`Your Order` field change from orange :guilabel:`To Order` tags to red :guilabel:`Ordered` tags. Track an order @@ -171,16 +172,16 @@ green :guilabel:`Received` tags. Receive an order ---------------- -When orders are received at the delivery location, they are confirmed by a *Lunch* app manager, and -a notification is sent to the employee who ordered the food. +When orders are received at the delivery location, they are confirmed by a **Lunch** app manager, +and a notification is sent to the employee who ordered the food. My Orders ========= -To view a full list of all orders placed in the *Lunch* app for the currently signed-in user, +To view a full list of all orders placed in the **Lunch** app for the currently signed-in user, navigate to :menuselection:`Lunch app --> My Lunch --> My Order History`. This navigates to the :guilabel:`My Orders` dashboard. The data is filtered by :guilabel:`My Orders` and grouped by -:guilabel:`Order Date: Day`, by default, both of which are located in the :guilabel:`Search...` bar. +:guilabel:`Order Date: Day`, by default, both of which are located in the search bar. All products appear in a list view, organized by date. The list displays the :guilabel:`Order Date`, :guilabel:`Vendor`, :guilabel:`Product`, :guilabel:`Extras`, :guilabel:`Notes`, :guilabel:`User`, @@ -202,7 +203,6 @@ applicable. The new order appears in the list, under the current date, and the p with money deducted from the user's account. .. image:: orders/my-orders.png - :align: center :alt: The list view that appears when navigating to the My Orders dashboard. My Account @@ -216,12 +216,10 @@ to oldest. The :guilabel:`Date`, :guilabel:`Description`, and :guilabel:`Amount` displayed in the list. Entries with a negative figure listed in the :guilabel:`Amount` column represent products purchased -in the *Lunch* app. These appear in a `$-XX.XX` format. +in the **Lunch** app. These appear in a `$-XX.XX` format. Entries with a positive balance either represent funds added to the user's lunch account, or cancelled orders that were eventually refunded to the user. These appear in a `$XX.XX` format. .. image:: orders/my-account.png - :align: center - :alt: The My Account dashboard with the entry for adding funds to the user's lunch account - highlighted. + :alt: The 'My Account' dashboard with the entry for adding funds to the user's lunch account. diff --git a/content/applications/hr/lunch/orders/dashboard.png b/content/applications/hr/lunch/orders/dashboard.png index 730e27d694..beab3db8e1 100644 Binary files a/content/applications/hr/lunch/orders/dashboard.png and b/content/applications/hr/lunch/orders/dashboard.png differ diff --git a/content/applications/hr/lunch/orders/my-account.png b/content/applications/hr/lunch/orders/my-account.png index 7e9a4aa82e..b1384bb476 100644 Binary files a/content/applications/hr/lunch/orders/my-account.png and b/content/applications/hr/lunch/orders/my-account.png differ diff --git a/content/applications/hr/lunch/orders/my-orders.png b/content/applications/hr/lunch/orders/my-orders.png index 0a5179d83a..ff03532689 100644 Binary files a/content/applications/hr/lunch/orders/my-orders.png and b/content/applications/hr/lunch/orders/my-orders.png differ diff --git a/content/applications/hr/lunch/orders/pizza.png b/content/applications/hr/lunch/orders/pizza.png index 9e56b68ec1..f11bcc8792 100644 Binary files a/content/applications/hr/lunch/orders/pizza.png and b/content/applications/hr/lunch/orders/pizza.png differ diff --git a/content/applications/hr/lunch/orders/your-order.png b/content/applications/hr/lunch/orders/your-order.png index 66cd2ddeaa..6f9681fa77 100644 Binary files a/content/applications/hr/lunch/orders/your-order.png and b/content/applications/hr/lunch/orders/your-order.png differ diff --git a/content/applications/hr/lunch/products.rst b/content/applications/hr/lunch/products.rst index 21965c9c84..7c146ad29e 100644 --- a/content/applications/hr/lunch/products.rst +++ b/content/applications/hr/lunch/products.rst @@ -2,35 +2,33 @@ Products ======== -Odoo's *Lunch* app does **not** come with any products preconfigured. The individual products being +Odoo's **Lunch** app does *not* come with any products preconfigured. The individual products being offered must first be configured before orders can be placed. -To add and configure products for the *Lunch* app, navigate to :menuselection:`Lunch app --> +To add and configure products for the **Lunch** app, navigate to :menuselection:`Lunch app --> Configuration --> Products`. Next, click the :guilabel:`New` button in the top-left corner, and a blank product form loads. Enter the following information on the form: -- :guilabel:`Product Name`: enter the name for the product. This field is **required**. -- :guilabel:`Product Category`: using the drop-down menu, select the :ref:`category +- :guilabel:`Product Name`: Enter the name for the product. This field is **required**. +- :guilabel:`Product Category`: Using the drop-down menu, select the :ref:`category ` this product falls under. This field is **required**. -- :guilabel:`Vendor`: using the drop-down menu, select the vendor that supplies this product. This +- :guilabel:`Vendor`: Using the drop-down menu, select the vendor that supplies this product. This field is **required**. -- :guilabel:`Price`: enter the price for the product. The currency is determined by the company's +- :guilabel:`Price`: Enter the price for the product. The currency is determined by the company's localization. -- :guilabel:`Description`: enter a description of the product in this field. This description +- :guilabel:`Description`: Enter a description of the product in this field. This description appears beneath the product photo when users are viewing the day's options. -- :guilabel:`New Until`: using the calendar popover, select the date on which the product is no +- :guilabel:`New Until`: Using the calendar popover, select the date on which the product is no longer labeled as new. Until this date, a green `New` tag appears on the product. -- :guilabel:`Company`: if the product should only be available to a specific company, select it from - the drop-down menu. If this field is left blank, this product is available for all companies in - the database. -- **Image**: hover over the image box in the top-right corner of the form, and click the +- :guilabel:`Company`: Using the drop-down menu, select the companies this product is available for. + If this field is left blank, this product does **not** appear for **any** company. +- **Image**: Hover over the image box in the top-right corner of the form, and click the :icon:`fa-pencil` :guilabel:`(pencil)` icon that appears. A file explorer pop-up window appears. Navigate to the image, then click :guilabel:`Open`. .. image:: products/product.png - :align: center :alt: A product form filled out for a nine inch pizza. .. _lunch/product-categories: @@ -38,13 +36,13 @@ Enter the following information on the form: Product categories ================== -Product categories organize the offerings in the *Lunch* app, and allows users to quickly filter -them when reviewing the menu for the day. +Product categories organize the offerings in the **Lunch** app, and allows users to filter offerings +when reviewing the menu for the day. To add or modify categories, navigate to :menuselection:`Lunch app --> Configuration: Product Categories`. The available categories appear in a list view. -In the *Lunch* app, there are four default categories: :guilabel:`Sandwich`, :guilabel:`Pizza`, +In the **Lunch** app, there are four default categories: :guilabel:`Sandwich`, :guilabel:`Pizza`, :guilabel:`Burger`, and :guilabel:`Drinks`. To add a new category, click the :guilabel:`New` button in the top-left corner, and a blank category @@ -58,5 +56,4 @@ If desired, add a photo for the category. Hover over the image box in the top-ri Navigate to the image, then click :guilabel:`Open`. .. image:: products/category.png - :align: center :alt: The category form, with the fields filled out for a Soup category. diff --git a/content/applications/hr/lunch/translation.png b/content/applications/hr/lunch/translation.png index c0706a55ff..c807b729a8 100644 Binary files a/content/applications/hr/lunch/translation.png and b/content/applications/hr/lunch/translation.png differ diff --git a/content/applications/hr/lunch/user-accounts.rst b/content/applications/hr/lunch/user-accounts.rst index fb8324b537..8e7d84e9bf 100644 --- a/content/applications/hr/lunch/user-accounts.rst +++ b/content/applications/hr/lunch/user-accounts.rst @@ -2,35 +2,36 @@ Manage user accounts ==================== -In Odoo's *Lunch* application, users pay for products directly from their *Lunch* app account. For -funds to appear in their account, a *Lunch* app manager **must** transfer funds into each user's -account. +In Odoo's **Lunch** application, users pay for products directly from their **Lunch** app account. +For funds to appear in their account, a **Lunch** app manager **must** transfer funds into each +user's account. .. important:: To add funds and manage user accounts, the user must have :guilabel:`Administrator` access rights - set for the *Lunch* application. This is verified by navigating to :menuselection:`Settings app - --> → Manage Users`. Then, click on a user to view their various settings and access rights. + set for the **Lunch** application. This is verified by navigating to :menuselection:`Settings app + -->` :icon:`oi-arrow-right` :guilabel:`Manage Users`. Then, click on a user to view their various + settings and access rights. - For more information, refer to the - :doc:`Access rights <../../general/users/access_rights/>` documentation. + For more information, refer to the :doc:`Access rights <../../general/users/access_rights/>` + documentation. -The *Lunch* application does **not** directly interface in any way with software or products linked -to any monetary accounts or billing. Money **cannot** be transferred from users' bank accounts, nor -can users' credit cards be charged. +The **Lunch** application does **not** directly interface in any way with software or products +linked to any monetary accounts or billing. Money **cannot** be transferred from users' bank +accounts, nor can users' credit cards be charged. -Odoo's *Lunch* application **only** allows for manual entries of cash exchanges that are handled by -the *Lunch* app manager. It is up to each individual company to create the method with which lunch -accounts are replenished. +Odoo's **Lunch** application **only** allows for manual entries of cash exchanges that are handled +by the **Lunch** app manager. It is up to each individual company to create the method with which +lunch accounts are replenished. .. example:: Some examples of how money can be organized and transferred within a company: - - Cash is handed to the *Lunch* app manager, who then updates the user's account. - - Money is automatically deducted from the user's paychecks, then the *Lunch* app manager updates - the account when paychecks are issued. This requires :ref:`adding a salary attachment + - Cash is handed to the **Lunch** app manager, who then updates the user's account. + - Money is automatically deducted from the user's paychecks, then the **Lunch** app manager + updates the account when paychecks are issued. This requires :ref:`adding a salary attachment ` for the user's payslip in the *Payroll* app. - Companies can sell "lunch tickets" at a set price (for example, one ticket costs $5.00). Users - can purchase tickets from a *Lunch* app manager, who then updates the user's account. + can purchase tickets from a **Lunch** app manager, who then updates the user's account. .. _lunch/cash-moves: @@ -47,7 +48,6 @@ displaying each record's :guilabel:`Date`, :guilabel:`User`, :guilabel:`Descript :guilabel:`Amount` column. .. image:: user-accounts/cash.png - :align: center :alt: The list view of all cash moves. Add funds @@ -67,15 +67,13 @@ A blank :guilabel:`Cash Moves` form loads. Enter the following information on th - :guilabel:`Description`: enter a brief description of the transaction. .. image:: user-accounts/cash-move-form.png - :align: center :alt: The cash move form filled out for a transaction of $40.00. - Control Accounts ================ -An overview of every transaction in the *Lunch* app, including all cash deposits and purchases, can -be viewed on the main *Control Accounts* dashboard. To access this dashboard, navigate to +An overview of every transaction in the **Lunch** app, including all cash deposits and purchases, +can be viewed on the main *Control Accounts* dashboard. To access this dashboard, navigate to :menuselection:`Lunch app --> Manager --> Control Accounts.` All transactions are grouped :guilabel:`By Employee`, and listed alphabetically by the user's first @@ -83,21 +81,20 @@ name. At the end of the user's name, a number appears. This indicates the number records logged for that user. The default view is to have all individual transactions hidden. To view all transactions for a user, -click the :guilabel:`▶ (triangle)` icon to the left of the desired name to expand that specific -group. +click the :icon:`fa-caret-right` :guilabel:`(triangle)` icon to the left of the desired name to +expand that specific group. Each record includes the :guilabel:`Date`, :guilabel:`User`, :guilabel:`Description`, and :guilabel:`Amount`. .. image:: user-accounts/control-accounts.png - :align: center :alt: The Control Accounts dashboard with two employee's transactions expanded. .. important:: - This list only displays the various transactions within the *Lunch* app, and does **not** allow + This list only displays the various transactions within the **Lunch** app, and does **not** allow modifications to be made to any records listed. - Cash moves can be modified, but **only** from the :ref:`Cash Moves ` - dashboard, not from the :guilabel:`Control Accounts` dashboard. + Cash moves can be modified, but **only** from the :ref:`Cash Moves ` dashboard, + not from the :guilabel:`Control Accounts` dashboard. It is **not** possible to modify any product-related records. diff --git a/content/applications/hr/lunch/user-accounts/cash.png b/content/applications/hr/lunch/user-accounts/cash.png index 6034b1fd11..faba431f69 100644 Binary files a/content/applications/hr/lunch/user-accounts/cash.png and b/content/applications/hr/lunch/user-accounts/cash.png differ diff --git a/content/applications/hr/lunch/user-accounts/control-accounts.png b/content/applications/hr/lunch/user-accounts/control-accounts.png index 662f15d527..f22bea6276 100644 Binary files a/content/applications/hr/lunch/user-accounts/control-accounts.png and b/content/applications/hr/lunch/user-accounts/control-accounts.png differ diff --git a/content/applications/hr/lunch/vendors.rst b/content/applications/hr/lunch/vendors.rst index 2862e8a770..4d76afaa80 100644 --- a/content/applications/hr/lunch/vendors.rst +++ b/content/applications/hr/lunch/vendors.rst @@ -2,57 +2,57 @@ Vendors ======= -Before :doc:`products can be added ` to the *Lunch* app, the restaurants that provide the -food **must** be configured. +Before :doc:`products can be added ` to the **Lunch** app, the restaurants that provide +the food needs to be configured. To add a new vendor, first navigate to :menuselection:`Lunch app --> Configuration --> Vendors`. -Here, all currently configured vendors for the *Lunch* app appear in a default Kanban view. To -change to a list view, click the :icon:`oi-view-list` :guilabel:`(list)` icon in the top-right +Here, all currently configured vendors for the **Lunch** app appear in a default Kanban view. To +change to a list view, click the :icon:`oi-view-list` :guilabel:`(List)` icon in the top-right corner. .. note:: - No vendors are preconfigured in the *Lunch* app, so all vendors **must** be added to the + No vendors are preconfigured in the **Lunch** app, so all vendors **must** be added to the database. -To add a new vendor, click the :guilabel:`New` button in the top-left corner, and a new lunch -supplier form loads. - -Fill out the following fields on the vendor form: +A placeholder :guilabel:`Lunch Supplier` card appears on the :guilabel:`Vendors` dashboard, by +default. Click on this card, and configure the following fields on the vendor form: - :ref:`Vendor information ` - :ref:`Availability ` - :ref:`Orders ` - :ref:`Extras ` +After the first vendor is configured, add more vendors by clicking the :guilabel:`New` button in the +top-left corner, and configure the new lunch supplier form. Repeat for all needed vendors. + .. _lunch/vendor-info: Vendor information ================== -- :guilabel:`Vendor`: enter a name for the vendor. -- :guilabel:`Vendor` (beneath the line for vendor name): select the vendor from the drop-down menu. - If the vendor has not already been entered in the system, type in the vendor name, and click - either :guilabel:`Create "new vendor name"` to add them. Alternatively, click :guilabel:`Create - and edit...` to create the vendor, and edit the vendor form. The vendor form allows for more - detail, aside from the name, to be entered, such as contact information. +- :guilabel:`Vendor`: Enter a name for the vendor in this field. +- :guilabel:`Vendor` (beneath the line for vendor name): Using the drop-down menu, select the + corresponding vendor in the **Contacts** app. If the vendor has not already been created, type in + the vendor name, and click :guilabel:`Create "new vendor name"` to add them. Alternatively, click + :guilabel:`Create and edit...` to create the vendor and edit the vendor contact form. The vendor + contact form allows for more details to be entered, such as contact information. .. note:: If a selection is made to the drop-down :guilabel:`Vendor` field, the :guilabel:`Vendor` text field (above, for the vendor's name) updates with the name of the vendor chosen from the drop-down menu. - The list of vendors that is presented in the drop-down menu is pulled from the *Contacts* + The list of vendors that is presented in the drop-down menu is pulled from the **Contacts** application. -- :guilabel:`Address`: enter the vendor's address in the various fields. -- :guilabel:`Email`: enter the vendor's email. -- :guilabel:`Phone`: enter the vendor's phone number. -- :guilabel:`Company`: if this vendor is only available to a specific company, select the company +- :guilabel:`Address`: Enter the vendor's address in the various fields. +- :guilabel:`Email`: Enter the vendor's email in this field. +- :guilabel:`Phone`: Enter the vendor's phone number in this field. +- :guilabel:`Company`: If this vendor is only available to a specific company, select the company from the drop-down menu. If this field is left blank, the vendor's items are available to **all** - companies. + companies. This field **only** appears in a multi-company database. .. image:: vendors/vendor-info.png - :align: center :alt: The top portion of the vendor form filled out. .. _lunch/availability: @@ -67,7 +67,6 @@ week the vendor is available. By default, Monday through Friday are ticked. .. image:: vendors/availability.png - :align: center :alt: The default view of the availability section, with Mon-Fri enabled. .. _lunch/orders: @@ -78,25 +77,24 @@ Orders The :guilabel:`ORDERS` section of the vendor form details which locations the vendor is available for, in addition to how and when orders are placed and received. -- :guilabel:`Delivery`: using the drop-down menu, select :guilabel:`Delivery` if the vendor - delivers to the office, or select :guilabel:`No Delivery` if orders must be picked up. -- :guilabel:`Location`: select which locations are able to order from this vendor. Multiple +- :guilabel:`Delivery`: Using the drop-down menu, select :guilabel:`Delivery` if the vendor delivers + to the office, or select :guilabel:`No Delivery` if orders must be picked up. +- :guilabel:`Location`: Select which locations are able to order from this vendor. Multiple locations can be selected. If this field is left blank, **all** locations can order from the vendor. .. note:: - An `HQ Office` location is created by default when creating a database, and is - available to select from the list. + An `HQ Office` location is created by default when creating a database, and is available to + select from the list. -- :guilabel:`Send Order By`: click the radio button to select how orders are sent to the vendor. The +- :guilabel:`Send Order By`: Click the radio button to select how orders are sent to the vendor. The available options are :guilabel:`Phone` or :guilabel:`Email`. -- :guilabel:`Order Time`: this field **only** appears if :guilabel:`Email` is selected in the +- :guilabel:`Order Time`: This field **only** appears if :guilabel:`Email` is selected in the :guilabel:`Send Order By` field. Enter the time that an order must be emailed for it to be accepted. Enter the time in the following format: `HH:MM`. Then select either :guilabel:`AM` or :guilabel:`PM` from the drop-down menu, next to the time field. .. image:: vendors/orders.png - :align: center :alt: The orders section of a vendor form, with all fields filled out. .. _lunch/extras: @@ -104,8 +102,9 @@ for, in addition to how and when orders are placed and received. Extras ====== -When ordering an item in the *Lunch* app, optional extra items, sometimes referred to as *add-ons*, -can be shown. These can be configured in any manner that suits the products being offered. +When ordering an item in the **Lunch** app, optional extra items, sometimes referred to as +*add-ons*, can be shown. These can be configured in any manner that suits the products being +offered. By default, Odoo allows for three types of extra items, which can be thought of as *categories*. By default, the first type (or *category*) of add-ons is labeled `Extras`, the second is labeled @@ -123,13 +122,14 @@ Configure extras Enter the following information for each of the three available extra sections: -- :guilabel:`Extra (#) Label`: enter a name for the type of extra, such as `Toppings`. This can be +- :guilabel:`Extra (#) Label`: Enter a name for the type of extra, such as `Toppings`. This can be thought of as a *category*. -- :guilabel:`Extra (#) Quantity`: select how the extras are selected. The options are: +- :guilabel:`Extra (#) Quantity`: Select how the extras are selected. The options are: - - :guilabel:`None or More`: select this if the user is not required to make a selection. - - :guilabel:`One or More`: select this to **require** the user to make **at least one** selection. - - :guilabel:`Only One`: select this to **require** the user to **make only one** selection. + - :guilabel:`None or More`: Select this option if the user is not required to make a selection. + - :guilabel:`One or More`: Select this option to **require** the user to make **at least one** + selection. + - :guilabel:`Only One`: Select this option to **require** the user to make **only one** selection. Add extras ---------- @@ -150,13 +150,11 @@ or condiments. The various toppings are then added, with their corresponding costs. .. image:: vendors/extras.png - :align: center :alt: The first of the extras configured for pizza toppings. The pizzeria also offers a free beverage with any purchase. To set this up, the :guilabel:`Extra - 2 Label` is set to `Beverages`, and the :guilabel:`Extra 1 Quantity` is set to :guilabel:`Only + 2 Label` is set to `Beverages`, and the :guilabel:`Extra 2 Quantity` is set to :guilabel:`Only One`. The various beverage choices are added, and the cost for each remains zero. .. image:: vendors/beverages.png - :align: center :alt: The second of the extras configured for a free beverage with purchase. diff --git a/content/applications/hr/payroll.rst b/content/applications/hr/payroll.rst index efbd351696..72d9cb2a69 100644 --- a/content/applications/hr/payroll.rst +++ b/content/applications/hr/payroll.rst @@ -31,37 +31,6 @@ The accounting section of the configuration menu relates to three options: created from all the accounting entries from the same period. This disables the generation of single payments. -.. _payroll-localizations: - -Localizations -------------- - -*Localizations* are country-specific settings pre-configured in Odoo at the creation of the -database, which account for all taxes, fees, and allowances for that particular country. - -The :guilabel:`Localization` section of the *Payroll* app :guilabel:`Settings` page may include -specific settings that need to be set for the specific country. This selection also provides a -detailed view of all benefits provided to employees. - -The settings and options shown in this section varies, depending on the localization enabled for the -database. - -.. warning:: - It is **not** recommended to alter the localization settings, unless specifically required. - -.. note:: - Odoo can handle a multi-company configuration. This is generally done when there is a main - company or office location, such as a headquarters, and there are other offices/branches around - the country or globe, that fall under that main company or headquarters. In Odoo, each company, - including the headquarters, would be set up as their own company/branch using the multi-company - method. - - Each individual company can have a different localization setting, since locations can vary - anywhere in the world, where rules and laws differ. - - For more information on companies, refer to the :doc:`Companies <../general/companies>` - documentation, which covers how to set up companies. - Time off -------- @@ -926,11 +895,14 @@ form. .. seealso:: - :doc:`payroll/contracts` - :doc:`payroll/work_entries` + - :doc:`payroll/time_off_to_report` - :doc:`payroll/salary_attachments` - :doc:`payroll/payslips` + - :doc:`payroll/batches` + - :doc:`payroll/commissions` - :doc:`payroll/reporting` + - :doc:`payroll/headcount` - :doc:`payroll/work_entry_analysis` - - :doc:`payroll/salary_attachment` - :doc:`payroll/payroll_localizations` .. toctree:: @@ -938,9 +910,12 @@ form. payroll/contracts payroll/work_entries + payroll/time_off_to_report payroll/salary_attachments payroll/payslips + payroll/batches + payroll/commissions payroll/reporting + payroll/headcount payroll/work_entry_analysis - payroll/salary_attachment payroll/payroll_localizations diff --git a/content/applications/hr/payroll/batches.rst b/content/applications/hr/payroll/batches.rst new file mode 100644 index 0000000000..46944ae810 --- /dev/null +++ b/content/applications/hr/payroll/batches.rst @@ -0,0 +1,204 @@ +======= +Batches +======= + +Batches are used to generate multiple :doc:`payslips ` at once and process them in a +group, rather than create and process individual payslips. This method not only helps the payroll +department pay employees in less time, but it also helps keep payslips organized. + +Typically, a company's payroll department :ref:`creates a new batch ` for each +salary structure, for every pay period (usually weekly, bi-weekly, or monthly). If desired, batches +can be further organized by department, job position, or salary structure type. + +Once a batch is made, :ref:`payslips are added to the batch `, then the batch +is processed, and employees are paid. + +View batches +============ + +To view all the batches in the database, navigate to :menuselection:`Payroll app --> Payslips --> +Batches` to display all payslip batches that have been created. These payslip batches are displayed +in a list view, by default. + +Each batch displays the :guilabel:`Name`, the dates the batch includes (the :guilabel:`Date From` +and :guilabel:`Date To` fields), its :guilabel:`Status`, the number of payslips in the batch +(:guilabel:`Payslips Count`), and the :guilabel:`Company`. + +.. image:: batches/batches.png + :alt: View displaying all batches created. + +.. _payroll/new-batch: + +Create a new batch +================== + +New batches of payslips must be created from the :guilabel:`Payslips Batches` dashboard, by +navigating to :menuselection:`Payroll app --> Payslips --> Batches`. Click the :guilabel:`New` +button in the top-left corner. Doing so reveals a blank payslip batch form on a separate page. + +On the new payslip batch form, enter the :guilabel:`Batch Name`. This should be something short and +descriptive, to keep records organized. + +.. example:: + A company pays its employees on a bi-weekly basis, and creates separate batches for their two + different :ref:`salary structures ` they use: worker pay and regular + pay. + + The names for their four August 2025 batches are: + + - `Aug 1-14 2025 - Worker` + - `Aug 1-14 2025 - Regular` + - `Aug 15-31 2025 - Worker` + - `Aug 15-31 2025 - Regular` + +Next, select the date range to which the batch applies. Click into one of the :guilabel:`Period` +fields, and a calendar pop-up window appears. From this calendar pop-up window, navigate to the +correct month, and click on the corresponding day for both the start and end dates of the batch. + +The current company populates the :guilabel:`Company` field. If operating in a multi-company +environment, it is **not** possible to modify the :guilabel:`Company` from the form. The batch +**must** be created while in the database for the desired company. + +.. image:: batches/new-batch-details.png + :alt: The details entered for the new batch. + +.. _payroll/add-payslips: + +Add payslips to a batch +======================= + +Once a :ref:`batch has been created `, payslips need to be added to the batch. +Payslips can either be :ref:`created and added ` to the batch, or if they have +*already* been created, they can be :ref:`added to the batch `. + +.. important:: + Batches can only have payslips added to them when they are in the :guilabel:`New` stage. Payslips + can either be :ref:`created by the database ` and added to the batch, or + :ref:`pre-existing payslips can be individually added ` to the batch. + + Once either of these methods has been used, the status of the batch changes to + :guilabel:`Confirmed`, and both options to add payslips no longer appears. + +.. _payroll/generate: + +Generate payslips +----------------- + +To generate the payslips and add them to the batch, first open the batch by navigating to +:menuselection:`Payroll app --> Payslips --> Batches`, and click on the desired batch. Next, click +the :guilabel:`Generate Payslips` button and a :guilabel:`Generate Payslips` pop-up window loads. + +This form contains three sections, and the configuration of this form determines which payslips are +created. The :guilabel:`Employees Selection` section determines which employees' payslips to create. +Using the drop-down menus, configure the :guilabel:`Department`, :guilabel:`Job Position`, and +:guilabel:`Salary Structure Type` fields, if desired. As selections are made, the +:guilabel:`Employees` section at the bottom updates to show which payslips are going to be +generated. + +The :guilabel:`Payslip Generation` section allows the user to pick a specific :guilabel:`Salary +Structure` to create payslips for. If left blank, the default structure for each employee is used to +calculate their pay. + +.. note:: + By default, Odoo lists all employees in the :guilabel:`Employees` section when generating + payslips. + + The list filters automatically as selections are made. + + Configuration is optional unless a batch is being created **excluding** certain employees. + +Once all the desired configurations have been made, click the :guilabel:`Generate` button, and all +payslips are created and attached to the batch. Once generated, a :icon:`fa-book` +:guilabel:`Payslips` smart button appears at the top, along with the number of payslips in the +batch. Click this smart button to view a list of all the payslips in the batch. + +Once the payslips have been generated and attached to the batch, the status of the batch changes to +:guilabel:`Confirmed`. + +.. image:: batches/generate.png + :alt: Payslips being generated for marketing and community managers. + +.. _payroll/add: + +Add payslips +------------ + +Instead of generating payslips, :ref:`individual payslips that have already been created +` can be added to a batch. Start by opening the desired batch by navigating to +:menuselection:`Payroll app --> Payslips --> Batches`, and clicking on the desired batch. + +Next, click the :guilabel:`Add Payslips` button, and an :guilabel:`Add Payslips` form loads in a +pop-up window. All available payslips that have not yet been added to a batch, appear on the list. + +.. note:: + **All** payslips not yet assigned to a batch appear in the list, regardless of status + (:guilabel:`Draft`, :guilabel:`Waiting`, :guilabel:`Paid`, or :guilabel:`Cancelled`). This allows + already processed or cancelled payslips to be grouped retroactively for reporting or record + keeping purposes. + +Tick the checkbox next to each desired payslip to be added, then click the :guilabel:`Select` button +at the bottom. All selected payslips are added to the batch, and the status of the batch changes to +:guilabel:`Confirmed`. A :icon:`fa-book` :guilabel:`Payslips` smart button appears at the top, along +with the number of payslips in the batch. Click this smart button to view a list of all the payslips +in the batch. + +.. image:: batches/add-payslips.png + :alt: Adding individual payslips to a batch by selecting them form this list. + +.. _payroll/batch-process: + +Process a batch +=============== + +After a :ref:`batch has been created ` , and :ref:`all required payslips have +been added `, the batch must then be processed, and employees paid. + +Open the desired batch by navigating to :menuselection:`Payroll app --> Payslips --> Batches`, and +clicking on the desired batch. For a batch to be processed, it must have a status of +:guilabel:`Confirmed`. That means the batch has been created and payslips have been added to them, +but the payslips have *not* been processed yet. + +Click the :guilabel:`Create Draft Entry` button to confirm and create a draft of the individual +payslips. After this occurs, the batch status changes to :guilabel:`Done`. + +.. note:: + At any time, the batch needs to be reverted back to a status of :guilabel:`New`, click the + :guilabel:`Set to Draft` button. This action does **not** remove any payslips that have already + been added to the batch, instead, the status changes back to :guilabel:`New`. + + After any desired changes have been made, click :guilabel:`Confirm` and the batch status changes + to :guilabel:`Confirmed`. + + It is important to note, that if any payslips in the batch have a status of :guilabel:`Paid`, the + batch **cannot** revert to a status of :guilabel:`New`. + +Once the status has changed to :guilabel:`Done`, the payments must be logged in the database. Click +the :guilabel:`Create Payment Report` button, and a pop-up window loads, where the payment report +details are entered. + +Using the drop-down menu, select the :guilabel:`Export Format` for the payment report. The two +default options available are :guilabel:`NACHA`, and :guilabel:`CSV`. + +The :guilabel:`NACHA` option creates a compatible ACH file which is sent to the company's bank, and +outlines all the banking information to transfer money from the company to the employees, either via +direct deposit (most common) or a check. Refer to the :ref:`fiscal localization document +` for more information. + +.. note:: + Other options may be available depending on the :doc:`payroll localization + ` installed in the database. + + If :guilabel:`CSV` is selected, all other fields are hidden form view. Once this is selected, + click the :guilabel:`Generate` button to create the payment report. + +Next, select the desired :guilabel:`Bank Journal` the paychecks are logged on. Last, using the +calendar selector, set the date the paychecks are issued in the :guilabel:`Effective Date` field. + +Once the pop-up window is configured, click the :guilabel:`Generate` button, and the file appears on +the batch form, in a new :guilabel:`Payment Report` field. + +After the report is created, click the :guilabel:`Mark as paid` button to mark the payslips as paid +in the database. + +.. image:: batches/generate-payslips.png + :alt: Adding individual payslips to a batch by selecting them form this list. diff --git a/content/applications/hr/payroll/batches/add-payslips.png b/content/applications/hr/payroll/batches/add-payslips.png new file mode 100644 index 0000000000..f27d913b31 Binary files /dev/null and b/content/applications/hr/payroll/batches/add-payslips.png differ diff --git a/content/applications/hr/payroll/batches/batches.png b/content/applications/hr/payroll/batches/batches.png new file mode 100644 index 0000000000..878940e230 Binary files /dev/null and b/content/applications/hr/payroll/batches/batches.png differ diff --git a/content/applications/hr/payroll/batches/generate-payslips.png b/content/applications/hr/payroll/batches/generate-payslips.png new file mode 100644 index 0000000000..1de03f9c88 Binary files /dev/null and b/content/applications/hr/payroll/batches/generate-payslips.png differ diff --git a/content/applications/hr/payroll/batches/generate.png b/content/applications/hr/payroll/batches/generate.png new file mode 100644 index 0000000000..e7c826e19b Binary files /dev/null and b/content/applications/hr/payroll/batches/generate.png differ diff --git a/content/applications/hr/payroll/batches/new-batch-details.png b/content/applications/hr/payroll/batches/new-batch-details.png new file mode 100644 index 0000000000..292caad47e Binary files /dev/null and b/content/applications/hr/payroll/batches/new-batch-details.png differ diff --git a/content/applications/hr/payroll/commissions.rst b/content/applications/hr/payroll/commissions.rst new file mode 100644 index 0000000000..a2bb2ffbf5 --- /dev/null +++ b/content/applications/hr/payroll/commissions.rst @@ -0,0 +1,53 @@ + +=========== +Commissions +=========== + +Commissions are payments made to employees that are earned as part of their salary. The payments are +awarded after a sale has been made, and the amount depends on how much the sale was. Typically the +amount is either a percentage of the sale, or a set commission based on a structure created by the +company. + +To pay an employee a commission they earned, a separate commission paycheck must be issued to the +employee. In Odoo, a commission payslip is referred to as a *warrant payslip*. + +Create warrant payslips +======================= + +Warrant payslips are generated directly from the :guilabel:`Payslips Batches` dashboard, which is +accessed by navigating to :menuselection:`Payroll app --> Payslips --> Batches`. + +First, click the :guilabel:`Generate Warrant Payslips` button in the top-left corner. Doing so +reveals a :guilabel:`Generate Warrant Payslips` pop-up window, in which the necessary information +**must** be filled out. + +Set the time frame the commission was earned, in the two fields next to :guilabel:`Period`. Click +into each field, and a calendar pop-up window loads. Navigate to the desired date and click on it +to select it. + +Using the drop-down menu, select the :guilabel:`Department` in the corresponding field. When a +department is selected, the employees listed for that department appear in the :guilabel:`Employee` +section, below. + +If a file is needed for the record, upload a file to the :guilabel:`Import File` field, such as a +sales invoice, using the :guilabel:`Upload your file` button. Any file type is accepted. + +Under the :guilabel:`Employee` section, enter the individual :guilabel:`Commission Amount` for each +employee in the far-right column. To remove an employee, click the :icon:`fa-trash-o` +:guilabel:`(trash)` icon to remove the line. + +Add a new commission by clicking :guilabel:`Add a Line`, and entering the :guilabel:`Employee` and +the appropriate :guilabel:`Commission Amount`. + +Once all the commissions are properly entered, click the :guilabel:`Generate Payslips` button to +create the warrant payslips in a batch, or click :guilabel:`Export` to export a CSV file of the +commissions. + +:ref:`Process the batch ` in the same way as a typical batch to complete the +payment process. + +.. image:: commissions/commission-details.png + :alt: Enter the commission details. + +.. seealso:: + :doc:`Commissions <../../sales/sales/commissions>` diff --git a/content/applications/hr/payroll/payslips/commission-details.png b/content/applications/hr/payroll/commissions/commission-details.png similarity index 100% rename from content/applications/hr/payroll/payslips/commission-details.png rename to content/applications/hr/payroll/commissions/commission-details.png diff --git a/content/applications/hr/payroll/contracts.rst b/content/applications/hr/payroll/contracts.rst index 20d1ec0195..1302f3d53c 100644 --- a/content/applications/hr/payroll/contracts.rst +++ b/content/applications/hr/payroll/contracts.rst @@ -4,52 +4,63 @@ Contracts Every employee in Odoo is required to have a running contract in order to be paid. A contract outlines the terms of an employee's position, their compensation, working hours, and any -other details about their position. +other relevant details pertaining to their compensation. .. important:: - Contract documents (PDFs) are uploaded and organized using the *Documents* application, and are - signed using the *Sign* application. Ensure these applications are installed to send and sign + Contract documents (PDFs) are uploaded and organized using the **Documents** application, and are + signed using the **Sign** application. Ensure these applications are installed to send and sign contracts. Please refer to the :doc:`../../productivity/documents` and - :doc:`../../productivity/sign` documentation. + :doc:`../../productivity/sign` documentation for more information. -To view the employee contracts, go to the :menuselection:`Payroll app --> Contracts --> Contracts` -from the top menu. All employee contracts, and their current contract status, are displayed in a -list view, by default. The list view displays running contracts, contracts that require action, -expired contracts, and cancelled contracts. +.. _payroll/contract-dashboard: + +Contracts dashboard +=================== + +Both the **Payroll** and **Employees** apps display *identical employee contract information*. + +To access the contracts dashboard from the **Employees** app, navigate to :menuselection:`Employees +app --> Employees --> Contracts`. To access the contracts dashboard from the **Payroll** app, +navigate to :menuselection:`Payroll app --> Contracts --> Contracts`. + +The :guilabel:`Contracts` dashboard displays all employee contracts in a default list view, grouped +by :guilabel:`Status`. The available status groupings are :guilabel:`New`, :guilabel:`Running`, +:guilabel:`Expired`, and :guilabel:`Cancelled`. Each grouping displays the number of contracts +within the grouping. .. image:: contracts/contracts-overview.png - :align: center :alt: Contracts dashboard view showing running contracts and contracts with issues. .. note:: - The list of contracts in the *Payroll* application matches the list of contracts in the - *Employees* application. + Any changes made to contracts in the **Employees** app is reflected in the **Payroll** app, and + vice versa. Contract information remains identical, regardless of where the contract information + is accessed. .. _payroll/new-contract: -In order for an employee to be paid, an active contract is required. If a new contract is needed, -click the :guilabel:`Create` button on the :guilabel:`Contracts` dashboard. A contract form appears -where the information can be entered. +Create a contract +================= -New contract form ------------------ +To create a new contract, click the :guilabel:`New` button on the :ref:`Contracts dashboard +`, and a blank contract form appears. .. _payroll/gen-info: General information section --------------------------- -- :guilabel:`Contact Reference`: type in the name or title for the contract, such as `John Smith +Enter the following information in the top-half of the blank contract form: + +- :guilabel:`Contact Reference`: Type in the name or title for the contract, such as `John Smith Contract`. This field is **required**. -- :guilabel:`Employee`: using the drop-down menu, select the employee that the contract applies to. -- :guilabel:`Contract Start Date`: the date the contract starts. To choose a date, click the - drop-down menu, navigate to the correct month and year with the :guilabel:`< > (arrow)` icons, - then click on the desired date. This field is **required**. -- :guilabel:`Contract End Date`: if the contract has a specific end date, click the drop-down menu, - navigate to the correct month and year with the :guilabel:`< > (arrow)` icons, then click on the - desired date. -- :guilabel:`Working Schedule`: select one of the working schedules from the drop-down menu. This - field is **required**. +- :guilabel:`Employee`: Using the drop-down menu, select the employee the contract is for. +- :guilabel:`Contract Start Date`: Required. Defaults to the current date. To choose a different + date, click into the field. In the popover calendar, select a different date. +- :guilabel:`Contract End Date`: Optional. Select a date from the calendar popover, or leave blank + for an indefinite contract. +- :guilabel:`Working Schedule`: Select one of the available working schedules the employee is + expected to work, from the drop-down menu. If this field is left blank, this allows the employee + to work as many or as few hours as desired every week, with no restrictions. .. tip:: The :guilabel:`Working Schedule` drop-down menu displays all the working schedules for the @@ -57,247 +68,217 @@ General information section Configuration --> Working Schedules`. Click :guilabel:`New`, and create a new working schedule, or click on an existing working schedule and make edits. -- :guilabel:`Work Entry Source`: select how the :doc:`work entries ` are generated. - This field is **required**. Click the radio button next to the desired selection. The options are: +- :guilabel:`Work Entry Source`: Using the drop-down menu, select how the :doc:`work entries + ` are generated. This field is **required**. Click the radio button next to the + desired selection. The options are: - - :guilabel:`Working Schedule`: work entries are generated based on the selected + - :guilabel:`Working Schedule`: Work entries are generated based on the selected :guilabel:`Working Schedule`. - - :guilabel:`Attendances`: work entries are generated based on the employee's check-in records in - the *Attendances* application. (This requires the *Attendances* application). - - :guilabel:`Planning`: work entries are generated based on the planned schedule for the employee - from the *Planning* application. (This requires the *Planning* application). + - :guilabel:`Attendances`: Work entries are generated based on the employee's check-in records in + the **Attendances** app. (This requires the **Attendances** app to be installed). + - :guilabel:`Planning`: Work entries are generated based on the planned schedule for the employee + from the **Planning** app. (This requires the **Planning** app to be installed). -- :guilabel:`Salary Structure Type`: select one of the salary structure types from the drop-down +- :guilabel:`Salary Structure Type`: Select one of the salary structure types from the drop-down menu. The default salary structure types are :guilabel:`Employee` or :guilabel:`Worker`. A :ref:`new salary structure type ` can be created, if needed. -- :guilabel:`Department`: select the department the contract applies to from the drop-down menu. -- :guilabel:`Job Position`: select the specific job position the contract applies to from the - drop-down menu. +- :guilabel:`Department`: Select the department the employee is working within, using the drop-down + menu. +- :guilabel:`Job Position`: Select the employee's specific job position using the drop-down menu. .. note:: If the selected :guilabel:`Job Position` has a contract template linked to it with a specific :guilabel:`Salary Structure Type`, the :guilabel:`Salary Structure Type` changes to the one associated with that :guilabel:`Job Position`. -- :guilabel:`Wage on Payroll`: enter the employee's monthly wage. -- :guilabel:`Contract Type`: choose either :guilabel:`Permanent`, :guilabel:`Temporary`, - :guilabel:`Seasonal`, :guilabel:`Full-Time`, or :guilabel:`Part-Time` from the drop-down menu. +- :guilabel:`Contract Type`: Using the drop-down menu, select the type of contract being created. + The default options are :guilabel:`Permanent`, :guilabel:`Temporary`, :guilabel:`Seasonal`, + :guilabel:`Full-Time`, :guilabel:`Intern`, :guilabel:`Student`, :guilabel:`Apprenticeship`, + :guilabel:`Thesis`, :guilabel:`Statutory`, and :guilabel:`Employee`. +- :guilabel:`Wage on Payroll`: Enter the employee's monthly wage in this field. -.. figure:: contracts/required-fields.png - :align: center - :alt: New contract form to be filled in when creating a new contract, with required fields - outlined in red. + .. tip:: + The :guilabel:`Working Schedule` drop-down menu displays all the working times for the selected + :guilabel:`Company`. To modify or add to this list, go to :menuselection:`Payroll app --> + Configuration --> Working Times`, and either :guilabel:`Create` a new working time, or click on + an existing working time, then edit it by clicking :guilabel:`Edit`. -.. tip:: - The :guilabel:`Working Schedule` drop-down menu displays all the working times for the selected - :guilabel:`Company`. To modify or add to this list, go to :menuselection:`Payroll app --> - Configuration --> Working Times`, and either :guilabel:`Create` a new working time, or click on - an existing working time, then edit it by clicking :guilabel:`Edit`. +- :guilabel:`HR Responsible`: Select the person who is responsible for validating the contract using + the drop-down menu. This field is required. + + .. note:: + The :guilabel:`HR Responsible` field only appears if the **Salary Configurator** + (`hr_contract_salary`) module and the **Sign** app are both installed. -- :guilabel:`Yearly Cost (Real)`: this field automatically updates after the :guilabel:`Schedule +.. figure:: contracts/required-fields.png + :alt: New contract form to be filled in when creating a new contract. + +Salary information tab +---------------------- + +The :guilabel:`Salary Information` tab is where the specific details of how much and how often the +employee is paid. Fill in the following fields in this tab: + +- :guilabel:`Wage Type`: Using the drop-down menu, select what kind of pay the employee receives. + The two default options are :guilabel:`Fixed Wage` or :guilabel:`Hourly Wage`. Select + :guilabel:`Fixed Wage` for salaried employees, and select :guilabel:`Hourly Wage` for employees + who are paid based on their logged worked hours. +- :guilabel:`Schedule Pay`: Using the drop-down menu, select how often the employee is paid. The + default options are :guilabel:`Annually`, :guilabel:`Semi-annually`, :guilabel:`Quarterly`, + :guilabel:`Bi-monthly`, :guilabel:`Monthly`, :guilabel:`Semi-monthly`, :guilabel:`Bi-weekly`, + :guilabel:`Weekly`, or :guilabel:`Daily`. +- :guilabel:`Wage`: Enter the amount the employee receives each pay period. The first field allows + for a wage to be entered, the second field displays how often the pay is issued to the employee. + The second field *cannot** be modified, and is updated when the :guilabel:`Schedule Pay` field + changes. +- :guilabel:`Yearly Cost (Real)`: This field automatically updates after the :guilabel:`Schedule Pay` and :guilabel:`Wage` fields are entered. This amount is the total yearly cost for the employer. This field can be modified. However, if this is modified, the :guilabel:`Wage` field updates, accordingly. Ensure both the :guilabel:`Wage` and :guilabel:`Yearly Cost (Real)` are correct if this field is modified. -- :guilabel:`Monthly Cost (Real)`: this field automatically updates after the :guilabel:`Schedule +- :guilabel:`Monthly Cost (Real)`: This field automatically updates after the :guilabel:`Schedule Pay` and :guilabel:`Wage` fields are entered. This amount is the total monthly cost for the employer. This field **cannot** be modified, and is calculated based on the :guilabel:`Yearly Cost (Real)`. - .. image:: contracts/salary-info.png - :align: center - :alt: Optional tabs for a new contract. +.. figure:: contracts/salary-info.png + :alt: The Salary Information tab filled out. -Contract Details tab --------------------- +Details tab +----------- -The :guilabel:`Contract Details` tab allows for the addition and editing of a contract, along with -specifying which template to use when a new contract is created. These fields **must** be populated -in order to create a new contract. +The :guilabel:`Details` tab of the contract houses the contract template information, accounting +information (refer to the :doc:`country-specific localization document ` for +more information), any part time work information, and notes. Fill out the following fields in this +tab: -.. important:: - To access the various contract template fields in the :guilabel:`Contract Details` tab, the - *Salary Configurator* (`hr_contract_salary`) module **must** be :ref:`installed - `. +- :guilabel:`Contract Template`: Using the drop-down menu, select a contract template to use when + making an offer to an applicant. - When the *Salary Configurator* module is installed, the *Salary Configurator - Holidays* and - *Salary Configurator - Payroll* modules install, as well. + .. note:: + Contract templates are typically created through the **Payroll** app configuration menu, and + stored in the **Documents** app. To view the contract templates, and to create new ones, + navigate to :menuselection:`Payroll app --> Configuration --> Templates`. - Once the modules are installed, the database reverts to the main dashboard. +- :guilabel:`Originated Offer`: This field automatically populates with the original offer sent to + the employee. This field is **not** modifiable, and is only populated if applicable. +- :guilabel:`Part Time`: Tick the checkbox if the contract is for part time work. Once enabled, a + percentage field appears next to the checkbox. The percentage **cannot** be modified, and + automatically updates based on the selected :guilabel:`Working Schedule` in the top-half of the + contract, compared to the typical working schedule for the company (typically 40 hours/week). -- :guilabel:`Contract Template`: select a pre-existing contract template from the drop-down menu. - Contract templates are typically created through the configuration menu, and stored in the - *Documents* application. -Sign section -~~~~~~~~~~~~ + - :guilabel:`Standard Calendar`: This field is automatically populated with the default working + schedule for the company. In most cases, this is :guilabel:`Standard 40 hours/week`. + - :guilabel:`Part Time Work Entry Type`: Using the drop-down menu, select the work entry type that + generates the balance of a full-time working schedule. -- :guilabel:`HR Responsible`: select the person who is responsible for validating the contract from - the drop-down menu. This field is required. -- :guilabel:`New Contract Document Template`: select a contract from the drop-down menu to be - modified for this new employee contract. These documents are stored in the *Sign* application. -- :guilabel:`Contract Update Document Template`: select a contract from the drop-down menu, if the - employee has an existing contract that requires updating. These documents are stored in the *Sign* - application. + .. example:: + An employee contract is being created for a part-time employee who works 20 hours a week. -.. important:: - The :guilabel:`HR Responsible`, :guilabel:`New Contract Document Template`, and - :guilabel:`Contract Update Document Template` fields are only visible if the *Sign* application - is installed, along with the `hr_contract_salary` and `hr_contract_salary_payroll` :doc:`modules - <../../general/apps_modules>`. The *Sign* application is where the contract templates are stored. - This application is required for an employee to sign any contract. - -Accounting section -~~~~~~~~~~~~~~~~~~ - -- :guilabel:`Analytic Account`: select the account the contract affects from the drop-down menu. It - is recommended to check with the accounting department to ensure the correct account is selected. - -Part Time section -~~~~~~~~~~~~~~~~~ - -- :guilabel:`Part Time`: tick this box if the employee is working part-time. When active, additional - fields appear: - - - :guilabel:`% (Percentage)`: enter the percent of time the employee works as compared to a - full-time employee. - - :guilabel:`Standard Calendar`: select the working hours that a typical full-time worker uses - from the drop-down menu. - - :guilabel:`Part Time Work Entry Type`: select the work entry type that generates the balance of - a full-time working schedule. - - .. example:: - If a full-time employee works 40 hours a week, and the employee works 20, enter `50` in the - :guilabel:`% (Percentage)` field (50% of 40 hours = 20 hours). The employee generates twenty - (20) hours of work entries under the work entry type `part-time`, and another twenty (20) - hours of work entries under the work entry type `generic time off`, for a total of forty (40) - hours worth of work entries. - -Notes section -~~~~~~~~~~~~~ - -- :guilabel:`Notes`: a text field where any notes for the employee contract are entered for future - reference. - -.. image:: contracts/contract-details.png - :align: center - :alt: Contract details in optional tabs for a new contract. - -Modify a contract template -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Click the :icon:`fa-external-link` :guilabel:`(external Link)` icon at the end of either the -:guilabel:`New Contract Document Template` or :guilabel:`Contract Update Document Template` to open -the corresponding contract template, and proceed to make any desired changes. - -Click the :guilabel:`Upload your file` button next to the corresponding document, navigate to the -file, then click :guilabel:`Open` to select the document and add it to the tab. - -Modifying document templates -============================ - -Contracts templates can be modified at any point when changes are needed. - -- :guilabel:`Tags`: select any tags associated with the contract. -- :guilabel:`Signed Document Workspace`: this is where the signatures are stored. Choose a - pre-configured workspace, or create a new one. To create a new :guilabel:`Signed Document - Workspace`, type in the name of the workspace, then click either :guilabel:`Create` to add the new - workspace, or :guilabel:`Create and Edit` to add the workspace and modify the workspace details. -- :guilabel:`Signed Document Tags`: select or create any tags that are only associated with the - signed contract, as opposed to the original unsigned contract. -- :guilabel:`Redirect Link`: enter a redirect link for the employee to access the contract. A - redirect link takes the user from one URL to another. In this case, it takes them to the - newly-updated contract specifically written for them. -- :guilabel:`Who can Sign`: select either :guilabel:`All Users` or :guilabel:`On Invitation`. - - - :guilabel:`All Users`: any user in the organization can sign the contract. - - :guilabel:`On Invitation`: only users selected in this field can sign the contract. - -- :guilabel:`Invited Users`: select the person (or people) that can sign the document. -- :guilabel:`Document`: the attached document can be replaced by clicking the :icon:`fa-pencil` - :guilabel:`(pencil)` icon. A pop-up window appears, so another document can be selected for - upload. The file **must** be a PDF. To remove the document, click the :icon:`fa-trash-o` - :guilabel:`(trash can)` icon. - -Once the edits are complete, click the :guilabel:`Save` button. All the information for the selected -contract template populates the fields in the :guilabel:`Salary Information` tab. Any additional -tabs, such as :guilabel:`Personal Documents`, appears if applicable. - -Personal documents ------------------- + To configure this, the employee's :guilabel:`Working Schedule` is set to :guilabel:`20 + Hours/Part time` in the :ref:`general information section `. In the + :guilabel:`Details` tab, the :guilabel:`Part Time` checkbox is ticked, and the percentage is + set to `50`. The :guilabel:`Standard Calendar` is set to :guilabel:`Standard 40 hours/week`, + and the :guilabel:`Part Time Work Entry Type` is set to :guilabel:`Unpaid`. -This tab **only** appears after an :guilabel:`Employee` is selected, and houses any documents that -are linked to the employee on their employee record. Documents cannot be added to this tab, this tab -**only** shows documents that are already uploaded and associated with the employee. + When a typical work week is processed in the **Payroll** app, the employee generates twenty + (20) hours of regular work entries under the work entry type `Attendance`, and another twenty + (20) hours of work entries under the work entry type `Unpaid`, for a total of forty (40) hours + worth of work entries. -The available documents in this tab can be downloaded. Click the :icon:`fa-download` -:guilabel:`(download)` icon next to the document to download it. +- :guilabel:`Notes`: Enter any relevant notes for the contract in this field. -Send the contract ------------------ +.. figure:: contracts/details-tab.png + :alt: The Details tab filled out. -Click on the following button to send the contract to the employee: +Signatories tab +--------------- -.. image:: contracts/send-contract.png - :align: center - :alt: Send the contract to the employee via one of the buttons. +The :guilabel:`Signatories` tab is where the default contract templates are selected, for both new +and updated contracts. -- :guilabel:`Generate Offer`: Clicking this opens a pop-up window that contains the basic - information from the contract, as well as a link for the contract when using the salary - configurator. Click :guilabel:`Send` to send an email to the employee, so they can sign - the contract. +Using the drop-down menu, select the default contract template to use when creating a new or updated +contract, in the respective fields. -At the bottom of the pop-up form is a :guilabel:`Link Expiration Date`. This is the timeframe that -the contract offer is valid for. By default, this field is pre-populated with `30 days`, but it can -be modified. +Once a PDF template is selected, any mapped signature fields in the file appear in a list, below the +selection, identifying who must sign the document. These fields **cannot** be updated. - .. note:: - In order to send a contract using the :guilabel:`Generate Simulation Link`, there **must** be a - signature field in the contract PDF being sent to the employee, so they can sign it. +Any changes to the template and signatories but be done in the **Sign** app, where contract +templates are uploaded, modified, and stored. + +.. important:: + The :guilabel:`PDF Template` fields are only visible if the **Sign** app is installed, along with + the :guilabel:`hr_contract_salary` and :guilabel:`hr_contract_salary_payroll` + :doc:`modules <../../general/apps_modules>`. + +.. figure:: contracts/signatories.png + :alt: The Signatories tab with the roles specified for signing. + +Personal documents tab +---------------------- -- :guilabel:`Signature Request`: clicking this reveals a pop-up window, where an email can be typed - to the employee. Select the document (such as a contract, NDA, or Homeworking Policy) from the - drop-down menu, and fill out the email section. Click :guilabel:`Send` when the email is ready to - be sent. +Occasionally, additional paperwork may be required when creating a contract, such as legal documents +declaring the employee is able to work in the country. When this situation occurs, Odoo allows for +one image file of the necessary document to be attached to a contract in the :guilabel:`Personal +Documents` tab. + +Click the :guilabel:`Upload your file` button, navigate to the desired document, and click +:guilabel:`Select` to attach the file to the contract. The file name appears on the +:guilabel:`Image` line. .. note:: - To send a contract using the :guilabel:`Generate Simulation Link`, there **must** be a signature - field in the contract PDF being sent to the employee, so they can sign it. + This tab **only** appears after an :guilabel:`Employee` is selected. Additionally, only image + files can be attached in this field at this time. Salary attachments ------------------ -Any automatic deductions or allocations for an employee, such as child support payments and wage -garnishments, are referred to as a *salary attachment*. This section is where all of these -deductions or allocations are set. - -To add a new deduction, first navigate to :menuselection:`Payroll app --> Contracts --> Salary -Attachments`. Next, click :guilabel:`Create`, and a new salary attachment form loads. - -.. image:: contracts/garnishment.png - :align: center - :alt: The salary attachment form with everything filled in for Ronnie Hart's child support. - -Fill out the following fields on the form: - -- :guilabel:`Employee`: using the drop-down menu, select the employee the salary attachment applies - to. -- :guilabel:`Description`: enter a short description for the salary attachment, such as `Child - Support` or `529 Contribution`. -- :guilabel:`Type`: using the drop-down menu, select the type of salary attachment being created. -- :guilabel:`Start Date`: the date the salary attachment starts. Choose a date by clicking on the - drop-down menu, navigating to the correct month and year by using the :icon:`fa-chevron-left` - :icon:`fa-chevron-right` :guilabel:`(arrow)` icons, then clicking on the desired date. This field - is **required**. -- :guilabel:`Estimated End Date`: this field automatically populates after both the - :guilabel:`Monthly Amount` and :guilabel:`Total Amount` fields are populated. This field is - **not** modifiable. -- :guilabel:`Document`: attach any documents relevant to the salary attachment. Click the - :guilabel:`Upload Your File` button, navigate to the desired document in the file explorer, then - click :guilabel:`Open` to select the document, and attach it to the form. To change the attached - document, click the :icon:`fa-pencil` :guilabel:`(pencil)` icon, and select a different document. - To remove a document, click the :icon:`fa-trash-o` :guilabel:`(trash can)` icon. -- :guilabel:`Monthly Amount`: enter the amount to be taken out of the employee's paycheck every - month for this specific salary attachment. -- :guilabel:`Total Amount`: enter the total amount that the employee pays for the salary attachment - to be completed. +After an employee is selected for the contract, a :icon:`fa-book` :guilabel:`Salary Attachments` +smart button appears at the top of the page. + +For new employees who do not currently have a contract, the smart button displays :guilabel:`New`. +If the contract is being updated for a current employee who already has salary attachments +configured, the smart button displays the number of salary attachments currently running. + +:doc:`Create or update any necessary salary attachments ` for the contract, +before sending. + +Send a contract +=============== + +After a contract has been created and configured, the next step is to send it to the employee or +applicant. Click the :guilabel:`Generate Offer` button, and the :guilabel:`Offer for (Employee)` +form loads. + +The :guilabel:`Offer for (Employee)` form displays all the basic information from the contract, as +well as a link the employee can use to sign the contract. The last field on the form is a +:guilabel:`Validity Days Count` field. This indicates how long the offer is valid. Enter the desired +number of days in the field. The default is `30` days. + +Click :guilabel:`Send By Email` and a pop-up email window loads, using a preconfigured default email +template. Click :guilabel:`Send` to send the offer. + +.. Important:: + In order to send a contract using the :guilabel:`Generate Offer` button, there **must** be an + employee signature field on the contract PDF being sent. + +.. image:: contracts/send-contract.png + :alt: Send the contract to the employee via one of the buttons. + +Contract status +=============== + +When creating and sending out a contract, the default status of the contract is :guilabel:`New`. + +Once there is a minimum of one completed signature on the document, the status changes to +:guilabel:`Partially Signed`. Internal users, such as HR and recruitment employees, are alerted in +the database when there is a signature requested of them. + +After all required parties have signed the contract, the status changes to :guilabel:`Fully Signed`. + +All status changes happen automatically as the document is signed. + +.. seealso:: + - :doc:`../../productivity/documents` + - :doc:`../../productivity/sign` diff --git a/content/applications/hr/payroll/contracts/contracts-overview.png b/content/applications/hr/payroll/contracts/contracts-overview.png index eaad0fcb64..b05a877610 100644 Binary files a/content/applications/hr/payroll/contracts/contracts-overview.png and b/content/applications/hr/payroll/contracts/contracts-overview.png differ diff --git a/content/applications/hr/payroll/contracts/details-tab.png b/content/applications/hr/payroll/contracts/details-tab.png new file mode 100644 index 0000000000..2ca8ea9509 Binary files /dev/null and b/content/applications/hr/payroll/contracts/details-tab.png differ diff --git a/content/applications/hr/payroll/contracts/required-fields.png b/content/applications/hr/payroll/contracts/required-fields.png index 648ab76bb7..880b5179f3 100644 Binary files a/content/applications/hr/payroll/contracts/required-fields.png and b/content/applications/hr/payroll/contracts/required-fields.png differ diff --git a/content/applications/hr/payroll/contracts/salary-info.png b/content/applications/hr/payroll/contracts/salary-info.png index 6e98b1e0aa..feba99fe67 100644 Binary files a/content/applications/hr/payroll/contracts/salary-info.png and b/content/applications/hr/payroll/contracts/salary-info.png differ diff --git a/content/applications/hr/payroll/contracts/send-contract.png b/content/applications/hr/payroll/contracts/send-contract.png index 3a0a2846d9..0308cee77c 100644 Binary files a/content/applications/hr/payroll/contracts/send-contract.png and b/content/applications/hr/payroll/contracts/send-contract.png differ diff --git a/content/applications/hr/payroll/contracts/signatories.png b/content/applications/hr/payroll/contracts/signatories.png new file mode 100644 index 0000000000..e266a517a4 Binary files /dev/null and b/content/applications/hr/payroll/contracts/signatories.png differ diff --git a/content/applications/hr/payroll/headcount.rst b/content/applications/hr/payroll/headcount.rst new file mode 100644 index 0000000000..8d9f0590ba --- /dev/null +++ b/content/applications/hr/payroll/headcount.rst @@ -0,0 +1,53 @@ +================ +Headcount report +================ + +The *Headcount report* in the **Payroll** app shows the number of employees on payroll and allows +headcount comparisons between different periods of time. + +Create a headcount report +========================= + +Create a headcount report to see the number of employees at a specific time or compare headcounts +across periods. + +To create a headcount report, navigate to :menuselection:`Payroll app --> Reporting --> Headcount` +and click :guilabel:`New`. + +- Report name: generated automatically as `Headcount for (Company Name) on the (YYYY-MM-DD)` and + **cannot** be modified. +- :guilabel:`Company`: populated automatically (works in both single and multi-company databases) +- :guilabel:`From`/:guilabel:`To` dates: defaults to current date (from) and blank (to). Adjust + these to define the period to analyze. + +.. image:: headcount/new-headcount.png + :alt: A headcount report form filled out for the third quarter of 2025. + +Next, click :guilabel:`Populate` to generate the report. + +At the top of the form, a :icon:`fa-people` :guilabel:`Employees` smart button appears. Clicking the +button displays the total number of employees for the selected period. + +View all headcount reports +========================== + +See how the company headcount has changed over time by viewing all headcount reports in a list view. + +To view all headcount reports, navigate to :menuselection:`Payroll app --> Reporting --> Headcount`. + +View employees in a headcount +----------------------------- + +TO get an overall view of employees and their salary impact on the company, view all employee +records of a specific headcount report. + +To view the employees of a specific headcount report, click the :icon:`fa-people` +:guilabel:`Employees` smart button at the top of a headcount report. + +All employees from the headcount appear in a list view, grouped by :guilabel:`Department`. + +- :guilabel:`Employee`: the employee's full name +- :guilabel:`Department`: the department their job position is in +- :guilabel:`Job Title`: their role +- :guilabel:`Employer Cost`: how much the company pays the employee each pay-period +- :guilabel:`Wage on Payroll`: the dollar amount on payroll reports diff --git a/content/applications/hr/payroll/headcount/new-headcount.png b/content/applications/hr/payroll/headcount/new-headcount.png new file mode 100644 index 0000000000..6907f4e1dd Binary files /dev/null and b/content/applications/hr/payroll/headcount/new-headcount.png differ diff --git a/content/applications/hr/payroll/payroll_localizations.rst b/content/applications/hr/payroll/payroll_localizations.rst index c871f03531..e7b88d402e 100644 --- a/content/applications/hr/payroll/payroll_localizations.rst +++ b/content/applications/hr/payroll/payroll_localizations.rst @@ -4,13 +4,60 @@ Payroll localizations ===================== -Payroll localization refers to the process of adapting payroll systems, policies, and compliance -measures to align with the specific labor laws, tax regulations, and social security requirements -of a particular country or region. This ensures that employee salaries, benefits, deductions, and -contributions are processed accurately and in full compliance with local legal and financial -obligations. Localization also includes integrating country-specific payroll elements such as -statutory benefits, holiday entitlements, termination rules, and reporting requirements, helping -businesses avoid legal risks while ensuring employees receive their correct compensation. +*Localizations* are country-specific settings preconfigured in Odoo at the creation of the database, +which account for all taxes, fees, and allowances for that particular country. + +*Payroll localizations* refer to the specific process of adapting payroll systems, policies, and +compliance measures to align with the specific labor laws, tax regulations, and social security +requirements of a particular country or region. + +This ensures that employee salaries, benefits, deductions, and contributions are processed +accurately and in full compliance with local legal and financial obligations. + +Localization also includes integrating country-specific payroll elements such as benefits, holidays, +termination rules, and reporting requirements, helping businesses avoid legal risks while ensuring +employees receive their correct compensation. + +Install localization package +============================ + +A country-specific localization module :ref:`must be installed ` to properly +configure and process payroll. To install the required module, first open the **Apps** app. + +Clear out the default :icon:`fa-filter` :guilabel:`Apps` filter, then type the name of the desired +country into the search bar. All available modules for that country are presented. + +.. example:: + Some countries only have one localization module, while other have multiple modules. This is + typically when other software is neede to process payroll, and importing and exporting data is + required. + + For example. when searching for **Payroll** modules for `Egypt`, the following modules appear in + the search, and must be installed: `Egypt - Payroll` and `Egypt - Payroll with Accounting`. + + Refer to the :ref:`country-specific documentation ` for a + complete list of the related **Payroll** modules required for each specific country. + +.. tip:: + To see if any localization modules have been installed on the database, navigate to + :menuselection:`Payroll app --> Configuration --> Settings`. In the :guilabel:`Settings` page, if + a localization module was installed, a :guilabel:`(Country) Localization` section appears. + +.. warning:: + It is **not** recommended to alter the localization settings, unless specifically required. + +.. note:: + Odoo can handle a multi-company configuration. This is generally done when there is a main + company or office location, such as a headquarters, and there are other offices/branches around + the country or globe, that fall under that main company or headquarters. In Odoo, each company, + including the headquarters, must be set up as their own company/branch using the multi-company + method. + + Each individual company can have a different localization setting, since locations can vary + anywhere in the world, where rules and laws differ. + + For more information on companies, refer to the :doc:`Companies <../../general/companies>` + documentation, which covers how to set up companies. .. _payroll_localizations/countries-list: @@ -20,13 +67,13 @@ List of countries Payroll localization modules are available for the countries listed below. .. note:: - New countries are frequently added to this list and Odoo keeps expanding and improving existing - localizations and the related documentation. + New countries are frequently added to this list, as Odoo keeps expanding and improving existing + localizations and related documentation. - :doc:`Australia ` - :doc:`Belgium ` - Bangladesh -- Egypt +- :doc:`Egypt ` - :doc:`Hong Kong ` - India - Indonesia @@ -53,6 +100,8 @@ Payroll localization modules are available for the countries listed below. payroll_localizations/australia payroll_localizations/belgium + payroll_localizations/egypt payroll_localizations/hong_kong payroll_localizations/jordan payroll_localizations/united_arab_emirates + payroll_localizations/employment_hero diff --git a/content/applications/hr/payroll/payroll_localizations/egypt.rst b/content/applications/hr/payroll/payroll_localizations/egypt.rst new file mode 100644 index 0000000000..d251882fc5 --- /dev/null +++ b/content/applications/hr/payroll/payroll_localizations/egypt.rst @@ -0,0 +1,298 @@ +===== +Egypt +===== + +The Egypt **Payroll** localization package enables payroll processing that fully complies with +Egyptian labor laws. It calculates progressive income tax, employee- and employer-paid social +security, and core salary components, including housing and transportation allowances. + +Configuration +============= + +:ref:`Install ` the following modules to get all the features of the Egypt +**Payroll** localization: + +.. list-table:: + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`Egypt - Payroll` + - `l10n_eg_hr_payroll` + - Payroll module includes all salary rules, leave logic, and compensation rules compliant with + Egyptian Labor Law. + * - :guilabel:`Egypt - Payroll with Accounting` + - `l10n_eg_hr_payroll_account` + - Adds account mappings related to payroll calculations. + +.. seealso:: + :doc:`Egypt fiscal localization documentation <../../../finance/fiscal_localizations/egypt>` + +Egyptian employee contracts +=========================== + +Once an employee has been :doc:`created in the database <../../employees/new_employee>`, a +:ref:`contract must be created `. + +To check if the user already has a contract, navigate to the **Employees** app, then click on the +employee's Kanban card. The :icon:`fa-book` :guilabel:`Contracts` smart button displays a red zero +when no contract exists. Otherwise, it displays :guilabel:`In contract since (contract start date)` +in green. + +.. note:: + Contracts can also be found by navigating to :menuselection:`Employees app --> Employees --> + Contracts`. All contracts appear in a list view, grouped by status. + +Populate the following contractual information in the :guilabel:`Salary Information` tab of the +contract: + +- :guilabel:`Social Insurance Reference Amount`: Used as the base amount for calculating the + :ref:`social insurance employee and employer portions + `. +- :guilabel:`Number of Leave Days`: Used for calculating the :ref:`provision amount for the annual + leave for the employee `. +- :guilabel:`Provision Number of Days`: Corresponds with the number of days used in the calculation + of the :ref:`provision value of the end of service for the employee + `. +- :guilabel:`Total Number of Days`: Refers to the number of days used to calculate the + :ref:`end-of-service benefit paid to the employee when their employment with the company ends + `. + +.. _payroll/payroll_localizations/social-insurance: + +Social insurance +================ + +Social insurance rules calculate the contribution amounts that are to be paid by the employer and +employee to the :abbr:`NOSI (National Organization for Social Insurance)`. This is only available +for Egyptian employees. + +The employer contributes 18.75% of the social insurance reference amount for the employee. On the +other hand, the employee contributes 11% of their insurance reference amount, and that amount gets +deducted from the payslip amount. + +.. important:: + The social insurance reference amount is set per employee in their contracts. + +Leaves +====== + +The following leave types are available to employees working in Egypt: :ref:`Annual leave +`, :ref:`Sick leave `, +:ref:`Unpaid leave `, and :ref:`Other leave types +`. + +.. _payroll/payroll_localizations/annual: + +Annual leave +------------ + +Employees are eligible for 21 days of annual leave, and if the employee requires more days, they +have to be :ref:`requested from HR managers ` accordingly. + +.. important:: + Since the annual leave is fully paid, it is not connected to a salary rule, but it will appear on + the worked days on the payslip form and on the PDF printout. + +.. _payroll/payroll_localizations/sick: + +Sick leave +---------- + +Three cases exist for sick leaves in terms of the amount to be deducted from the employee: + +- :guilabel:`Fully paid`: first 30 calendar days each year (affects only working entries; no payroll + deduction). + + **Payroll computation** =(Daily Wage) + +- :guilabel:`75% paid`: next 60 days; payroll rule deducts 25% of an employee's salary. + + **Payroll computation** =(Daily Wage * 0.25) + +- :guilabel:`0% paid`: after 90 days; payroll rule deducts 100% of an employee's salary. + + **Payroll computation** =(Daily Wage * 0.00) + +.. _payroll/payroll_localizations/unpaid: + +Unpaid leave +------------ + +Deductions are applied on the employee's salary based on the number of unpaid leave days taken, and +it is calculated by dividing the monthly salary for the employee by 30 to get the daily salary and +then multiplying it by the number of unpaid leave days taken. + +.. _payroll/payroll_localizations/other: + +Other leave types +----------------- + +These are leave types considered fully paid and do not affect the end payslip, but are tracked in +the working entries: + +- Maternity leave +- Hajj leave +- Death leave + +Income tax +========== + +In Egypt, employees are subject to a progressive income tax system, where tax rates increase with +higher annual income brackets. + +Tax brackets +------------ + +Depending on the annual income of the employee, the following rates apply: + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Taxable Amount + - <600k + - 600k - 699k + - 700k - 799k + - 800k - 899k + - 900k - 1.2M + - >1.2M + * - 0% + - 1-40k + - - + - - + - - + - - + - - + * - 10% + - More than 40k to 55k + - 1 - 55k + - - + - - + - - + - - + * - 15% + - More than 55k to 70k + - More than 55k to 70k + - 1 - 70k + - - + - - + - - + * - 20% + - More than 70k to 200k + - More than 70k to 200k + - More than 70k to 200k + - 1 - 200k + - - + - - + * - 22.5% + - More than 200k to 400k + - More than 200k to 400k + - More than 200k to 400k + - More than 200k to 400k + - 1 - 400k + - - + * - 25% + - More than 400k + - More than 400k + - More than 400k + - More than 400k + - More than 400k + - 1 - 1.2M + * - 27.5% + - - + - - + - - + - - + - - + - More than 1.2M + +Exemptions +---------- + +Employees are eligible to an EGP 20,000 personal exception on their gross income. + +Overtime +======== + +Depending on the time of day and the time at which the overtime is recorded in, the additional +amount to be paid to the employee can be as follows: + +- During daytime hours on working days, the amount is 1.35x times the employee's hourly wage. +- During nighttime hours on working days, the amount is 1.70x times the employee's hourly wage. +- On rest days and public holidays: The amount is 2.0x times the employee's hourly wage. + +.. note:: + Overtime hours are registered as other inputs directly on payslips. + +.. _payroll/payroll_localizations/provisions: + +Provisions +========== + +Provisions are the amounts computed by the employer to account for the payments made to the employee +for :abbr:`EOS (end-of-service)` benefits or annual leave. And it is computed on a monthly basis. + +End of service benefit provision +-------------------------------- + +It is computed by dividing the end of service Provision Number of Days by 12 and multiplying the +result by the daily salary for the employee. + +.. math:: + :class: overflow-scroll + + \text{Payroll computation} = \frac{\text{Provision Number of Days}}{12} \times \frac{\text{Wage} + \text{Allowances}}{30} + +Annual leave provision +---------------------- + +It is computed by dividing the number of leave days by 12 and multiplying the result by the daily +salary for the employee. + +.. math:: + :class: overflow-scroll + + \text{Payroll computation} = \frac{\text{Number of Leave Days}}{12} \times \frac{\text{Wage} + \text{Allowances}}{30} + +.. _payroll/payroll_localizations/end-of-service: + +End of service +============== + +At the end of the service slip that is generated for the employee, there are the following points +that are unique only to the payslip: + +Unused leaves compensation +-------------------------- + +The number of available annual leaves is shown on the employee's record. It is based on the annual +leave type defined in the Payroll settings. It is calculated as the total remaining allocations for +that specific leave type assigned to the employee. + +That number is then multiplied by the daily rate for the employee and added as an allowance on their +payslip. + +End of service benefit +---------------------- + +It is calculated by multiplying the daily wage of the employee by the number of days for the end of +service that is set in the employee's contract. + +.. math:: + :class: overflow-scroll + + \text{Payroll computation} = \frac{\text{Wage + Allowances}}{30} \times \text{End of Service Number of Days} + +Out of contract +=============== + +Out-of-contract days are the days that fall within the payslip period but are not included in the +employee's contract period. The corresponding amount is added as a deduction on the payslip and is +calculated by multiplying the number of out-of-contract days by the employee's daily wage. + +.. math:: + :class: overflow-scroll + + \text{Payroll computation} = \frac{\text Wage + Allowances}{\text{Days in the Month}} \times \text{Out of Contract Days} diff --git a/content/applications/finance/fiscal_localizations/employment_hero.rst b/content/applications/hr/payroll/payroll_localizations/employment_hero.rst similarity index 78% rename from content/applications/finance/fiscal_localizations/employment_hero.rst rename to content/applications/hr/payroll/payroll_localizations/employment_hero.rst index 1aa1159fa4..b47d18f844 100644 --- a/content/applications/finance/fiscal_localizations/employment_hero.rst +++ b/content/applications/hr/payroll/payroll_localizations/employment_hero.rst @@ -4,7 +4,7 @@ Employment Hero Payroll The `Employment Hero `_ module synchronises payslip accounting entries (e.g., expenses, social charges, liabilities, taxes) automatically from Employment Hero to Odoo. -Payroll administration is still done in Employment Hero. We only record the **journal entries** in +Payroll administration is still done in Employment Hero, but the **journal entries** are done in Odoo. .. important:: @@ -25,13 +25,13 @@ Configuration :alt: Enabling Employment Hero Integration in Odoo Accounting displays new fields in the settings - - You can find the API Key in the :guilabel:`My Account` section of the Employment Hero platform. + - The API Key can be found in the :guilabel:`My Account` section of the Employment Hero platform. .. image:: employment_hero/employment-hero-myaccount.png :alt: "Account Details" section on the Employment Hero dashboard - The **Payroll URL** is left empty by default to avoid any confusion. Please fill it according - to the documentation specific to your localization. + to the documentation specific to the localization. .. note:: Employment hero is available for :ref:`Australia `, @@ -40,12 +40,12 @@ Configuration :ref:`Singapore `, and the :ref:`United Kingdom `. - - You can find the **Business ID** in the Employment Hero URL. (i.e., `189241`) + - The **Business ID** can be found in the Employment Hero URL. (i.e., `189241`) .. image:: employment_hero/employment-hero-business-id.png - :alt: The Employment Hero "Business ID" number is in the URL + :alt: The Employment Hero Business ID number is in the URL - - You can choose any Odoo journal to post the payslip entries. + - Choose any Odoo journal to post the payslip entries. #. Configure the tax by going to :menuselection:`Accounting --> Configuration --> Taxes`. Create the necessary taxes for the Employment Hero payslip entries. Fill in the tax code from **Employment Hero** in the :guilabel:`Matching Employment Hero Tax` field. @@ -60,7 +60,7 @@ the same record in Employment Hero and Odoo. .. image:: employment_hero/employment-hero-journal-entry.png :alt: Example of a Employment Hero Journal Entry in Odoo Accounting (Australia) -By default, the synchronisation happens once per week. You can fetch the records manually by going +By default, the synchronisation happens once per week. The records can be fetched manually by going to :menuselection:`Accounting --> Configuration --> Settings` and, in the :guilabel:`Enable Employment Hero Integration` option, click on :guilabel:`Fetch Payruns Manually`. @@ -71,6 +71,6 @@ The accounts used by Employment Hero are defined in the section :guilabel:`Payro .. image:: employment_hero/employment-hero-chart-of-accounts.png :alt: Chart of Accounts menu in Employment Hero -For the API to work, you need to create the same accounts as the default accounts of your Employment -Hero business (**same name and same code**) in Odoo. You also need to choose the correct account -types in Odoo to generate accurate financial reports. +For the API to work, create the same accounts as the default accounts of the Employment Hero +business (**same name and same code**) in Odoo. The correct account types must be chosen in Odoo to +generate accurate financial reports. diff --git a/content/applications/finance/fiscal_localizations/employment_hero/employment-hero-business-id.png b/content/applications/hr/payroll/payroll_localizations/employment_hero/employment-hero-business-id.png similarity index 100% rename from content/applications/finance/fiscal_localizations/employment_hero/employment-hero-business-id.png rename to content/applications/hr/payroll/payroll_localizations/employment_hero/employment-hero-business-id.png diff --git a/content/applications/finance/fiscal_localizations/employment_hero/employment-hero-chart-of-accounts.png b/content/applications/hr/payroll/payroll_localizations/employment_hero/employment-hero-chart-of-accounts.png similarity index 100% rename from content/applications/finance/fiscal_localizations/employment_hero/employment-hero-chart-of-accounts.png rename to content/applications/hr/payroll/payroll_localizations/employment_hero/employment-hero-chart-of-accounts.png diff --git a/content/applications/finance/fiscal_localizations/employment_hero/employment-hero-integration.png b/content/applications/hr/payroll/payroll_localizations/employment_hero/employment-hero-integration.png similarity index 100% rename from content/applications/finance/fiscal_localizations/employment_hero/employment-hero-integration.png rename to content/applications/hr/payroll/payroll_localizations/employment_hero/employment-hero-integration.png diff --git a/content/applications/finance/fiscal_localizations/employment_hero/employment-hero-journal-entry.png b/content/applications/hr/payroll/payroll_localizations/employment_hero/employment-hero-journal-entry.png similarity index 100% rename from content/applications/finance/fiscal_localizations/employment_hero/employment-hero-journal-entry.png rename to content/applications/hr/payroll/payroll_localizations/employment_hero/employment-hero-journal-entry.png diff --git a/content/applications/finance/fiscal_localizations/employment_hero/employment-hero-myaccount.png b/content/applications/hr/payroll/payroll_localizations/employment_hero/employment-hero-myaccount.png similarity index 100% rename from content/applications/finance/fiscal_localizations/employment_hero/employment-hero-myaccount.png rename to content/applications/hr/payroll/payroll_localizations/employment_hero/employment-hero-myaccount.png diff --git a/content/applications/hr/payroll/payslips.rst b/content/applications/hr/payroll/payslips.rst index 022aa91947..db309f40ac 100644 --- a/content/applications/hr/payroll/payslips.rst +++ b/content/applications/hr/payroll/payslips.rst @@ -2,222 +2,172 @@ Payslips ======== -*Payslips* are generated by payroll officers through the :menuselection:`Payroll` application. - -The :guilabel:`Payslips` drop-down header of the :menuselection:`Payroll` application consists of -three sections: :guilabel:`To Pay`, :guilabel:`All Payslips`, and :guilabel:`Batches`. - -These three sections provide all the tools needed to create payslips for employees, including -individual payslips, a batch of payslips, or commission payslips. - -.. image:: payslips/payslips.png - :align: center - :alt: Payslips menu selection in Payroll. - -.. _payroll/to-pay: - -To pay -====== - -Click on :menuselection:`Payroll app --> Payslips --> To Pay` to see the payslips that need to be -paid. - -.. image:: payslips/all-pay-slips.png - :align: center - :alt: View all payslips that need to be paid on the Payslips To Pay page. - -Each payslip lists the :guilabel:`Reference` number for the individual payslip, the -:guilabel:`Employee` name, the :guilabel:`Batch Name`, the :guilabel:`Company`, the :guilabel:`Basic -Wage`, :guilabel:`Gross Wage`, :guilabel:`Net Wage`, and the :guilabel:`Status` of the payslip. - -Click on an individual payslip entry to view the details for that individual payslip. +*Payslips* are individual records of payment, containing all the details of how the pay was +calculated (hours, deductions, other inputs, etc.), and generated by payroll officers through the +**Payroll** application. Payslips can be created and processed individually, or multiple payslips +can be processed at one time, in a single batch. .. _payroll/new-payslip: -Create a new payslip --------------------- +Create a payslip +================ A new payslip can be created from either the :ref:`Payslips To Pay ` page or the :ref:`Employee Payslips ` page. -Create a new payslip by clicking the :guilabel:`New` button in the top-left corner. - -A blank payslip form is loaded, where the necessary payslip information can be entered. +Navigate to :menuselection:`Payroll app --> Payslips`, and click either :guilabel:`To Pay` or +:guilabel:`All Payslips`. Click the :guilabel:`New` button in the top-left corner, and a blank +payslip form loads. Payslip form -~~~~~~~~~~~~ - -On the blank payslip form, several fields are required. Most of the required fields auto-populate -after an employee is selected. +------------ Fill out the following information on the payslip form: -- :guilabel:`Employee`: type in the name of an employee, or select the desired employee from the - drop-down list in this field. This field is **required**. +- :guilabel:`Employee`: Using the drop-down menu, select the employee in this field. This field is + **required**. Once a selection is made, other fields may auto-populate according to the employee + record. .. note:: It is recommended to **only** create payslips for employees that are already in the database. If there is no current employee record (and therefore no employee contract) it is recommended - to create the new employee in the *Employees* application **before** creating payslips for that + to create the new employee in the **Employees** application *before* creating payslips for that employee. Refer to the :doc:`new employee <../employees/new_employee>` documentation for instructions on how to add an employee. -- :guilabel:`Period`: the first day to the last day of the *current* month auto-populates the +- :guilabel:`Contract`: The current contract for the selected employee populates this field. This + field is **required**. + + .. important:: + All employees are required to have a contract in order to generate payslips. Additionally, + *only one* contract can be in the running stage for each employee, therefore the current + contract populates this field, and it is **not** recommended to make changes to this field. + +- :guilabel:`Batch`: Using the drop-down menu, select the payslip batch this new payslip should be + added to, if applicable. +- :guilabel:`Structure`: The structure linked to the employee's contract auto-populates this field + by default. If desired, use the drop-down menu to select a different structure. +- :guilabel:`Period`: The first day to the last day of the *current* month auto-populates the :guilabel:`Period` fields by default. The dates can be changed, if desired. To change the start date, click on the first date in the :guilabel:`Period` field to reveal a - pop-up calendar. On this calendar, use the :guilabel:`< (less-than)` and :guilabel:`> - (greater-than)` icons to select the desired month. Then, click on the desired day to select that + pop-up calendar. Navigate to the desired month, and click on the desired day to select that specific date. Repeat this process to modify the end date for the payslip. These fields are **required**. -- :guilabel:`Contract`: using the drop-down menu, select the desired contract for the employee. Only - the available corresponding contracts for the selected employee appear as options. This field is - **required**. -- :guilabel:`Batch`: using the drop-down menu in this field, select the batch of payslips this new - payslip should be added to. -- :guilabel:`Structure`: using the drop-down menu, select the salary structure type. Only the - corresponding structures associated with the selected contract for the employee appear as options. - - If no employee and/or no contract is selected yet, all available :guilabel:`Structures` appear in - the list. Once an employee and/or contract is selected, any unavailable :guilabel:`Structures` set - for that employee and/or contract do not appear. This field is **required**. - -.. image:: payslips/new-payslip.png - :align: center - :alt: The top fields for a new payslip all filled out for a February payslip. .. note:: Typically, after making a selection in the :guilabel:`Employee` field, Odoo auto-populates all other required fields (besides the :guilabel:`Period` field), but **only** if that information is - already on that employee's form in the *Employees* app. + already on that employee's form in the **Employees** app. .. important:: If modifications to auto-populated fields are made, it is recommended to check with the - accounting department to ensure every entry that affects the *Accounting* application is correct. + accounting department to ensure every entry that affects the **Accounting** application is + correct. + +.. image:: payslips/new-payslip.png + :alt: The top fields for a new payslip all filled out for a February payslip. .. _payroll/worked-days-inputs: Worked days & inputs tab -************************ +~~~~~~~~~~~~~~~~~~~~~~~~ + +The :guilabel:`Worked Days & Inputs` tab details the number of days and hours the employee worked +during the specified :guilabel:`Period` of time on the top portion of the payslip form, and is +calculated based on the selected :guilabel:`Contract` and :guilabel:`Structure` fields. -- :guilabel:`Worked Days`: the entries under :guilabel:`Worked Days` (including the - :guilabel:`Type`, :guilabel:`Description`, :guilabel:`Number of Days`, :guilabel:`Number of - Hours`, and :guilabel:`Amount`) are automatically filled in, based on what was entered for the - :guilabel:`Period`, :guilabel:`Contract`, and :guilabel:`Structure` fields of the payslip form. -- :guilabel:`Other Inputs`: additional inputs affecting the payslip can be entered in this section, - such as deductions, reimbursements, and expenses. +The :guilabel:`Worked Days` section is automatically populated and lists all the individual +attendance records for the time period, including both worked time and any time off taken. - Click :guilabel:`Add a line` to create an entry in the :guilabel:`Other Inputs` section. +Each individual entry lists the :guilabel:`Type`, :guilabel:`Description`, :guilabel:`Number of +Days`, :guilabel:`Number of Hours`, and the total :guilabel:`Amount`. - Using the drop-down menu in the :guilabel:`Type` column, select a :guilabel:`Type` for the input. - Next, enter a :guilabel:`Description`, if desired. Lastly, enter the amount in the - :guilabel:`Count` field. +Additional records cannot be created for the :guilabel:`Worked Days & Inputs` as it is +auto-populated according to the employee's attendance records or working schedule on their +:ref:`employee record `. + +The :guilabel:`Other Inputs` section is where additional inputs are listed, such as deductions, +reimbursements, and expenses. + +Each individual item lists the :guilabel:`Type`, :guilabel:`Description`, and :guilabel:`Count`. To +add a new input, click :guilabel:`Add a line`, and using the drop-down menu, select the +:guilabel:`Type`. Next, enter a brief :guilabel:`Description`, and last, enter the +:guilabel:`Count`. .. image:: payslips/worked-days-tab.png - :align: center :alt: The fields filled out in the worked days and inputs tab. Salary computation tab -********************** +~~~~~~~~~~~~~~~~~~~~~~ -- :guilabel:`Salary Computation`: the :guilabel:`Salary Computation` tab is automatically filled in - after the :guilabel:`Compute Sheet` button is clicked. Doing so displays the wages, deductions, - taxes, etc. for the entry. +The :guilabel:`Salary Computation` tab is where all the individual salary rules are listed and +calculated, including everything from the employee's salary, to all the deductions and allowances, +such as taxes, expenses, benefit contributions, and any other items associated with the installed +:doc:`payroll localization `. -.. image:: payslips/salary-comp-tab.png - :align: center - :alt: The fields filled out in the salary computation tab. +When the payslip is first created, this tab remains blank. Click the :guilabel:`Compute Sheet` +button in the upper-left corner, and the :guilabel:`Salary Computation` tab is populated. -Other info tab -************** - -- :guilabel:`Payslip Name`: type in a name for the payslip in this field. The name should be short - and descriptive, such as `(Employee Name) April 2023`. This field is **required**. -- :guilabel:`Company`: select the company the payslip applies to using the drop-down menu in this - field. This field is **required**. -- :guilabel:`Close Date`: enter the date that the payment is made to the employee in this field. - - Click in the field to reveal a calendar pop-up window. Using the :guilabel:`< > - (less-than/greater-than)` icons, navigate to the desired month and year. - - Then, click on the desired date to select it. -- :guilabel:`Date Account`: enter the date on which the payslip should be posted in this field. -- :guilabel:`Salary Journal`: this field auto-populates after selecting an existing - :guilabel:`Employee`. This field **cannot** be edited, as it is linked to the *Accounting* - application. This field is **required**. -- :guilabel:`Accounting Entry`: if applicable, this field is automatically populated once the - payslip is confirmed. This field **cannot** be modified. -- :guilabel:`Add an Internal Note...`: any note or reference message for the new entry can be typed - in this field. +.. important:: + It is **not** possible to make edits to this tab, as the calculations are based on other entries + on the payslip. -.. image:: payslips/other-info-tab.png - :align: center - :alt: The fields filled out in the other info tab. +.. tip:: + The :guilabel:`Compute Sheet` button does not disappear from view after it is clicked, so the + payslip can be recalculated at any point prior to :ref:`processing it `. -Process the new payslip -~~~~~~~~~~~~~~~~~~~~~~~ + If any changes need to be made to the :ref:`Worked Days & Inputs ` + tab, click the :guilabel:`Compute Sheet` button to recalculate the payslip. -When all the necessary information on the payslip is entered, click the :guilabel:`Compute Sheet` -button. Upon doing so, all the information on the payslip is saved, and the :guilabel:`Salary -Computation` tab auto-populates, based on the information on the employee's contract or attendance -records. +.. image:: payslips/salary-comp-tab.png + :alt: The fields filled out in the salary computation tab. -If any modifications need to be made, first click the :guilabel:`Cancel` button, then click the -:guilabel:`Set to Draft` button. Make any desired changes, then click the :guilabel:`Compute Sheet` -button once again, and the changes are reflected in the :guilabel:`Worked Days` and -:guilabel:`Salary Computation` tabs. +Other info tab +~~~~~~~~~~~~~~ -Once everything on the payslip form is correct, click the :guilabel:`Create Draft Entry` button to -create the payslip. +The :guilabel:`Other Info` tab houses information that is required, but not associated with any +inputs or calculations, as the other tabs do. -Then, a confirmation pop-up window appears, asking :guilabel:`Are you sure you want to proceed?`. -Click :guilabel:`OK` to confirm. +The :guilabel:`Payslip Name` is auto-populated according to the employee name and the time period +the payslip is for. Make any desired edits to the name in this field. This field is **required**. -.. note:: - The database may need to be refreshed for the payslip and email to appear. +The :guilabel:`Company` field is also automatically populated according to the employee's record, +and cannot be modified. -To print the payslip, click the :guilabel:`Print` button. To cancel the payslip, click the -:guilabel:`Cancel` button. +The end date selected in the :guilabel:`Period` field in the top half of the form populates both the +:guilabel:`Close Date` and :guilabel:`Date Account` fields, by default. The :guilabel:`Close Date` +is the date the payment is issued to the employee, while the :guilabel:`Date Account` is the end +date the payslip covers. Modify the dates, if needed. -.. image:: payslips/payslip-chatter.png - :align: center - :alt: The new payslip is emailed to the employee and the email appears in the chatter. +The :guilabel:`Salary Journal` field is populated by default, and **cannot** be edited. This is the +accounting journal the paycheck is logged in. -Next, the payment must be sent to the employee. To do this, click the :guilabel:`Register Payment` -button. Doing so reveals a pop-up form, in which the desired :guilabel:`Bank Journal` that the -payment should be made against must be selected from a drop-down menu. Then, click the -:guilabel:`Confirm` button to confirm the journal, and return to the payslip. +If there are any additional notes or information needed for the payslip, add them to the +:guilabel:`Add an Internal Note...` field. -.. important:: - In order for a payslip to be paid, the employee *must* have a bank account entered in their - contact information. If there is no bank information, a payslip cannot be paid, and an error - appears when the :guilabel:`Make Payment` button is clicked. Banking information can be found in - the :ref:`Private Information ` tab on the employee's card in the - *Employees* app. Edit the employee card, and add banking information, if it is missing. +.. image:: payslips/other-info-tab.png + :alt: The fields filled out in the other info tab. - .. image:: payslips/banking.png - :align: center - :alt: Banking information can be entered in an employee's card. +.. _payroll/process: -Odoo automatically checks bank account information. If there is an error with the employee's listed -bank account, an error appears in a pop-up window, stating, *The employee bank account is -untrusted.* If this error appears, update the employee's bank account information on their -:ref:`Employee Form `. +Process a payslip +================= -If a payment needs to be cancelled or refunded, click the corresponding :guilabel:`Cancel` or -:guilabel:`Refund` button, located at the top-left of the screen. +When all the necessary information on the payslip is entered, the payslip can be processed. First, a +:ref:`draft of the journal entry ` is created, followed by a :ref:`payment +report `, and finally, the employee is :ref:`paid `. .. tip:: - Before processing payslips, it is best practice to check the *Warnings* section of the *Payroll* - app dashboard. Here, all possible issues concerning payroll appear. + Before processing payslips, it is best practice to check the *Warnings* section of the + **Payroll** app dashboard. Here, all possible issues concerning payroll appear. To view the warnings, navigate to :menuselection:`Payroll app --> Dashboard`. The warnings appear in the top-left corner of the dashboard. .. image:: payslips/warnings.png - :align: center - :alt: The dashboard view of the Payroll app, with the warnings box highlighted. + :alt: The dashboard view of the Payroll app, with the warnings box visible. Warnings are grouped by type, such as `Employees Without Running Contracts` or `Employees Without Bank account Number`. Click on a warning to view all entries associated with that specific issue. @@ -226,233 +176,200 @@ If a payment needs to be cancelled or refunded, click the corresponding :guilabe occur. Errors appear in a pop-up window, and provide details for the error, and how to resolve them. -.. _payroll/all-payslips: - -All payslips -============ - -To view all payslips, regardless of status, go to :menuselection:`Payroll app --> Payslips --> All -Payslips`. The :guilabel:`Employee Payslips` page loads, displaying all payslips, organized by -batch, in a default nested list view. +.. _payroll/draft-entry: -Click on the :guilabel:`▶ (right arrow)` next to an individual batch name to view all the payslips -in that particular batch, along with all the payslip details. +Create draft entry +------------------ -The number of payslips in the batch is written in parenthesis after the batch name. The -:guilabel:`Status` for each individual payslip appears on the far-right side, indicating one of the -following status options: +Once everything on the payslip form is correct, click the :guilabel:`Create Draft Entry` button to +create the payslip. A :guilabel:`Confirmation` pop-up window appears, asking :guilabel:`Are you sure +you want to proceed?` Click :guilabel:`OK` to confirm. -- :guilabel:`Draft`: the payslip is created, and there is still time to make edits, since the - amounts are not calculated. -- :guilabel:`Waiting`: the payslip has been calculated, and the salary details can be found in the - *Salary Computation* tab. -- :guilabel:`Done`: the payslip is calculated and ready to be paid. -- :guilabel:`Paid`: the employee has been paid. +Once the payslip draft is created, the status changes to :guilabel:`Done`, a :icon:`fa-usd` +:guilabel:`Journal Entry (Draft)` smart button appears at the top, and additional buttons appear in +the top-left corner. -.. image:: payslips/all-payslips.png - :align: center - :alt: View all payslips organized by batches. Click on the arrow to expand each batch. +.. note:: + After creating a draft entry, Odoo considers the payslip as confirmed. -Click on an individual payslip to view the details for that payslip on a separate page. Using the -breadcrumb menu, click :guilabel:`Employee Payslips` to go back to the list view of all payslips. +Click the :icon:`fa-usd` :guilabel:`Journal Entry (Draft)` smart button to view the detailed +accounting journal entry. Click :guilabel:`Post` to post the entry. Using the breadcrumb menu, +return to the payslip. -A new payslip can be created from the :guilabel:`Employee Payslips` page, by clicking the -:guilabel:`New` button in the upper-left corner. Doing so reveals a separate blank payslip form -page. On that blank payslip form page, enter all the necessary information, as described in the -:ref:`Create new payslips ` section. +After the journal entry is posted, the smart button at the top changes to :icon:`fa-usd` +:guilabel:`Journal Entry (Posted)` -To print PDF versions of payslips from the *Payslips to Pay* or :guilabel:`Employee Payslips` pages, -first select the desired payslips by clicking on the individual checkbox to the left of each payslip -to be printed. Or, click the box to the left of the :guilabel:`Reference` column title, which -selects all visible payslips on the page. Then, click the :guilabel:`Print` button to print the -payslips. +.. note:: + Employees cannot be :ref:`paid ` until the journal entry is posted. -Payslips can also be exported to an Excel spreadsheet. To export **all** payslips, click on the -:guilabel:`⚙️ (gear)` icon at the end of the words :guilabel:`Employee Payslips` in the top-left -corner. This reveals a drop-down menu. Click :guilabel:`Export All` to export all payslips to a -spreadsheet. +.. _payroll/payment-report: -.. image:: payslips/export.png - :align: center - :alt: Click on the Export All smart button to export all payslips to an Excel payslip. +Create payment report +--------------------- -To export only select payslips, first select the payslips to be exported from the list. Then, click -the checkbox to the left of each individual payslip to select it. As payslips are selected, a smart -button appears in the top-center of the page, indicating the number of selected payslips. Then, -click the :guilabel:`⚙️ (gear) Actions` icon in the top-center of the page, and click -:guilabel:`Export`. +Once the payslip status has changed to :guilabel:`Done`, a payment report must be created. A payment +report is a document that contains all the necessary information to transfer the employee's earnings +from the company's bank account to theirs. These are submitted by the payroll department to the +appropriate institution. -.. image:: payslips/export-select.png - :align: center - :alt: The individual list of employee ayslips with three selected to be exported. +Click the :guilabel:`Create Payment Report` and a pop-up window loads. Using the drop-down menu, +select the :guilabel:`Export Format` for the payment report. The two default options available are +:guilabel:`NACHA` and :guilabel:`CSV`. :guilabel:`NACHA` stands for the :abbr:`National Automated +Clearing House Association (NACHA)`, and this selection creates a compatible ACH file which is sent +to the company's bank. .. note:: - Both *To Pay* and *All Payslips* display all the detailed information for each payslip. - -Batches -======= + Other options may be available depending on the :doc:`payroll localization + ` installed in the database. -To view payslips in batches, navigate to :menuselection:`Payroll app --> Payslips --> Batches` to -display all the payslip batches that have been created. These payslip batches are displayed in a -list view, by default. + If :guilabel:`CSV` is selected, all other fields are hidden from view. -Each batch displays the :guilabel:`Name`, :guilabel:`Date From` and :guilabel:`Date To` dates, its -:guilabel:`Status`, the number of payslips in the batch (:guilabel:`Payslips Count`), and the -:guilabel:`Company`. +Next, select the desired :guilabel:`Bank Journal` the paycheck is logged to. Last, using the +calendar selector, set the date the paycheck is issued in the :guilabel:`Effective Date` field. -.. image:: payslips/batches.png - :align: center - :alt: View displaying all batches created. +Once the pop-up window is configured, click the :guilabel:`Generate` button, and the file appears on +the payslip form, in a new :guilabel:`Payment Report` field. -Create a new batch ------------------- - -To create a new batch of payslips from the :guilabel:`Payslips Batches` page -(:menuselection:`Payroll app --> Payslips --> Batches`), click the :guilabel:`New` button in the -top-left corner. Doing so reveals a blank payslip batch form on a separate page. +.. _payroll/pay-employee: -On the new payslip batch form, enter the :guilabel:`Batch Name`. +Pay employee +------------ -Next, select the date range to which the batch applies. Click into one of the :guilabel:`Period` -fields, and a calendar pop-up window appears. From this calendar pop-up window, navigate to the -correct month, and click on the corresponding day for both the start and end dates of the batch. +Next, the payment must be sent to the employee. To do this, click the :guilabel:`Pay` button in the +upper-left corner. Doing so reveals a :guilabel:`Pay` pop-up form. -The current company populates the :guilabel:`Company` field. If operating in a multi-company -environment, it is **not** possible to modify the :guilabel:`Company` from the form. The batch -**must** be created while in the database for the desired company. +All the necessary information is pre-populated on the form according to the payslip configuration, +but modifications can be made, if necessary, to any of the fields *except* the :guilabel:`Amount`. +This is populated according to the payslip calculations, and **cannot** be modified. -.. image:: payslips/new-batch-details.png - :align: center - :alt: Enter the details for the new batch. +- :guilabel:`Journal`: The accounting journal the payslip is logged to. +- :guilabel:`Payment Method`: Using the drop-down menu, select how the employee is being paid. The + default options are: -.. _payroll/batch-process: + - :guilabel:`Manual Payment`: Select this if paying the employee in a method *other* than A + :guilabel:`Check` or :guilabel:`NACHA`. + - :guilabel:`Check`: Select this when issuing a check directly to the employee. + - :guilabel:`NACHA`: Select this if using the :abbr:`National Automated Clearing House Association + (NACHA)` to transfer the payment to the employee, via direct deposit. -Process a batch ---------------- +- :guilabel:`Group Payments`: If the employee has multiple payslips for the same time period (for + example, payroll, reimbursement, and commission checks), tick the checkbox to group all payments + into one payment. +- :guilabel:`Payment Date`: Using the calendar selector, select the date the employee is to be paid. -Click on an individual batch to view the details for that batch on a separate page. On this batch -detail page, different options (buttons) appear at the top, depending on the status of the batch: +Once the pop-up :guilabel:`Pay` form is complete, click the :guilabel:`Create Payments` button, and +the payment is processed. -- :guilabel:`New` status: batches without any payslips added to them have a status of - :guilabel:`New`. The following button options appear for these batches: +After the payment is processed, and there is confirmation that the checks have been issued, or the +funds have been directly deposited to the employee's bank account, click the :guilabel:`Mark as +paid` button to mark the payslip as paid. - .. image:: payslips/batch-new.png - :align: center - :alt: A batch with a status of new, with the available buttons highlighted. +.. image:: payslips/pay.png + :alt: Banking information can be entered in an employee's card. - - :guilabel:`Add Payslips`: click the :guilabel:`Add Payslips` button to add payslips to the - batch, and an :guilabel:`Add Payslips` pop-up window appears. Only payslips that can be added - to the batch (payslips not currently part of a batch) appear on the list. - - Select the desired payslips by clicking the checkbox to the left of each payslip name, then - click the :guilabel:`Select` button to add them to the batch. Once payslips are selected and - added to the batch, the status changes to :guilabel:`Confirmed`. +.. important:: + In order for a payslip to be paid, the employee **must** have a bank account entered in the + :ref:`private information tab ` of their employee record, *and* the bank + account must be marked as :guilabel:`Trusted`. - - :guilabel:`Generate Payslips`: after payslips have been added to the batch, click the - :guilabel:`Generate Payslips` button to process the payslips and create individual payslips in - the database. + If there is no bank information, or if the bank is not listed as :guilabel:`Trusted`, payslips + cannot be paid, and an error appears when the :guilabel:`Pay` button is clicked. Edit the + employee record, and add banking information, or trust the bank account, as needed. - A :guilabel:`Generate Payslips` pop-up window appears. If only a specific :guilabel:`Salary - Structure` and/or specific :guilabel:`Department` is desired to make payslips for, select them - from the corresponding drop-down menus. If no selections are made, then all payslips listed in - the pop-up window are processed as usual. +Refund a payslip +================ - Click the :guilabel:`Generate` button to create the payslips. The :guilabel:`Generate Payslips` - button changes to a :guilabel:`Create Draft Entry` button, and the status changes to - :guilabel:`Confirmed`. +When refunding a payment, the refund is achieved by creating a payslip for a negative amount of the +original payslip. -- :guilabel:`Confirmed` status: batches that have been created and have payslips in them, but the - payslips have *not* been processed, have a status of :guilabel:`Confirmed`. The following two - button options appear for these batches: +.. example:: + An employee is paid $5,000.00 USD in a paycheck, in error. When refunding the payslip, a new + payslip is created in the amount of $-5,000.00. - .. image:: payslips/batch-confirmed.png - :align: center - :alt: A batch with a status of confirmed, with the available buttons highlighted. +If a payment needs to be refunded, navigate to the individual payslip being refunded, and click the +:guilabel:`Refund` button, located at the top-left of the screen. The :guilabel:`Refund Payslip` +dashboard loads, with all refund payslips appearing in a list view. - - :guilabel:`Create Draft Entry`: click the :guilabel:`Create Draft Entry` button to confirm the - individual payslips (and the batch), and create a draft of the payslips. The batch now has a - status of :guilabel:`Done`. - - :guilabel:`Set to Draft`: if at any point the batch needs to be reverted back to a status of - :guilabel:`New`, click the :guilabel:`Set to Draft` button. This action does **not** remove any - payslips that have already been added to the batch. +.. note:: + Since refunds are uncommon, typically only the one payslip being refunded appears in the list. -- :guilabel:`Done` status: batches with confirmed payslips in them have a status of - :guilabel:`Done`. The following button options appear for these batches: +By default, the refund payslip has a status of :guilabel:`Waiting`. This refund payslip is processed +:ref:`in the same way a regular payslip is processed `. - .. image:: payslips/batch-done.png - :align: center - :alt: A batch with a status of done, with the available buttons highlighted. +Print a payslip +=============== - - :guilabel:`Create Payment Report`: click the :guilabel:`Create Payment Report` button, and a - :guilabel:`Select a bank journal` pop-up window appears. Select the correct bank journal from - the drop-down menu. +To print a payslip, click the :guilabel:`Print` button in the upper-left corner of the individual +payslip record. A PDF file is downloaded, and the payslip appears in the chatter, and the file is +attached to the payslip record. - The batch name appears in the :guilabel:`File name` field, but this can be modified, if desired. - Finally, click :guilabel:`Confirm` to process the payslips, and pay the employees. - - :guilabel:`Mark as paid`: after the payments have been created via the :guilabel:`Create Payment - Report` button, the payslips need to be marked as paid in the database. +.. image:: payslips/payslip-chatter.png + :alt: The new payslip is emailed to the employee and the email appears in the chatter. - Click the :guilabel:`Mark as paid` button, and the status of the batch changes to - :guilabel:`Paid`. - - :guilabel:`Set to Draft`: if at any point the batch needs to be reverted back to a status of - :guilabel:`New`, click the :guilabel:`Set to Draft` button. This action does **not** remove any - payslips that have already been added to the batch. +.. _payroll/all-payslips: -- :guilabel:`Paid` status: batches that have been completed have a status of :guilabel:`Paid`. No - other button options appear for this status. +View all payslips +================= - .. image:: payslips/batch-paid-2.png - :align: center - :alt: A batch with a status of paid, with the available buttons highlighted. +To view all payslips, regardless of status, go to :menuselection:`Payroll app --> Payslips --> All +Payslips`. The :guilabel:`Employee Payslips` page loads, displaying all payslips, organized by +batch, in a default nested list view. -On the batch detail page, the individual payslips in the batch are accessible, via the -:guilabel:`Payslips` smart button, located above the batch information, in the center. Click the -:guilabel:`Payslips` smart button to view a list of all the individual payslips. +Click the :guilabel:`▶ (right arrow)` next to an individual batch name to expand the list, and view +all the payslips in that particular batch, along with all the payslip details. -Use the breadcrumb menu to navigate back to the individual batch detail page, or back to the list of -all batches. +The number of payslips in the batch is written in parenthesis after the batch name. The +:guilabel:`Status` for each individual payslip appears on the far-right side, indicating one of the +following status options: -Generate warrant payslips -------------------------- +- :guilabel:`Draft`: the payslip is created, and there is still time to make edits, since the + amounts are not calculated. +- :guilabel:`Waiting`: the payslip has been calculated, and the salary details can be found in the + *Salary Computation* tab. +- :guilabel:`Done`: the payslip is calculated and ready to be paid. +- :guilabel:`Paid`: the employee has been paid. -Commissions are paid to employees in Odoo using *warrant payslips*. +.. image:: payslips/all-payslips.png + :alt: View all payslips organized by batches. Click on the arrow to expand each batch. -Warrant payslips can be generated directly from the :guilabel:`Payslips Batches` page -(:menuselection:`Payroll app --> Payslips --> Batches`). +Click on an individual payslip to view the details for that payslip on a separate page. Using the +breadcrumb menu, click :guilabel:`Employee Payslips` to go back to the list view of all payslips. -First, select the desired batches by clicking the box to the left of each batch for which commission -payslips should be created. Next, click the :guilabel:`Generate Warrant Payslips` button at the top -of the page. +A new payslip can be created from the :guilabel:`Employee Payslips` page, by clicking the +:guilabel:`New` button in the upper-left corner. Doing so reveals a separate blank payslip form +page. On that blank payslip form page, enter all the necessary information, as described in the +:ref:`Create a payslip ` section. -Doing so reveals a :guilabel:`Generate Warrant Payslips` pop-up window, in which the necessary -information **must** be filled out. +Payslips can also be exported to an Excel spreadsheet. To export **all** payslips, click on the +:icon:`fa-cog` :guilabel:`(gear)` icon at the end of the words :guilabel:`Employee Payslips` in the +top-left corner. This reveals a drop-down menu. Click :icon:`fa-upload` :guilabel:`Export All` to +export all payslips to a spreadsheet. -.. image:: payslips/commission-details.png - :align: center - :alt: Enter the commission details. +To export only select payslips, first select the payslips to be exported from the list. Then, click +the checkbox to the left of each individual payslip to select it. As payslips are selected, a smart +button appears in the top-center of the page, indicating the number of selected payslips. Then, +click the :icon:`fa-cog` :guilabel:`Actions` icon in the top-center of the page, and click +:icon:`fa-upload` :guilabel:`Export`. -In this pop-up window, click on the drop-down menus, located beside the :guilabel:`Period` field, to -reveal calendar pop-up windows. On these calendar pop-up windows, select the desired period for -which the payslips are being generated. Using the :guilabel:`< (left)` and :guilabel:`> (right)` -arrow icons, navigate to the correct month, and click on the date to select it. +.. note:: + Both *To Pay* and *All Payslips* display all the detailed information for each payslip. -In the :guilabel:`Department` field, select the desired department from the drop-down menu. +.. _payroll/to-pay: -When a department is selected, the employees listed for that department appear in the -:guilabel:`Employee` section. +View payslips to pay +==================== -Under the :guilabel:`Employee` section, enter the :guilabel:`Commission Amount` for each employee in -the far-right column. To remove an employee, click the :guilabel:`🗑️ (trash)` icon to remove the -line. +To only view the payslips awaiting to be processed, navigate to :menuselection:`Payroll app --> +Payslips --> To Pay`. -Add a new entry by clicking :guilabel:`Add a Line`, and entering the :guilabel:`Employee` and the -appropriate :guilabel:`Commission Amount`. +.. image:: payslips/all-pay-slips.png + :alt: View all payslips that need to be paid on the Payslips To Pay page. -Click the :guilabel:`Upload your file` button to add a file, if necessary. Any file type is -accepted. +Each payslip lists the :guilabel:`Reference` number for the individual payslip, the +:guilabel:`Employee` name, the :guilabel:`Batch Name`, the :guilabel:`Company`, the :guilabel:`Basic +Wage`, :guilabel:`Gross Wage`, :guilabel:`Net Wage`, and the :guilabel:`Status` of the payslip. -Once all the commissions are properly entered, click the :guilabel:`Generate Payslips` button to -create the warrant payslips in a batch. +Click on an individual payslip entry to view the details for that individual payslip. -:ref:`Process the batch ` in the same way as a typical batch to complete the -payment process. +Process the payslips :ref:`in the same way a regular payslip is processed `, or in +a batch. diff --git a/content/applications/hr/payroll/payslips/all-pay-slips.png b/content/applications/hr/payroll/payslips/all-pay-slips.png index 1f99b48fec..44e84a0876 100644 Binary files a/content/applications/hr/payroll/payslips/all-pay-slips.png and b/content/applications/hr/payroll/payslips/all-pay-slips.png differ diff --git a/content/applications/hr/payroll/payslips/all-payslips.png b/content/applications/hr/payroll/payslips/all-payslips.png index 14ea996560..ad2f1734e9 100644 Binary files a/content/applications/hr/payroll/payslips/all-payslips.png and b/content/applications/hr/payroll/payslips/all-payslips.png differ diff --git a/content/applications/hr/payroll/payslips/banking.png b/content/applications/hr/payroll/payslips/banking.png deleted file mode 100644 index bc37ea68ac..0000000000 Binary files a/content/applications/hr/payroll/payslips/banking.png and /dev/null differ diff --git a/content/applications/hr/payroll/payslips/batch-confirmed.png b/content/applications/hr/payroll/payslips/batch-confirmed.png deleted file mode 100644 index 7a8daad898..0000000000 Binary files a/content/applications/hr/payroll/payslips/batch-confirmed.png and /dev/null differ diff --git a/content/applications/hr/payroll/payslips/batch-done.png b/content/applications/hr/payroll/payslips/batch-done.png deleted file mode 100644 index c7d94a61c5..0000000000 Binary files a/content/applications/hr/payroll/payslips/batch-done.png and /dev/null differ diff --git a/content/applications/hr/payroll/payslips/batch-new.png b/content/applications/hr/payroll/payslips/batch-new.png deleted file mode 100644 index cb8d43290c..0000000000 Binary files a/content/applications/hr/payroll/payslips/batch-new.png and /dev/null differ diff --git a/content/applications/hr/payroll/payslips/batch-paid-2.png b/content/applications/hr/payroll/payslips/batch-paid-2.png deleted file mode 100644 index eab1dd909c..0000000000 Binary files a/content/applications/hr/payroll/payslips/batch-paid-2.png and /dev/null differ diff --git a/content/applications/hr/payroll/payslips/batches.png b/content/applications/hr/payroll/payslips/batches.png deleted file mode 100644 index 214647637d..0000000000 Binary files a/content/applications/hr/payroll/payslips/batches.png and /dev/null differ diff --git a/content/applications/hr/payroll/payslips/export-select.png b/content/applications/hr/payroll/payslips/export-select.png deleted file mode 100644 index ea96233629..0000000000 Binary files a/content/applications/hr/payroll/payslips/export-select.png and /dev/null differ diff --git a/content/applications/hr/payroll/payslips/export.png b/content/applications/hr/payroll/payslips/export.png deleted file mode 100644 index 50121bcd18..0000000000 Binary files a/content/applications/hr/payroll/payslips/export.png and /dev/null differ diff --git a/content/applications/hr/payroll/payslips/new-batch-details.png b/content/applications/hr/payroll/payslips/new-batch-details.png deleted file mode 100644 index b5bff78e24..0000000000 Binary files a/content/applications/hr/payroll/payslips/new-batch-details.png and /dev/null differ diff --git a/content/applications/hr/payroll/payslips/new-payslip.png b/content/applications/hr/payroll/payslips/new-payslip.png index 496c1a46ef..7f8cd4d278 100644 Binary files a/content/applications/hr/payroll/payslips/new-payslip.png and b/content/applications/hr/payroll/payslips/new-payslip.png differ diff --git a/content/applications/hr/payroll/payslips/other-info-tab.png b/content/applications/hr/payroll/payslips/other-info-tab.png index 0069818989..4ab1b6adb7 100644 Binary files a/content/applications/hr/payroll/payslips/other-info-tab.png and b/content/applications/hr/payroll/payslips/other-info-tab.png differ diff --git a/content/applications/hr/payroll/payslips/pay.png b/content/applications/hr/payroll/payslips/pay.png new file mode 100644 index 0000000000..48b90dce7a Binary files /dev/null and b/content/applications/hr/payroll/payslips/pay.png differ diff --git a/content/applications/hr/payroll/payslips/payslip-chatter.png b/content/applications/hr/payroll/payslips/payslip-chatter.png index a4b9d4a431..12e9f69d58 100644 Binary files a/content/applications/hr/payroll/payslips/payslip-chatter.png and b/content/applications/hr/payroll/payslips/payslip-chatter.png differ diff --git a/content/applications/hr/payroll/payslips/payslips.png b/content/applications/hr/payroll/payslips/payslips.png deleted file mode 100644 index 25b9dc894d..0000000000 Binary files a/content/applications/hr/payroll/payslips/payslips.png and /dev/null differ diff --git a/content/applications/hr/payroll/payslips/salary-comp-tab.png b/content/applications/hr/payroll/payslips/salary-comp-tab.png index bf53868c97..db47e2d4ad 100644 Binary files a/content/applications/hr/payroll/payslips/salary-comp-tab.png and b/content/applications/hr/payroll/payslips/salary-comp-tab.png differ diff --git a/content/applications/hr/payroll/payslips/warnings.png b/content/applications/hr/payroll/payslips/warnings.png index 7012a2e7c9..dd7ab50b05 100644 Binary files a/content/applications/hr/payroll/payslips/warnings.png and b/content/applications/hr/payroll/payslips/warnings.png differ diff --git a/content/applications/hr/payroll/payslips/worked-days-tab.png b/content/applications/hr/payroll/payslips/worked-days-tab.png index 7c5b463c29..be88835b16 100644 Binary files a/content/applications/hr/payroll/payslips/worked-days-tab.png and b/content/applications/hr/payroll/payslips/worked-days-tab.png differ diff --git a/content/applications/hr/payroll/salary_attachment.rst b/content/applications/hr/payroll/salary_attachment.rst deleted file mode 100644 index a00f6d1b4e..0000000000 --- a/content/applications/hr/payroll/salary_attachment.rst +++ /dev/null @@ -1,63 +0,0 @@ -======================== -Salary attachment report -======================== - -*Salary attachments* in Odoo refer to a portion of an employee's earnings that are designated for -a specific purpose, both voluntary and involuntary. These can include contributions to a retirement -plan, repayment of a loan, wage garnishments, or child support. - -Voluntary salary attachments, such as repaying a loan, or contributing to a charity on a monthly -basis, are considered *Assignments of Salary* in Odoo. Salary attachments that are required, such as -a lawsuit settlement repayment, or repaying a tax lien, are considered *Attachments of Salary* in -Odoo. Child support payments have their own category, and are simply referred to as *Child Support* -in Odoo. - -To view this report, navigate to :menuselection:`Payroll app --> Reporting --> Salary Attachment -Report`. The :guilabel:`Salary Attachment Report` shows all deductions or allocations per employee, -organized by payslip, in a default pivot table. The default filter is the end of the current year -(:guilabel:`Payslip End Date: (year)`). The employees populate the rows, while the various -deductions populate the columns, organized by type of deduction, and further grouped by individual -payslip. - -The default report contains **all** payslips for the current year, so the report typically contains -a large number of columns. This could make it difficult to view all the data at once, as the report -may be very wide and require scrolling to view all the data. - -To view a condensed version of salary attachments, and have all the salary attachment columns -visible on one page, click the :icon:`fa-minus-square-o` :guilabel:`Total` icon at the top of the -report, above the various payslips. - -This presents the salary attachments for the current year, and only displays three columns, -:guilabel:`Attachment of Salary`, :guilabel:`Assignment of Salary`, and :guilabel:`Child Support.` - -Each entry displays the total amount paid for each specific type of salary attachment, for each -employee. - -.. image:: salary_attachment/salary-attachment.png - :alt: The Attachment of Salary report that shows all salary garnishments in a condensed view. - -The report can be downloaded as an XLSX file, or :doc:`inserted into a spreadsheet -<../../productivity/spreadsheet/insert>` using the corresponding buttons at the top. - -Click the :guilabel:`Measures` button to reveal the options of what data is displayed. -:guilabel:`Assignment of salary`, :guilabel:`Attachment of salary`, and :guilabel:`Child support` -are all selected and visible, by default, while the :guilabel:`Count` option is not. - -Click an option to either show or hide that particular metric. A :icon:`fa-check` -:guilabel:`(checkmark)` icon indicates the data is visible. - -Compare to previous year -======================== - -The :guilabel:`Salary Attachment Report` can be compared to the report for the previous time period -or the previous year. - -To view these comparisons, click the :icon:`fa-caret-down` :guilabel:`(down arrow)` icon in the -search bar, then click either :guilabel:`Payslip End Date: Previous Period` or :guilabel:`Payslip -End Date: Previous Year`, beneath the :icon:`fa-adjust` :guilabel:`Comparison` column. - -The report updates and displays the current time period values, and the previous time period values, -as well as the :guilabel:`Variation` between the two, in a percentage. - -.. image:: salary_attachment/comparison-attachment.png - :alt: The salary attachment report modified to compare to the previous year. diff --git a/content/applications/hr/payroll/salary_attachment/comparison-attachment.png b/content/applications/hr/payroll/salary_attachment/comparison-attachment.png deleted file mode 100644 index d43e8d944e..0000000000 Binary files a/content/applications/hr/payroll/salary_attachment/comparison-attachment.png and /dev/null differ diff --git a/content/applications/hr/payroll/salary_attachment/salary-attachment.png b/content/applications/hr/payroll/salary_attachment/salary-attachment.png deleted file mode 100644 index cd6106c3e2..0000000000 Binary files a/content/applications/hr/payroll/salary_attachment/salary-attachment.png and /dev/null differ diff --git a/content/applications/hr/payroll/salary_attachments.rst b/content/applications/hr/payroll/salary_attachments.rst index 597c569821..579a4f3998 100644 --- a/content/applications/hr/payroll/salary_attachments.rst +++ b/content/applications/hr/payroll/salary_attachments.rst @@ -7,10 +7,10 @@ whether voluntary or required. When the deduction is voluntary, they are typically considered *deductions*. When the deduction is court-ordered, or involuntary, it is sometimes referred to as a *wage garnishment*. In Odoo, these -are all universally called, *salary attachments*. +are all universally called *salary attachments*. -Note that salary attachments could also be used to give recurring amount of money to employees. -Like bonus divided in multiple parts. +Note that salary attachments could also be used to give recurring amounts of money to employees, +like a bonus divided in multiple payments. .. _payroll/salary-attachment/types: @@ -18,12 +18,14 @@ Salary attachment types ======================= To view the currently configured salary attachment types, navigate to :menuselection:`Payroll app ---> Configuration --> Salary Attachment Types`. The default salary attachment types are: -:guilabel:`Attachment of Salary`, :guilabel:`Assignment of Salary`, and :guilabel:`Child Support`. +--> Configuration --> Other Input Types`. This displays *all* other salary inputs, not just the +various salary attachments. -Each salary attachment type displays the :guilabel:`Name` of the attachment type, the -:guilabel:`Code` used when calculating payslips, a checkbox to indicate if there is :guilabel:`No -End Date`, and whether it is :guilabel:`Country` specific (or universal). +The three default salary attachment types that appear in this list are: :guilabel:`Attachment of +Salary`, :guilabel:`Assignment of Salary`, and :guilabel:`Child Support`. + +Each salary attachment type displays the :guilabel:`Name` of the attachment type, and the +:guilabel:`Code` used when calculating payslips. .. image:: salary_attachments/attachment-types.png :alt: The default salary attachment types. @@ -32,7 +34,7 @@ Create new salary attachment types ---------------------------------- .. danger:: - Upon installation of the **Payroll** application, the pre-configured default salary attachment + Upon installation of the **Payroll** application, the preconfigured default salary attachment types are linked to a variety of rules that are linked to various salary structures, as well as the installed :ref:`localization package `. @@ -45,14 +47,12 @@ Create new salary attachment types in the salary computation. To make a new type of salary attachment, click the :guilabel:`New` button, and a blank -:guilabel:`Salary Attachment Types` form loads. Enter the :guilabel:`Name` for the new salary -attachment type in the corresponding field. Next, enter the :guilabel:`Code` used in the salary -rules to compute payslips. Last, tick the :guilabel:`No End Date` checkbox if this salary attachment -never expires. - -If in a multi-company database, with locations in multiple countries, a :guilabel:`Country` field -also appears on the :guilabel:`Salary Attachment Types` form. Select the country the attachment -applies to, or leave blank if it is universal. +:guilabel:`Other Input Types` form loads. Enter the :guilabel:`Description` for the new salary +attachment type in the corresponding field. Next, tick the :guilabel:`Available in attachments` +checkbox, indicating it is available to use as a salary attachment. Enter the :guilabel:`Code` used +in the salary rules to compute payslips. Lastly, if the salary attachment type should **only** be +used in a specific payroll structure, use the drop-down menu in the :guilabel:`Available in +Structure` field, and select the specific structure. .. _payroll/salary-attachment/create: @@ -65,7 +65,10 @@ app --> Contracts --> Salary Attachments`. All salary attachments appear in a default list view, and displays the name of the :guilabel:`Employees`, :guilabel:`Description`, the salary attachment :guilabel:`Type`, the -:guilabel:`Monthly Amount`, :guilabel:`Start Date`, and current :guilabel:`Status`. +:guilabel:`payslips Amount`, :guilabel:`Start Date`, and current :guilabel:`Status`. + +At the end of each line is a :guilabel:`Related Payslips` button. Click this to view all payslips +containing the corresponding salary attachment. To create a new salary attachment, click the :guilabel:`New` button in the top-left corner, and a blank :guilabel:`Salary Attachment` form loads. Enter the following information on the form: @@ -78,16 +81,21 @@ blank :guilabel:`Salary Attachment` form loads. Enter the following information - :guilabel:`Start Date`: Using the calendar selector, select the date the salary attachment goes into effect. - :guilabel:`Estimated End Date`: This field is **not** modifiable, and **only** appears after the - :guilabel:`Monthly Amount` field is populated. This field is the estimated date when the salary - attachment will be completed. Today's date populates the field by default. Then, when the + :guilabel:`Payslip Amount` field is populated. This field is the estimated date when the salary + attachment is completed. Today's date populates the field by default. Then, when the :guilabel:`Total Amount` field is populated, this date is updated. - :guilabel:`Document`: If any documentation is needed, such as a court order, click the :guilabel:`Upload your file` button, and a file explorer window loads. Select the desired document to attach it to the record. Only **one** document can be attached to a salary attachment. -- :guilabel:`Monthly Amount`: Enter the amount taken out of each paycheck every month in this field. -- :guilabel:`Total Amount`: This field **only** appears if the :ref:`salary attachment type - ` has no end date (the :guilabel:`No End Date` option is - **not** ticked.) +- :guilabel:`No End Date`: Tick this checkbox if the salary attachment runs indefinitely. If ticked, + the :guilabel:`Total Amount` field is hidden from view. +- :guilabel:`Payslip Amount`: Enter the amount taken out of each paycheck in this field. +- :guilabel:`Total Amount`: Enter the total amount to be paid for the salary attachment. Note that + this field **only** appears if the :guilabel:`No End Date` option is **not** ticked. +- :guilabel:`Negative Amount`: Tick this checkbox if the salary attachment +- :guilabel:`Occurrences`: This field is **not** editable, and only appears once both the + :guilabel:`Payslip Amount` and :guilabel:`Total Amount` fields are populated. The number indicates + the amount of payslips needed to complete the salary attachment. .. image:: salary_attachments/salary-attachment-form.png :alt: The salary attachment form with all fields filled out. @@ -112,9 +120,12 @@ Salary attachments can have one of three statuses: *Running*, *Completed*, or *C the current status of all salary attachments, navigate to :menuselection:`Payroll app --> Contracts --> Salary Attachments`. -All salary attachments appear in the order they were configured. To view the salary attachments by -a particular metric, such as the :guilabel:`Status`, or :guilabel:`Type`, click on the column title -to sort by that specific column. +All salary attachments appear in chronological order, by :guilabel:`Start Date`, with the most +recent appearing at the top. To view the salary attachments by a particular metric, such as the +:guilabel:`Status`, or :guilabel:`Type`, click on the column title to sort by that specific column. + +.. image:: salary_attachments/attachments-list.png + :alt: All salary attachments, organized by start date. Completed salary attachments ---------------------------- @@ -152,6 +163,3 @@ Any salary attachment can be cancelled at any time. To cancel a salary attachmen individual attachment record from the main :guilabel:`Salary Attachment` dashboard to open the record. From the :guilabel:`Salary Attachment` record, click the :guilabel:`Cancel` button to cancel the salary attachment, and stop having the designated money taken out of future paychecks. - -.. seealso:: - :doc:`salary_attachment` diff --git a/content/applications/hr/payroll/salary_attachments/attachment-types.png b/content/applications/hr/payroll/salary_attachments/attachment-types.png index 455daca780..0a9b765251 100644 Binary files a/content/applications/hr/payroll/salary_attachments/attachment-types.png and b/content/applications/hr/payroll/salary_attachments/attachment-types.png differ diff --git a/content/applications/hr/payroll/salary_attachments/attachments-list.png b/content/applications/hr/payroll/salary_attachments/attachments-list.png new file mode 100644 index 0000000000..84b5aba1d9 Binary files /dev/null and b/content/applications/hr/payroll/salary_attachments/attachments-list.png differ diff --git a/content/applications/hr/payroll/salary_attachments/salary-attachment-form.png b/content/applications/hr/payroll/salary_attachments/salary-attachment-form.png index e3aa059007..9ca6d1c01a 100644 Binary files a/content/applications/hr/payroll/salary_attachments/salary-attachment-form.png and b/content/applications/hr/payroll/salary_attachments/salary-attachment-form.png differ diff --git a/content/applications/hr/payroll/time_off_to_report.rst b/content/applications/hr/payroll/time_off_to_report.rst new file mode 100644 index 0000000000..5ad8247412 --- /dev/null +++ b/content/applications/hr/payroll/time_off_to_report.rst @@ -0,0 +1,77 @@ +================== +Time off to report +================== + +Payroll is often processed a few days before the end of a pay period, so that employees can be paid +in a timely manner. When work schedules are predictable, this method often works. However, sometimes +employees take time off unexpectedly, especially sick time. When this occurs, there can be +discrepancies in payroll that must be addressed. + +.. example:: + The payroll department for a medium-sized company processes paychecks every two weeks, on + Wednesdays. Each employee is paid on the Friday after. + + One employee is sick on the last Thursday and Friday of the two-week pay period. Since they have + automatically generated work entries based on their working schedule, and payroll is processed on + Wednesdays, the paycheck they receive incorrectly states that they were paid for a regular work + day for all ten days of the two-week pay period. + + Instead of cancelling the paycheck and reissuing it, causing delays for the employee and more + work for the payroll department, Odoo allows for the deferral of the time off taken, to the + following pay period. + + This ensures all time off balances are correct, and the employee is properly compensated for + their time. + +.. _payroll/time-off-dashboard: + +Time off dashboard +================== + +When time off requests are submitted for a time period that was already processed on a payslip, the +time off requests appear in the *Time Off* page of the **Payroll** app. To access this, navigate to +:menuselection:`Payroll app --> Work Entries --> Time Off to Report`. + +The :guilabel:`Time Off` page default filter is :guilabel:`To Defer`, and displays all requests with +a :guilabel:`Payslip State` of :guilabel:`To defer to next payslip`. This is because the employee +was *already paid* for that time as worked time, and it was logged as regular time spent at work. + +.. image:: time_off_to_report/time-off-to-report.png + :alt: A list of all time off requests that were not approved before payslips were generated. + +Defer multiple time off entries +=============================== + +In order to keep the employee's time off balances correct, the time off request **must** be applied +to the following pay period. This not only ensures time off request balances are current, it also +eliminates the need to redo work entries, cancel paychecks, and reissue paychecks. + +To select the work entries to defer, tick the box to the left of the work entry line on the +:ref:`Time Off page `. To select all work entries in the list, tick the +box to the left of the :guilabel:`Employee` column title, at the top of the list. + +Once any work entry is selected, two buttons appear at the top of the report: a :guilabel:`(#) +selected` button, and an :icon:`fa-gear` :guilabel:`Actions` button. The :guilabel:`(#) selected` +button indicates how many entries are currently selected. + +When all the desired work entries are selected, click the :icon:`fa-gear` :guilabel:`Actions` +button, and a menu appears with several choices. Click :guilabel:`Defer to Next Month` in the list, +and all selected entries are deferred to the following month. + +Defer individual time off entries +================================= + +Time off requests appearing on the :ref:`Time Off page ` can be deferred +individually. Click on an individual time off request, and the details for that request load. + +The specific details for the time off request appear on the left-hand side, and all of the +employee's submitted time off requests appear on the right-hand side (including the request in the +details on the left-hand side). + +To defer the time off request to the next payslip, click the :guilabel:`Report to Next Month` button +in the upper-left corner. Once processed, the :guilabel:`Report to Next Month` button disappears, +and the :guilabel:`Payslip State` changes from :guilabel:`To defer to next payslip` to +:guilabel:`Computed in Current Payslip`. + +.. image:: time_off_to_report/single-defer.png + :alt: The time off details for an individual request that needs to be deferred. diff --git a/content/applications/hr/payroll/time_off_to_report/single-defer.png b/content/applications/hr/payroll/time_off_to_report/single-defer.png new file mode 100644 index 0000000000..725e5fb866 Binary files /dev/null and b/content/applications/hr/payroll/time_off_to_report/single-defer.png differ diff --git a/content/applications/hr/payroll/time_off_to_report/time-off-to-report.png b/content/applications/hr/payroll/time_off_to_report/time-off-to-report.png new file mode 100644 index 0000000000..65db9a6722 Binary files /dev/null and b/content/applications/hr/payroll/time_off_to_report/time-off-to-report.png differ diff --git a/content/applications/hr/payroll/work_entries.rst b/content/applications/hr/payroll/work_entries.rst index ba653aff5a..4ba19144d6 100644 --- a/content/applications/hr/payroll/work_entries.rst +++ b/content/applications/hr/payroll/work_entries.rst @@ -2,12 +2,20 @@ Work entries ============ -Work entries are created automatically in the *Payroll* app, based on the employee's :ref:`salary -structure type `, and from the *Planning*, *Attendances*, and *Time Off* -applications. +The **Payroll** app automatically creates work entries based on the employee's :ref:`salary +structure type `, and from the **Planning**, **Attendances**, and **Time +Off** applications. -The *Work Entries* dashboard of the *Payroll* application provides a visual overview of the -individual work entries for every employee. +Work entries provide the **Payroll** app with the worked hours used to compute employee paychecks, +if the employee's salary is based on work entries, as opposed to a salaried position. + +.. _payroll/work-entry-dashboard: + +Work entry dashboard +==================== + +The *Work Entries* dashboard of the **Payroll** app provides a visual overview of the individual +work entries for every employee. To open the dashboard, navigate to :menuselection:`Payroll app --> Work Entries --> Work Entries`. @@ -15,72 +23,72 @@ On the :guilabel:`Work Entry` dashboard, work entries appear in alphabetical ord first name of the employees. The entire month is displayed, with the current day highlighted in pale yellow. -If any entries have :ref:`conflicts ` that need to be resolved, the dashboard -defaults to filter only the :guilabel:`Conflicting` entries. - -To remove the filter from the :guilabel:`Search...` bar to view all work entries, click the -:guilabel:`✖️ (remove)` icon on the :guilabel:`Conflicting` filter in the :guilabel:`Search...` bar, -and all work entries appear in the list. +The :guilabel:`Work Entry` dashboard has a default :guilabel:`Conflicting` filter, which displays +only work entries with :ref:`conflicts ` to be resolved. .. image:: work_entries/work-entries-overview.png - :align: center :alt: Conflicts dashboard view showing all employee's conflicts in work entries. +.. tip:: + Remove the default :guilabel:`Conflicting` filter from the search bar to view *all* work entries. + .. _payroll/adjust-view: -To change the view, so only the entries for a single day, week, or month are shown, click on -:guilabel:`Month`. A drop-down menu appears with the options of :guilabel:`Day`, :guilabel:`Week`, -or :guilabel:`Month`. Click on one of the options to only display data for that specific selection. +Adjust view +----------- + +To change the view so that only the entries for a single day, week, month, quarter, or year are +shown, click the :icon:`fa-calendar` :guilabel:`(Month)(Year)` button. A drop-down menu appears with +the options of :guilabel:`Today`, :guilabel:`This week`, :guilabel:`This month`, :guilabel:`This +quarter`, or :guilabel:`This year`. Click on one of the options to only display data for that +specific selection. -Use the :guilabel:`⬅️ (left arrow)` and :guilabel:`➡️ (right arrow)` icons on the left and right -side of the :guilabel:`Month` button to adjust the displayed dates. The arrows adjust the date based -on the type of time selected. +Use the :icon:`oi-arrow-left` :guilabel:`(left arrow)` and :icon:`oi-arrow-right` :guilabel:`(right +arrow)` buttons to adjust the displayed dates. The arrows adjust the date based on the type of time +selected. For example, if :guilabel:`Month` is selected, the arrows move one month with each click of the arrow. If :guilabel:`Week` or :guilabel:`Day` is selected, the time moves by either a week or a day for each click of the arrow, respectively. -At any point, to return to a view containing the current day, click the :guilabel:`Today` button. +At any point, to return to a view containing the current day, click the :icon:`fa-crosshairs` +:guilabel:`(Focus Today)` button. .. _payroll/new-work-entry: Add a new work entry ==================== -If a work entry is missing and needs to be added, such as sick time, or if an employee forgot to -clock in and out for a shift, click :guilabel:`New` on the :guilabel:`Work Entry` dashboard, to -create a new work entry. +If a work entry is missing, such as sick time, or if an employee forgot to clock in and out for a +shift, a new work entry must be created for the missing shift. -A :guilabel:`Create` work entry pop-up form appears. +Click :guilabel:`New` on the :ref:`work entry dashboard `, and a blank +:guilabel:`Create` work entry pop-up form appears. Enter the following information on the form: -Enter the following information on the form: - -- :guilabel:`Description`: enter a short description for the work entry, such as `Sick Time`. If - 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 ` using the +- :guilabel:`Description`: Enter a short description for the work entry, such as `Sick Time`. 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 ` using the drop-down menu. -- :guilabel:`From` and :guilabel:`To`: enter the start (:guilabel:`From`) and end (:guilabel:`To`) +- :guilabel:`From` and :guilabel:`To`: Enter the start (:guilabel:`From`) and end (:guilabel:`To`) dates and times for the work entry. First, click on either the :guilabel:`From` or :guilabel:`To` line to reveal a calendar pop-up - window. Select the date by navigating to the correct month and year, using the :guilabel:`< (left - arrow)` and :guilabel:`> (right arrow)` icons, then click on the specific day. + window. Select the date by navigating to the correct month, then click on the specific day to + select it. Next, select the time, by clicking on either the hour or minute fields at the bottom of the - calendar, and select the desired time for both the hour and minutes. + calendar, and set the desired time. - When the date and time are correct for the entry, click the :guilabel:`Apply` button. -- :guilabel:`Duration`: displays the hours based on the :guilabel:`To` and :guilabel:`From` entries. - Modifying this field modifies the :guilabel:`To` field (the :guilabel:`From` field does not - change). + When the date and time for the entry are correct, click the :guilabel:`Apply` button. +- :guilabel:`Duration`: This field displays the hours based on the :guilabel:`To` and + :guilabel:`From` entries. Modifying this field modifies the :guilabel:`To` field (the + :guilabel:`From` field does not change). Once the desired information is entered, click :guilabel:`Save & Close` to save the entry, and close the pop-up form. .. image:: work_entries/create.png - :align: center :alt: Filling in the work entry Create form in Odoo. .. _payroll/conflicts: @@ -88,9 +96,9 @@ the pop-up form. Conflicts ========= -A conflict appears for any request that has not been approved, such as sick time or vacation, or if -there are any errors on the work entry, such as required fields being left blank. Conflicts are -required to be resolved before payslips can be generated. +A conflict occurs when a request has not been approved, such as sick time or vacation, or if there +are any errors on the work entry. Conflicts that span the current pay period being processed +**must** be resolved before payslips can be generated. Any work entry that has a conflict to be resolved is indicated on the main :guilabel:`Work Entry` dashboard, which can be accessed by navigating to :menuselection:`Payroll app --> Work Entries --> @@ -101,49 +109,62 @@ entry. Click on an individual work entry to see the date and time for the specif click :guilabel:`Edit` to view the conflict details in a pop-up window. .. image:: work_entries/conflict-pop-up.png - :align: center :alt: A row of conflicts, with one entry showing details for the conflict. The conflict is briefly explained in an orange text box in the :guilabel:`Open` pop-up window that appears. -The :guilabel:`Description`, :guilabel:`Employee`, and :guilabel:`Work Entry Type` are listed on -the left side of the pop-up window. The :guilabel:`From` and :guilabel:`To` date and time range, as -well as the total time (in hours) in the :guilabel:`Duration` field, appears on the right side. - -If the conflict is due to a time off request that has not been approved yet, a :guilabel:`Time Off` -field appears on the left side, with the type of time off requested in the description. - -.. image:: work_entries/conflict-details.png - :align: center - :alt: The detailed conflict pop-up window that appears when Edit is clicked. +The :guilabel:`Description`, :guilabel:`Employee`, and :guilabel:`Work Entry Type` are listed on the +left side of the pop-up window. The :guilabel:`From` and :guilabel:`To` date and time range, as well +as the total time (in hours) in the :guilabel:`Duration` field, appears on the right side. Time off conflicts ------------------ -The most common work entry conflicts are for time off requests that have been submitted, but not yet -approved, which results in duplicate work entries for that employee (one for time off and another +The most common work entry conflicts are for time off requests. Odoo automatically generates work +entries for specific time periods. When time off is requested after these work entries are +generated, it results in duplicate work entries for that employee (one for time off and another for regular work). If there is a conflict because a time off request is in the system for the same time that a regular -work entry already exists, the time off request is entered in the :guilabel:`Time Off` field. +work entry already exists, the time off request is entered in a :guilabel:`Time Off` field. -The time off conflict can be resolved either on the work entry pop-up window, or on a detailed time -off request pop-up window. +Conflicts can be resolved either directly on the work entry or in the detailed time off request +form. + +.. _payroll/time-off-work-entry: Resolve on work entry ~~~~~~~~~~~~~~~~~~~~~ -To resolve the time off conflict on this work entry pop-up window, click the :guilabel:`Approve Time -Off` button to approve the time off request, and resolve the work entry conflict. +If no additional details are needed to determine if a time off request should be approved or +refused, the time off conflict can be resolved directly from the work entry pop-up window. + +Click either the :guilabel:`Refuse Time Off` or :guilabel:`Approve Time Off` buttons to refuse or +approve the time off request, then the two buttons disappear. Click the :guilabel:`Save & Close` +button to close the pop-up window. + +The conflict disappears from the :guilabel:`Work Entry` dashboard, since the conflict is now +resolved. -The :guilabel:`Approve Time Off` and :guilabel:`Refuse Time Off` buttons disappear. Click the -:guilabel:`Save & Close` button to close the pop-up window. The conflict disappears from the -:guilabel:`Work Entry` dashboard, since the conflict is resolved. +.. image:: work_entries/conflict-details.png + :alt: The detailed conflict pop-up window that appears when the Edit button is clicked. + +.. note:: + If the time off is approved, the status of the work entry conflict changes to + :guilabel:`Cancelled`. If the time off is refused, the status changes to :guilabel:`Draft`. + +.. _payroll/time-off-request-form: Resolve on time off request ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +If more details are needed to make a decision about the time off request, hover over the entry in +the :guilabel:`Time Off` field, and click the :icon:`fa-external-link` :guilabel:`(Internal Link)` +icon that appears at the end of the line. This causes an :guilabel:`Open: Time Off` pop-up window to +load, with all the time off request details. Click either the :guilabel:`Approve` or +:guilabel:`Refuse` buttons to approve or refuse the request. + To resolve the time off conflict on the detailed time off request pop-up window, click the :guilabel:`Internal Link` button at the end of the :guilabel:`Time Off` entry line, and the time off request details appear in a new pop-up window. The request can be modified, if needed. @@ -151,9 +172,8 @@ request details appear in a new pop-up window. The request can be modified, if n Click the :guilabel:`Approve` button to approve the request, then click the :guilabel:`Save & Close` button to save the changes, and go back to the work entry conflict pop-up window. -.. image:: work_entries/time-off-details.png - :align: center - :alt: The detailed time off request form. +.. image:: work_entries/entry-details.png + :alt: The detailed time off request information. Now, the :guilabel:`Approve Time Off` button is hidden, only the :guilabel:`Refuse Time Off` button is visible. @@ -170,170 +190,44 @@ it has been resolved. Regenerate work entries ======================= -When regenerating work entries, any manual changes, such as resolved conflicts, are overwritten, -and work entries are regenerated (or recreated) from the applications that created them. +After conflicts are resolved, the affected work entries must be regenerated. This recreates the +specified work entries, and overwrites the previously conflicting work entries. -This method for correcting a large amount of conflicts is recommended to keep all records correct. While :ref:`conflicts ` *can* be resolved individually, if the conflicts are -caused from another application, it is best practice to ensure the records in the other applications -are also correct. That is why it is recommended to resolve these conflicts in the applications that -created the conflict. - -Another reason this method is recommended is because, when work entries are regenerated, the -conflicts reappear, if the issue in the related application is **not** resolved. +caused from another application, such as **Planning** or **Attendances**, it is best practice to +correct the record in the application causing the conflict. The reason this method is recommended is +because, if the issue in the related application is **not** resolved, when work entries are +regenerated, the conflicts reappear. First, ensure the issues are resolved in the specific applications that caused the work entry -conflicts. +conflicts. Once the conflicts have been resolved in the corresponding apps, open the work entry +dashboard by navigating to :menuselection:`Payroll app --> Work Entries --> Work Entries`. -Next, click the :guilabel:`Regenerate Work Entries` button at the top of the :guilabel:`Work -Entries` dashboard, and a :guilabel:`Work Entry Regeneration` pop-up window appears. +Click the :guilabel:`Regenerate Work Entries` button at the top of the :guilabel:`Work Entries` +dashboard, and a :guilabel:`Work Entry Regeneration` pop-up window appears. -Select the :guilabel:`Employees` to regenerate work entries for from the drop-down menu, and adjust +Select the :guilabel:`Employees` to regenerate work entries for, using the drop-down menu. Adjust the :guilabel:`From` and :guilabel:`To` fields, so the correct date range is displayed. Click the :guilabel:`Regenerate Work Entries` button, and the work entries are recreated. Once finished, the pop-up window closes. .. image:: work_entries/regenerate-details.png - :align: center :alt: Regenerate a work entry for a particular employee. .. example:: - An employee has incorrect work entries generated from the *Planning* app because they were - incorrectly assigned to two work stations simultaneously. This should be fixed in the *Planning* - app, instead of the *Payroll* app. - - To correct this issue, modify the employee's schedule in the *Planning* app, so they are - correctly assigned to only one work station. Then, in the *Payroll* app, regenerate work entries - for that employee, for that specific time period. - - The *Payroll* app then pulls the new, corrected data form the *Planning* app, and recreates the - correct work entries for that employee. All conflicts for that employee are now resolved. - -Generating payslips -=================== - -To generate payslips, :ref:`navigate to the time period ` the payslips should -be generated for. Ensure the :guilabel:`Conflicting` filter is removed. When the desired pay period -is displayed, click the :guilabel:`Generate Payslips` button. - -.. tip:: - If the :guilabel:`Generate Payslips` button is not active (appears pale purple, instead of dark - purple), that indicates there are conflicts, or the date selected includes dates in the future. - Resolve all conflicts before generating payslips. - -When the :guilabel:`Generate Payslips` button is clicked, a batch entry appears on a separate page -for the time period selected. - -The batch name populates the :guilabel:`Batch Name` field in a default `From (date) to (date)` -format. - -The date range to which the payslips apply appears in the :guilabel:`Period` field, and the company -appears in the :guilabel:`Company` field. It is **not** possible to make changes to this form. + An employee has incorrect work entries generated from the **Planning** app because they were + incorrectly assigned to two work stations simultaneously. This should be fixed in the + **Planning** app, instead of the **Payroll** app. -Click the :guilabel:`Create Draft Entry` button to create the payslips for the batch. + To correct this issue, modify the employee's schedule in the **Planning** app, so they are + correctly assigned to only one work station. Then, in the **Payroll** app, regenerate work + entries for that employee, for that specific time period. -Click the :guilabel:`Payslips` smart button at the top of the page to view all the payslips for the -batch. - -.. image:: work_entries/generate-payslips.png - :align: center - :alt: Information that appears when generating payslips. - -Printing payslips ------------------ - -To print payslips, first view the individual payslips by clicking the :guilabel:`Payslips` smart -button on the batch form. - -Next, select the payslips to print from the :guilabel:`Payslips` list. Click the box next to each -payslip to print, or click the box to the left of the :guilabel:`Reference` column title, to select -all the payslips in the list at once. - -Click the :guilabel:`Print` button, and a PDF file is created with all the specified payslips. - -.. image:: work_entries/print-payslips.png - :align: center - :alt: Print button for printing the payslips. - -.. note:: - The :guilabel:`Print` button does **not** appear until at least one payslip is selected in the - list. - -Time off to report -================== - -If a time off request is submitted for a time period that was already processed on a payslip, the -time off request appears in the *Time Off* page in the *Payroll* app, which is accessible by -navigating to :menuselection:`Payroll app --> Work Entries --> Time Off to Report`. - -On the :guilabel:`Time Off` page, the request appears with a status of :guilabel:`To defer to next -payslip`. This is because the employee was already paid for that day, and it was logged as time -spent at work, as a typical work day. - -In order to keep the employee's time off balances correct, the time off request **must** be applied -to the following pay period. This not only ensures time off request balances are current, it also -eliminates the need to redo work entries, cancel paychecks, and reissue paychecks. - -The most common scenario when this situation occurs, is when payslips are processed a day or two -before the pay period ends, and an employee is unexpectedly sick on one of the last days of the pay -period. The employee puts in a time off request for a day that was already processed on a payslip as -a regular work day. Instead of cancelling the payslip, modifying the work entries, and reissuing the -paycheck, Odoo allows for those time off requests to be applied to the following pay period, -instead. - -To view all the time off requests that need to be deferred to the next payslip, navigate to -:menuselection:`Payroll app --> Work Entries --> Time Off to Report`. The default filter for this -report is :guilabel:`To Defer`. - -All time off requests that need to be applied to the following pay period appear with a -:guilabel:`Payslip State` of :guilabel:`To defer to next payslip`. - -.. image:: work_entries/time-off-to-report.png - :align: center - :alt: A list of all time off requests that were not approved before payslips were generated. - -Defer multiple time off entries -------------------------------- - -To select the work entries to defer, click the box to the left of the work entry line. To select all -work entries in the list, click the box to the left of the :guilabel:`Employees` column title, at -the top of the list. - -Once any work entry is selected, two buttons appear at the top of the report: a :guilabel:`(#) -Selected` button, and an :guilabel:`Actions` button. The :guilabel:`(#) Selected` button indicates -how many entries are currently selected. - -When all the desired work entries are selected, click the :guilabel:`Actions` button, and a menu -appears with several choices. Click :guilabel:`Defer to Next Month` in the list, and all selected -entries are deferred to the following month. - -.. image:: work_entries/batch-defer.png - :align: center - :alt: The actions button and # Selected buttons that appear after any selections are made. - -Defer individual time off entries ---------------------------------- - -Time off requests appearing on the :guilabel:`Time Off to Report` list can be deferred individually. - -Click on an individual time off request, and the details for that request load. - -The specific details for the time off request appear on the left-hand side, and all of the -employee's submitted time off requests appear on the right-hand side (including the request in the -details on the left-hand side). - -To defer the time off request to the next payslip, click the :guilabel:`Report to Next Month` button -at the top. Once processed, the :guilabel:`Report to Next Month` button disappears, and the -:guilabel:`Payslip State` changes from :guilabel:`To defer to next payslip` to :guilabel:`Computed -in Current Payslip`. - -To go back to the :guilabel:`Time Off to Report` list, click on :guilabel:`Time Off` in the -breadcrumb menu. - -.. image:: work_entries/single-defer.png - :align: center - :alt: The time off details for an individual request that needs to be deferred. + The **Payroll** app then pulls the new, corrected data form the **Planning** app, and recreates + the correct work entries for that employee. All conflicts for that employee are now resolved. .. seealso:: - :ref:`Configure work entries ` + :doc:`payslips` + + :doc:`batches` diff --git a/content/applications/hr/payroll/work_entries/batch-defer.png b/content/applications/hr/payroll/work_entries/batch-defer.png deleted file mode 100644 index 07b38e8c89..0000000000 Binary files a/content/applications/hr/payroll/work_entries/batch-defer.png and /dev/null differ diff --git a/content/applications/hr/payroll/work_entries/conflict-details.png b/content/applications/hr/payroll/work_entries/conflict-details.png index 6a64f5b61a..dbc4c6c325 100644 Binary files a/content/applications/hr/payroll/work_entries/conflict-details.png and b/content/applications/hr/payroll/work_entries/conflict-details.png differ diff --git a/content/applications/hr/payroll/work_entries/conflict-pop-up.png b/content/applications/hr/payroll/work_entries/conflict-pop-up.png index fab9235c74..27ec2e222c 100644 Binary files a/content/applications/hr/payroll/work_entries/conflict-pop-up.png and b/content/applications/hr/payroll/work_entries/conflict-pop-up.png differ diff --git a/content/applications/hr/payroll/work_entries/create.png b/content/applications/hr/payroll/work_entries/create.png index 58638b8000..9db489955c 100644 Binary files a/content/applications/hr/payroll/work_entries/create.png and b/content/applications/hr/payroll/work_entries/create.png differ diff --git a/content/applications/hr/payroll/work_entries/entry-details.png b/content/applications/hr/payroll/work_entries/entry-details.png new file mode 100644 index 0000000000..11d0b62ebf Binary files /dev/null and b/content/applications/hr/payroll/work_entries/entry-details.png differ diff --git a/content/applications/hr/payroll/work_entries/generate-payslips.png b/content/applications/hr/payroll/work_entries/generate-payslips.png deleted file mode 100644 index 05790e0c43..0000000000 Binary files a/content/applications/hr/payroll/work_entries/generate-payslips.png and /dev/null differ diff --git a/content/applications/hr/payroll/work_entries/print-payslips.png b/content/applications/hr/payroll/work_entries/print-payslips.png deleted file mode 100644 index e2b6d1d63f..0000000000 Binary files a/content/applications/hr/payroll/work_entries/print-payslips.png and /dev/null differ diff --git a/content/applications/hr/payroll/work_entries/regenerate-details.png b/content/applications/hr/payroll/work_entries/regenerate-details.png index e3d316e8d8..2b6c7e4c5e 100644 Binary files a/content/applications/hr/payroll/work_entries/regenerate-details.png and b/content/applications/hr/payroll/work_entries/regenerate-details.png differ diff --git a/content/applications/hr/payroll/work_entries/single-defer.png b/content/applications/hr/payroll/work_entries/single-defer.png deleted file mode 100644 index 8d2e35aeb4..0000000000 Binary files a/content/applications/hr/payroll/work_entries/single-defer.png and /dev/null differ diff --git a/content/applications/hr/payroll/work_entries/time-off-details.png b/content/applications/hr/payroll/work_entries/time-off-details.png deleted file mode 100644 index 23cf54486b..0000000000 Binary files a/content/applications/hr/payroll/work_entries/time-off-details.png and /dev/null differ diff --git a/content/applications/hr/payroll/work_entries/time-off-to-report.png b/content/applications/hr/payroll/work_entries/time-off-to-report.png deleted file mode 100644 index d9475dd712..0000000000 Binary files a/content/applications/hr/payroll/work_entries/time-off-to-report.png and /dev/null differ diff --git a/content/applications/hr/payroll/work_entries/work-entries-overview.png b/content/applications/hr/payroll/work_entries/work-entries-overview.png index 4bc836f687..9a16153d82 100644 Binary files a/content/applications/hr/payroll/work_entries/work-entries-overview.png and b/content/applications/hr/payroll/work_entries/work-entries-overview.png differ diff --git a/content/applications/hr/recruitment.rst b/content/applications/hr/recruitment.rst index e29ba3235c..1374ad9b1b 100644 --- a/content/applications/hr/recruitment.rst +++ b/content/applications/hr/recruitment.rst @@ -4,55 +4,42 @@ Recruitment =========== -Odoo keeps all job applicants organized with a pre-configured series of steps and stages that each -applicant goes through. Each stage has a specific step(s) that should be performed. These range from +Odoo keeps all job applicants organized with a preconfigured series of steps and stages that each +applicant goes through. Each stage has a specific steps that should be performed. These range from scheduling a phone call, conducting an interview, or sending a job offer, for example. This process -is referred to as the 'applicant flow.' +is referred to as the *applicant flow.* When an applicant applies for a job position, an *applicant card* is automatically created in Odoo's -*Recruitment* app for that specific job position. As the applicant progresses through the +**Recruitment** app for that specific job position. As the applicant progresses through the recruitment pipeline, the recruitment team moves their card from one stage to the next. :ref:`Stages can be configured ` so that an email is automatically sent -out using a set, pre-configured template as soon as an applicant's card enters a stage. These +out using a set, preconfigured template as soon as an applicant's card enters a stage. These automated emails are defined on each stage in the applicant flow. -The applicant flow explained in this document is the default flow in Odoo, and goes through the -applicant flow when using the *Recruitment* application's default configuration. The applicant flow -is able to be modified to suit the specific recruitment flow for any business. +The flow described in this document is Odoo's default configuration, but it can be customized to +suit any recruitment process. .. note:: - The applicant flow with all its stages are universal and applies to all job positions, unless - specified. :ref:`A specific stage can be configured ` to be - job-specific, meaning that specific stage is only visible for that specific job position. - Otherwise, if a new stage is created, or an existing stage is modified, those changes are - visible on all job positions. + Stages apply to all job positions unless :ref:`marked as job-specific + ` Changes to stages (e.g., additions, deletions) affect all + positions unless explicitly scoped. .. _recruitment/settings: Settings ======== -Before creating a job position in Odoo, configure the necessary settings for the *Recruitment* app. -To view and edit the settings, navigate to :menuselection:`Recruitment app --> Configuration --> -Settings`. After any changes are made, click the :guilabel:`Save` button in the top-left corner to -save all the changes. +Before creating a job position in Odoo, configure the necessary settings for the **Recruitment** +app. To view and edit the settings, navigate to :menuselection:`Recruitment app --> Configuration +--> Settings`. After any changes are made, click the :guilabel:`Save` button in the top-left corner +to save all the changes. -Job posting ------------ +Process +------- -The :guilabel:`Job Posting` section of the *Recruitment* app settings has only one selection to -make. If job positions are to be posted to the company's website, enable the :guilabel:`Online -Posting` option. - -.. note:: - The :guilabel:`Online Posting` is only available if the *Website* application is also installed. - -Recruitment process -------------------- - -The :guilabel:`Recruitment process` section of the settings page specifies what the database can and -cannot do during the recruitment process. +The :guilabel:`Process` section of the settings page specifies what the database can and cannot do +during the recruitment process. Send interview survey ~~~~~~~~~~~~~~~~~~~~~ @@ -66,125 +53,121 @@ Enable the :guilabel:`Send Interview Survey` option to send surveys to applicant :icon:`fa-arrow-right` :guilabel:`Interview Survey` link to navigate to a list of all created surveys. -This list includes all surveys that were created in the database, not just surveys used in the -*Recruitment* app. If no surveys have been created, the surveys list displays a :guilabel:`No Survey -Found` message, and presents options to create a survey from several pre-configured survey +This list includes all surveys that were created in the database, not only surveys used in the +**Recruitment** app. If no surveys have been created, the surveys list displays a :guilabel:`No +Survey Found` message, and presents options to create a survey from several preconfigured survey templates. .. seealso:: - For more detailed information about surveys, refer to the :doc:`survey essentials - <../marketing/surveys/create>` documentation. + :doc:`create/edit surveys <../marketing/surveys/create>` .. note:: - Enabling the :guilabel:`Send Interview Survey` option will install the *Surveys* application once - the settings are saved, if it is not installed already. + Enabling the :guilabel:`Send Interview Survey` option will install the **Surveys** application + once the settings are saved, if not already installed. -Send SMS -~~~~~~~~ - -It is possible to send text messages to applicants directly through the *Recruitment* app. To do so, -enable the :guilabel:`Send SMS` option. This option requires credits to use, which can be obtained -by clicking the :icon:`fa-arrow-right` :guilabel:`Buy credits` internal link that emerges when the -feature is enabled. +Salary package configurator +~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. seealso:: - For more information, refer to the :doc:`SMS pricing and FAQs - <../marketing/sms_marketing/pricing_and_faq>` documentation. +When sending an offer to an applicant, an expiration date can be set on the offer. Enter the number +of days an offer is valid for in the :guilabel:`days` field. After the set amount of days has +passed, if the applicant has not accepted the offer, the offer is no longer available. .. _recruitment/cv-display: -CV display -~~~~~~~~~~ +Résumé display +~~~~~~~~~~~~~~ -When applicants submit an application, one of the default required fields is a resumé, or :abbr:`CV -(curriculum vitae)`. All resumés are stored in the *Documents* application, and are accessible on +When applicants submit an application, one of the default required fields is a résumé, or :abbr:`CV +(curriculum vitae)`. All résumés are stored in the **Documents** application, and are accessible on the applicant's card. -A resumé has the option to appear on the applicant's form, which can be viewed by clicking on the -applicant's card. The resumé appears on the right-side of the screen. If this is not enabled, the -resumé is accessed via a link in the chatter, where it needs to be clicked to expand and view it, or +A résumé has the option to appear on the applicant's form, which can be viewed by clicking on the +applicant's card. The résumé appears on the right-side of the screen. If this is not enabled, the +résumé is accessed via a link in the chatter, where it needs to be clicked to expand and view it, or downloaded. -Enable the :guilabel:`CV Display` option to show the resumé on the applicant's card by default, and -in addition to the document link. When enabled, the resumé appears on the right side of the +Enable the :guilabel:`Résumé Display` option to show the résumé on the applicant's card by default, +and in addition to the document link. When enabled, the résumé appears on the right side of the applicant's card. .. note:: - For the resumé to appear on the right-side, the browser window must be in full-screen mode (where + For the résumé to appear on the right-side, the browser window must be in full-screen mode (where the browser spans the entire screen). If the browser window is set to a size smaller than the entire width of the screen (not - full-screen), then the resumé does not appear on the right-side. Instead, the resumé appears in + full-screen), then the résumé does not appear on the right-side. Instead, the résumé appears in the :guilabel:`Files` section of the chatter, below the applicant's card. .. image:: recruitment/cv-display.png - :align: center - :alt: The resumé on an applicant's card, appearing on the right side. + :alt: The résumé on an applicant's card, appearing on the right side. + +In-App Purchases +---------------- + +The :guilabel:`In-App Purchases` section of the :guilabel:`Settings` menu deals with items that +required credits to use, such as :abbr:`SMS (Short Message Service)` text messages, and digitizing +résumés. + +.. seealso:: + :doc:`SMS pricing and FAQs <../marketing/sms_marketing/pricing_and_faq>` + +Send SMS +~~~~~~~~ + +It is possible to send text messages to applicants directly through the **Recruitment** app. This +feature requires credits to use. Click the :icon:`fa-arrow-right` :guilabel:`Manage Service & Buy +Credits` internal link, and follow the steps to :doc:`purchase credits +<../marketing/sms_marketing/pricing_and_faq>`. .. _recruitment/cv-ocr: -CV digitization (OCR) -~~~~~~~~~~~~~~~~~~~~~ +Résumé digitization (OCR) +~~~~~~~~~~~~~~~~~~~~~~~~~ When an application is submitted using any of the available methods, such as an online application submission, emailing a resume to the job position alias, or creating an applicant record directly from the database, it is possible to have Odoo extract the applicant's name, phone number, and email -address from the resumé and populate the applicant's form. To do so, enable the :guilabel:`CV +address from the résumé and populate the applicant's form. To do so, enable the :guilabel:`Résumé Digitization (OCR)` option. When enabled, additional options appear. Click on the corresponding radio button to select one of the following options: -- :guilabel:`Do not digitize`: this option turns off resumé digitization. +- :guilabel:`Do not digitize`: this option turns off résumé digitization. - :guilabel:`Digitize on demand only`: this option only digitizes resumes when requested. A - :guilabel:`Digitize document` buttons appears on applicant cards. When clicked, the resumé is + :guilabel:`Digitize document` buttons appears on applicant cards. When clicked, the résumé is scanned and the applicant's card is updated. -- :guilabel:`Digitize automatically`: this option automatically digitizes all resumés when they are +- :guilabel:`Digitize automatically`: this option automatically digitizes all résumés when they are submitted. -Beneath these options are two additional links. Click the :icon:`fa-arrow-right` :guilabel:`Buy -credits` button to purchase credits for CV digitization. Click the :icon:`fa-arrow-right` -:guilabel:`View My Services` to view a list of all current services, and their remaining credit -balances. +Beneath these options are two additional links. Click the :icon:`fa-arrow-right` :guilabel:`Manage +Service & Buy Credits` internal link to purchase credits for résumé digitization. Click the +:icon:`fa-arrow-right` :guilabel:`View My Services` internal link to view a list of all current +services, and their remaining credit balances. For more information on document digitization and :abbr:`IAP's (in-app purchases)`, refer to the :doc:`In-app purchase (IAP) <../essentials/in_app_purchase>` documentation. .. note:: - The :guilabel:`Do not digitize` option for :guilabel:`CV digitization (OCR)` at first may seem - like a redundancy. It seems to be the same as disabling the :guilabel:`CV digitization (OCR)` - option. - - When the :guilabel:`CV digitization (OCR)` option is enabled, a module is installed so that - resumés can be scanned. Disabling this option would uninstall the module. - - If at some point, there is a desire to temporarily stop digitizing resumés, the :guilabel:`Do not - digitize` option is selected. The reason this option is available is so that the module is not - uninstalled, allowing for digitization to be enabled in the future by selecting one of the other - two options. - -Salary package configurator -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -When sending an offer to an applicant, an expiration date can be set on the offer. Enter the number -of days an offer is valid for in the :guilabel:`days` field. After the set amount of days has -passed, if the applicant has not accepted the offer, the offer is no longer available. + The :guilabel:`Do not digitize` option may appear redundant but serves a distinct purpose. + Disabling the :guilabel:`Résumé Digitization (OCR)` option uninstalls the module, while + :guilabel:`Do not digitize` keeps the module installed but inactive—allowing the user to + re-enable digitization later without reinstalling the module. Kanban view =========== -To access the Kanban view for a job position, navigate to the main :menuselection:`Recruitment app` +To access the Kanban view for a job position, navigate to the main :menuselection:`Recruitment` app dashboard, which is the default view when opening the application. All job positions appear on the main dashboard. Click the :guilabel:`(#) New Applications` smart button on a job position card to navigate to the Kanban view for all the applicants for that particular job position. .. image:: recruitment/new-applicants-button.png - :align: center :alt: Main dashboard view of job position card, showing new applications button. Inside the job application, the Kanban stages appear, with all the applicants populated in their -respective columns, indicating what stage they are currently in. There are six default stages in -Odoo: +respective columns, indicating what stage they are currently in. In Odoo, six default stages are +configured: - :ref:`New ` - :ref:`Initial Qualification ` @@ -199,7 +182,6 @@ for that column, click anywhere on the thin gray column that says the stage name expands, revealing the applicants. .. image:: recruitment/stages.png - :align: center :alt: Expand a folded column by clicking on it in the Kanban view. Each stage has a color-coded bar beneath the stage name, providing status information for the @@ -215,11 +197,10 @@ lower-left of the applicant card. A status pop-up window appears. Click on the d the applicant. The status dot on the applicant card as well as the status bar updates. .. image:: recruitment/status-dots.png - :align: center :alt: The applicant card statuses, and status bar. .. tip:: - The names for the three status colors (`In Progress`, `Blocked`, and `Ready for Next Stage`) + The names for the three status colors (`In Progress`, `Ready for Next Stage`, and `Blocked`) :ref:`can be modified `, if desired. .. _recruitment/customize-stages: @@ -227,8 +208,7 @@ the applicant. The status dot on the applicant card as well as the status bar up Customize stages ================ -Stages can be modified, added, or deleted to best meet the needs of the particular hiring steps of -a business. +Stages can be modified, added, or deleted to match the particular hiring steps of a business. New stage --------- @@ -239,7 +219,6 @@ new column appears, and another new stage is available to create. If no new stag anywhere on the screen to exit the new stage creation. .. image:: recruitment/add-column.png - :align: center :alt: The plus sign to click to add a new column to the Kanban stages. .. _recruitment/modify-stages: @@ -248,13 +227,12 @@ Modify stage ------------ To modify the settings of a stage, hover over the name of the stage, and a :icon:`fa-cog` -:guilabel:`(gear)` icon appears in the upper right hand side of the stage. Click on the -:icon:`fa-cog` :guilabel:`(gear)` icon and a menu appears. Then click on the :guilabel:`Edit` +:guilabel:`(Settings)` icon appears in the upper right hand side of the stage. Click on the +:icon:`fa-cog` :guilabel:`(Settings)` icon and a menu appears. Then click on the :guilabel:`Edit` option. An :guilabel:`Edit: (Stage)` form appears. Make any desired modifications to the form, then click :guilabel:`Save & Close` when done. .. image:: recruitment/gear.png - :align: center :alt: The gear icon that appears when a column name is moused over, and the drop-down menu it displays when clicked. @@ -268,38 +246,40 @@ field is the :guilabel:`Stage Name`. The fields to be populated or modified are: -- :guilabel:`Stage Name`: type in a name for the stage. -- :guilabel:`Email Template`: select an email template to be used from the drop-down menu. If a +- :guilabel:`Stage Name`: Type in a name for the stage. +- :guilabel:`Email Template`: Select an email template to be used from the drop-down menu. If a template is selected, when the applicant card enters the stage, an email is automatically sent to the applicant using the selected template. -- :guilabel:`Folded in Kanban`: check the box to have the stage appear folded (hidden) at all times +- :guilabel:`Folded in Kanban`: Check the box to have the stage appear folded (hidden) at all times in the default view. -- :guilabel:`Hired Stage`: check the box if this stage indicates that the applicant is hired. When +- :guilabel:`Hired Stage`: Check the box if this stage indicates that the applicant is hired. When an applicant's card enters this stage, the card displays a :guilabel:`Hired` banner in the upper right corner. If this box is checked, this stage is used to determine the hire date of an applicant. -- :guilabel:`Job Specific`: if the stage only applies to specific job positions, select the job +- :guilabel:`Job Specific`: If the stage only applies to specific job positions, select the job positions from the drop-down menu. Multiple job positions can be selected. -- :guilabel:`Show in Referrals`: check the box if this stage should be seen in the *Referrals* +- :guilabel:`Show in Referrals`: Check the box if this stage should be seen in the *Referrals* application, and allow the referrer to accrue points when a referral of theirs reaches this stage. If this is active, a :guilabel:`Points` field appears. Enter the amount of referral points the - employee receives when an applicant enters this stage. The *Referrals* app must be installed in + employee receives when an applicant enters this stage. The **Referrals** app must be installed in order to use this option. -- :guilabel:`Tooltips` section: there are three pre-configured status labels (colored circles) for +- :guilabel:`Points`: If :guilabel:`Show in Referrals` is enabled, this field appears. Enter the + number of points the employee earns when an applicant moves to this stage. +- :guilabel:`Tooltips` section: There are three preconfigured status labels (colored circles) for each applicant's card, indicating its status. These colors are displayed at the top of each stage to reflect the statuses of the applicants in the stage. The *names* for the label can be modified, but the label itself (the color) cannot. The default names and labels are: :guilabel:`In Progress` (gray), :guilabel:`Blocked` (red), and :guilabel:`Ready for Next Stage` (green). -- :guilabel:`Requirements`: enter any internal notes for this stage explaining any requirements of +- :guilabel:`Requirements`: Enter any internal notes for this stage explaining any requirements of the stage. Delete stage ------------ If a stage is no longer needed, the stage can be deleted. To delete a stage, hover over the name of -the stage, and a :icon:`fa-cog` :guilabel:`(gear)` icon appears. First, click on the :icon:`fa-cog` -:guilabel:`(gear)` icon to reveal a drop-down menu, then click :guilabel:`Delete`. A -:guilabel:`Confirmation` pop-up warning appears, asking :guilabel:`Are you sure you want to delete +the stage, and a :icon:`fa-cog` :guilabel:`(Settings)` icon appears. First, click on the +:icon:`fa-cog` :guilabel:`(Settings)` icon to reveal a drop-down menu, then click :guilabel:`Delete`. +A :guilabel:`Confirmation` pop-up warning appears, asking :guilabel:`Are you sure you want to delete this column?` Click :guilabel:`Delete` to delete the column. .. important:: @@ -310,8 +290,8 @@ this column?` Click :guilabel:`Delete` to delete the column. Email templates =============== -To communicate with the applicant, Odoo has several pre-configured email templates that can be used. -The pre-configured email templates and when to use them are as follows: +To communicate with the applicant, Odoo has several preconfigured email templates that can be used. +The preconfigured email templates and when to use them are as follows: - :guilabel:`Recruitment: Applicant Acknowledgement`: this template is used to let the applicant know that their application was received. This email is automatically sent out once the applicant @@ -319,15 +299,15 @@ The pre-configured email templates and when to use them are as follows: - :guilabel:`Recruitment: Interest`: this template is used to let the applicant know that their application caught the recruiter's attention, and they have been shortlisted for either a phone call or an interview. -- :guilabel:`Recruitment: Schedule Interview`: this template is used to let the applicant know that - they have passed the :guilabel:`Initial Qualification` stage, and they will be contacted to set up - an interview with the recruiter. This email is automatically sent out once the applicant is in the - :guilabel:`Initial Qualification` stage. - :guilabel:`Recruitment: Not interested anymore`: this template is used when an applicant communicates that they are no longer interested in the position, and thanks them for their time and consideration. - :guilabel:`Recruitment: Refuse`: this template is used when an applicant is no longer being considered for the position. +- :guilabel:`Recruitment: Schedule Interview`: this template is used to let the applicant know that + they have passed the :guilabel:`Initial Qualification` stage, and they will soon be contacted to + set up an interview with the recruiter. This email is automatically sent out once the applicant is + in the :guilabel:`Initial Qualification` stage. .. note:: Email templates can be created, modified, and deleted to suit the needs of a business. For more @@ -337,63 +317,72 @@ To manually send an email, click :guilabel:`Send message` in the chatter. A text well as the applicant's email address. .. image:: recruitment/full-composer.png - :align: center :alt: Send an email from the chatter. -Click the :icon:`fa-expand` :guilabel:`(expand)` full composer icon in the bottom right corner of -the :guilabel:`Send Message` tab in the chatter. A :guilabel:`Compose Email` pop-up window loads, -with the :guilabel:`Recipients` and :guilabel:`Subject` pre-populated. The applicant's email address -is entered in the :guilabel:`Recipients` line, and the :guilabel:`Subject` is `(Job Position)`. The -email body is empty by default. +Click the :icon:`fa-expand` :guilabel:`(Full composer)` icon in the bottom right corner of the +:guilabel:`Send Message` tab in the chatter. A :guilabel:`Compose Email` pop-up window loads, with +the :guilabel:`To` and :guilabel:`Subject` pre-populated. The applicant's email address is entered +in the :guilabel:`To` field, and the :guilabel:`Subject` is `(Job Position)`. The email body is +empty by default. -To use a pre-configured email template, click the field next to :guilabel:`Load template` in the -bottom section of the window. Select the email template to use from the drop-down menu. +To use a preconfigured email template, click the :icon:`fa-ellipsis-v` :guilabel:`(vertical +elipsis)` button in the bottom of the window. Select the email template to use from the drop-down +menu. -Pre-configured email templates may contain dynamic placeholders so unique information can be -populated in the email for a more personalized message to the applicant. There are several -pre-configured email templates to choose from. Depending on the template selected, the email subject -and/or body may change. +Preconfigured email templates may contain dynamic placeholders so unique information can be +populated in the email for a more personalized message to the applicant. Several preconfigured email +templates are available to choose from. Depending on the template selected, the email subject or +body may change. .. note:: - Only the email templates that are configured for the model load. There are other email templates - pre-configured in Odoo, but if they are not configured for the recruitment application, they do + Only the email templates that are configured for the model load. Other email templates come + preconfigured in Odoo, but if they are not configured for the recruitment application, they do not appear in the list of available templates. -If any attachments are to be added, click the :guilabel:`Attachments` button in the lower left -corner. Navigate to the file to be attached, then click :guilabel:`Open` to attach it. To delete an -attachment, click the :icon:`fa-close` :guilabel:`(delete)` icon to the right of the attachment. +If any attachments need to be added, click the :icon:`fa-paperclip` :guilabel:`(paperclip)` button +at the bottom of the window. Navigate to the file to be attached, then click :guilabel:`Open` to +attach it. To delete an attachment, click the :icon:`fa-close` :guilabel:`(delete)` icon to the +right of the attachment. If any changes need to be made to the email, edit the body of the email. If the edits should be -saved to be used in the future, the email can be saved as a new template. Click the :guilabel:`Save -Template` button in the bottom. To send the email, click :guilabel:`Send` and the email is sent to -the applicant. The email then appears in the chatter. +saved to be used in the future, the email can be saved as a new template. Click the +:icon:`fa-ellipsis-v` :guilabel:`(vertical elipsis)` button in the bottom of the window, and select +:guilabel:`Save as Template`. Options are presented to either overwrite an existing template, or +save a new template. Click on an existing template name to overwrite that template, or click +:guilabel:`Save as Template` to save a new template. A :guilabel:`Create a Mail Template` pop-up +window loads. Enter a name for the template in the :guilabel:`Template Name` field, then click +:guilabel:`Save`. + +To send the email, click :guilabel:`Send` and the email is sent to the applicant. The email then +appears in the chatter. .. image:: recruitment/send-survey.png - :align: center :alt: Send a custom survey, also referred to as an interview form, to an applicant using a - pre-configured template. + preconfigured template. .. seealso:: - :doc:`recruitment/new_job` + - :doc:`recruitment/post_job` - :doc:`recruitment/add-new-applicants` - :doc:`recruitment/schedule_interviews` - :doc:`recruitment/offer_job_positions` - :doc:`recruitment/refuse_applicant` + - :doc:`recruitment/applicant_analysis` - :doc:`recruitment/source_analysis` - - :doc:`recruitment/recruitment_analysis` - - :doc:`recruitment/time_in_stage` + - :doc:`recruitment/velocity_analysis` - :doc:`recruitment/team_performance` .. toctree:: :titlesonly: recruitment/new_job + recruitment/post_job recruitment/recruitment-flow recruitment/add-new-applicants recruitment/schedule_interviews recruitment/offer_job_positions recruitment/refuse_applicant + recruitment/applicant_analysis recruitment/source_analysis - recruitment/recruitment_analysis - recruitment/time_in_stage + recruitment/velocity_analysis recruitment/team_performance diff --git a/content/applications/hr/recruitment/add-column.png b/content/applications/hr/recruitment/add-column.png index 32cc00556a..afecdd50af 100644 Binary files a/content/applications/hr/recruitment/add-column.png and b/content/applications/hr/recruitment/add-column.png differ diff --git a/content/applications/hr/recruitment/add-new-applicants.rst b/content/applications/hr/recruitment/add-new-applicants.rst index 795addd6a1..be7b43fcd6 100644 --- a/content/applications/hr/recruitment/add-new-applicants.rst +++ b/content/applications/hr/recruitment/add-new-applicants.rst @@ -3,39 +3,36 @@ Add new applicants ================== Once an applicant submits an application, either using the online application, or emailing a job -position alias, an applicant card is automatically created in the *Recruitment* application. +position alias, an applicant card is automatically created in the **Recruitment** application. However, in some instances, applicants may need to be created manually in the database. This could be necessary if, for example, a company accepts paper applications in the mail, or is meeting prospective applicants at an in-person job fair. To view current applicants, navigate to the :menuselection:`Recruitment` app, then click the desired -job position card. Doing so reveals the :guilabel:`Applications` page, which displays all -applicants for that specific role, in a default Kanban view, organized by stage. +job position card. Doing so reveals the :guilabel:`Applications` page, which displays all applicants +for that specific role, in a default Kanban view, organized by stage. Add new applicants from a job position's :guilabel:`Applications` page by using either: the -:ref:`New ` button or the :ref:`quick add -` button. +:ref:`quick add ` button, or the :ref:`New +` button. .. _recruitment/quick-add-applicant: Quick add ========= -On the :guilabel:`Applications` page, click the on the quick add button, represented by a small -:icon:`fa-plus` :guilabel:`(plus)` icon in the top-right corner of each stage to quickly add a new +On the :guilabel:`Applications` page, click the quick add button, represented by a small +:icon:`fa-plus` :guilabel:`(plus)` icon in the top-right corner of each stage, to add a new applicant to that stage. Enter the following information on the card: -- :guilabel:`Subject/Application`: enter the title for the card. Typically, this is the applicant's - name, and job position being applied to. For example: `Laura Smith - HR Manager`. The text entered - in this field is **not** visible in the Kanban view of the :guilabel:`Applications` page, unless - the :guilabel:`Applicant's Name` field is left blank. -- :guilabel:`Applicant's Name`: enter the applicant's name. Displays as the card title in the - Kanban view of the :guilabel:`Applications` page. -- :guilabel:`Email`: enter the applicant's email address. -- :guilabel:`Applied Job`: the current job position populates this field. If needed, the job +- :guilabel:`Candidate`: Select the applicant from the drop-down menu. Displays as the card title in + the Kanban view of the :guilabel:`Applications` page. If the candidate is *not* in the system + (from a previous application, or is a current employee), after entering the applicant's name, + click :guilabel:`Create "(candidate)"`. +- :guilabel:`Job Position`: The current job position populates this field. If needed, the job position can be changed by selecting a different position from the drop-down menu. If a different job position is selected, after the card is created, the card appears on the :guilabel:`Applications` page for that newly-selected job position. @@ -43,7 +40,7 @@ Enter the following information on the card: After the information is entered, click :guilabel:`Add`. The applicant appears in the list, and a new blank applicant card appears. -If preferred, after entering the :guilabel:`Applicant's Name` in the Kanban card that appears, click +If preferred, after entering the :guilabel:`Candidate` in the Kanban card that appears, click :guilabel:`Edit`, and a detailed applicant form loads. Refer to the :ref:`New applicant form ` section for details about filling out the form. @@ -51,7 +48,6 @@ When doing a quick add, clicking away from an empty card, or clicking the :icon: (:guilabel:`trash`) icon, discards the applicant. .. image:: add-new-applicants/quick-add.png - :align: center :alt: All the fields for a new applicant form entered when using the Quick Add option. .. _recruitment/create-new-applicant: @@ -59,112 +55,133 @@ When doing a quick add, clicking away from an empty card, or clicking the :icon: New applicant form ================== -On the new applicant form, the :guilabel:`Subject / Application` field is populated with the -pre-selected job position, by default. Certain fields on the applicant card may also be -pre-populated, depending on how the job position is configured. Typically, the :guilabel:`Job` -section, as well as the :guilabel:`Recruiter` field, are pre-populated. +On the :guilabel:`Applications` page, click the :guilabel:`New` button in the top-left corner, and a +blank application form loads. + +On the new application form, the :guilabel:`Job Position` and :guilabel:`Recruiter` fields are +populated according to the job position configurations, by default. Additionally, the +:guilabel:`Department` and :guilabel:`Company` fields in the :guilabel:`Details` tab may also be +populated, if those details are configured on the job position. Complete the fields in the following sections on the new applicant form. .. note:: Depending on installed applications and configurations, some fields may **not** be displayed. -.. image:: add-new-applicants/new-applicant.png - :align: center - :alt: All the fields for a new applicant form entered. - .. _recruitment/applicant-details: -Applicant section +Candidate section ----------------- -- :guilabel:`Subject/Application Name`: this is the **only** required field. Enter the title for the - card in this field. Typically, this is the applicant's name, and the job position being applied - to. For example: `John Smith - Experienced Developer`. This field is **not** visible in the Kanban - view of the :guilabel:`Applications` page, unless the :guilabel:`Applicant's Name` is left blank. -- :guilabel:`Applicant's Name`: enter the applicant's name. This field is displayed as the card - title in the Kanban view of the :guilabel:`Applications` page. -- :guilabel:`Email`: enter the applicant's email address. -- :guilabel:`Phone`: enter the applicant's phone number. -- :guilabel:`Mobile`: enter the applicant's mobile number. -- :guilabel:`LinkedIn Profile`: enter the web address for the applicant's personal profile on +- :guilabel:`Evaluation`: Represents a rating for the applicant: one star (:icon:`fa-star` + :icon:`fa-star-o` :icon:`fa-star-o`) is :guilabel:`Good`, two stars (:icon:`fa-star` + :icon:`fa-star` :icon:`fa-star-o`) is :guilabel:`Very Good`, and three stars (:icon:`fa-star` + :icon:`fa-star` :icon:`fa-star`)is :guilabel:`Excellent.` +- :guilabel:`Candidate`: Enter the applicant's name. This field is displayed as the card title in + the Kanban view of the :guilabel:`Applications` page. This is the **only** required field on the + form. +- :guilabel:`Email`: Enter the applicant's email address. +- :guilabel:`Phone`: Enter the applicant's phone number. +- :guilabel:`LinkedIn Profile`: Enter the web address for the applicant's personal profile on LinkedIn. -- :guilabel:`Degree`: select the applicant's highest level of education from the drop-down menu. +- :guilabel:`Job Position`: Select the job position the applicant is applying for. This field is + populated by default, but can be changed if necessary. +- :guilabel:`Recruiter`: Select the user responsible for the entire recruitment process for the job + position. +- :guilabel:`Interviewers`: Using the drop-down menu, select the people to conduct the interviews. + The selected people **must** have either *recruiter* or *officer* rights configured for the + **Recruitment** application to appear in the drop-down list. Refer to the :doc:`Access rights + <../../general/users/access_rights>` documentation for more information. +- :guilabel:`Tags`: Select as many tags as desired from the drop-down menu. To add a tag that does + not exist, type in the tag name, then click :guilabel:`Create "new tag"` from the resulting + drop-down menu. + +.. image:: add-new-applicants/new-applicant.png + :alt: All the fields of the Candidate section for a new applicant form entered. + +Notes tab +--------- + +Enter any notes regarding the applicant in this tab. These notes are only visible internally, with +users that have the proper access rights. + +Details tab +----------- + +The :guilabel:`Details` tab houses various information regarding the applicant and the job position. + +Applicant section +~~~~~~~~~~~~~~~~~ + +Enter the following information in the respective fields: + +- :guilabel:`Degree`: Select the applicant's highest level of education from the drop-down menu. Options are: :guilabel:`Graduate`, :guilabel:`Bachelor Degree`, :guilabel:`Master Degree`, or :guilabel:`Doctoral Degree`. The :guilabel:`Graduate` option indicates the applicant graduated at the highest level of school before a Bachelor's degree, such as a high school or secondary school diploma, depending on the country. -- :guilabel:`Interviewers`: using the drop-down menu, select the people to conduct the interviews. - The selected people **must** have either *recruiter* or *officer* rights configured for the - *Recruitment* application to appear in the drop-down list. Refer to the :doc:`Access rights - <../../general/users/access_rights>` documentation for more information. -- :guilabel:`Recruiter`: select the user responsible for the entire recruitment process for the job - position. -- :guilabel:`Evaluation`: represents a rating for the applicant: one star (:icon:`fa-star` - :icon:`fa-star-o` :icon:`fa-star-o`) is :guilabel:`Good`, two stars (:icon:`fa-star` - :icon:`fa-star` :icon:`fa-star-o`) is :guilabel:`Very Good`, and three stars (:icon:`fa-star` - :icon:`fa-star` :icon:`fa-star`)is :guilabel:`Excellent.` -- :guilabel:`Source`: using the drop-down menu, select where the applicant learned about the job - position. The following options come pre-configured in Odoo: :guilabel:`Search engine`, - :guilabel:`Lead Recall`, :guilabel:`Newsletter`, :guilabel:`Facebook`, :guilabel:`Twitter`, - :guilabel:`LinkedIn`, :guilabel:`Monster`, :guilabel:`Glassdoor`, and :guilabel:`Craigslist`. To - add a new :guilabel:`Source`, type in the source, then click :guilabel:`Create "(new source)"`. -- :guilabel:`Medium`: using the drop-down menu, specify how the job listing was found. The - pre-configured options are: :guilabel:`Banner`, :guilabel:`Direct`, :guilabel:`Email`, - :guilabel:`Facebook`, :guilabel:`Google Adwords`, :guilabel:`LinkedIn`, :guilabel:`Phone`, - :guilabel:`Television`, :guilabel:`Twitter` (now known as "X"), or :guilabel:`Website`. To add a - new :guilabel:`Medium`, type in the medium, then click :guilabel:`Create "(new medium)"`. -- :guilabel:`Referred By User`: if referral points are to be earned for this job position in the - *Referrals* application, select the user who referred the applicant from the drop-down menu. The - *Referrals* application **must** be installed for this field to appear. -- :guilabel:`Availability`: select the available start date for the applicant. To select a date, +- :guilabel:`Availability`: Select the available start date for the applicant. To select a date, click on the field to reveal a popover calendar. Use the :icon:`fa-angle-left` :guilabel:`(left)` and :icon:`fa-angle-right` :guilabel:`(right)` arrows on either side of the month to navigate to the desired month, then click the desired date. Leaving this field blank indicates the applicant can start immediately. -- :guilabel:`Tags`: select as many tags as desired from the drop-down menu. To add a tag that does - not exist, type in the tag name, then click :guilabel:`Create "new tag"` from the resulting - drop-down menu. + +Salary package section +~~~~~~~~~~~~~~~~~~~~~~ + +Configure both the offered and proposed salary and benefits in this section. Fill out the following +fields: + +- :guilabel:`Expected`: Enter the amount the applicant is requesting in this field. The number + should be in a `XX,XXX.XX` format. The currency is determined by the localization setting for the + company. +- :guilabel:`Other Benefits`: If any benefits are requested by the applicant, enter them in the + blank :guilabel:`Other Benefits` text field to the right of the :guilabel:`Expected` salary field. + The benefits should be short and descriptive, such as `4 Weeks Vacation` or `Dental Plan`. +- :guilabel:`Proposed`: Enter the amount to be offered to the applicant for the role in this field. + The number should be in a `XX,XXX.XX` format. +- :guilabel:`Other Benefits`: If any benefits are offered to the applicant, enter them in the + :guilabel:`Other Benefits` text field to the right of the :guilabel:`Proposed` field. The benefits + should be short and descriptive, such as `Unlimited Sick Time` or `Health Insurance`. Job section ------------ +~~~~~~~~~~~ -The following fields are pre-populated when creating a new applicant, as long as these field are +The following fields are pre-populated when creating a new applicant, as long as these fields are specified on the job position form. Editing the fields is possible, if desired. -- :guilabel:`Applied Job`: select the job position the applicant is applying to from the drop-down - menu. - :guilabel:`Department`: select the department the job position falls under from the drop-down menu. - :guilabel:`Company`: select the company the job position is for using the drop-down menu. This field **only** appears when in a multi-company database. -Contract section ----------------- - -- :guilabel:`Expected Salary`: enter the amount the applicant is requesting in this field. The - number should be in a `XX,XXX.XX` format. The currency is determined by the localization setting - for the company. +Sourcing section +~~~~~~~~~~~~~~~~ - - :guilabel:`Extra advantages...`: if any extra advantages are requested by the applicant, enter - it in the :guilabel:`Extra advantages...` field to the right of the :guilabel:`Expected Salary` - field. This should be short and descriptive, such as `1 week extra vacation` or `dental plan`. +This section houses the details regarding the way the applicant applied for the job position. This +information is necessary for :doc:`employee referrals <../referrals>`, and allows for reporting on +the channels with the highest applicant generation. -- :guilabel:`Proposed Salary`: enter the amount to be offered to the applicant for the role in this - field. The number should be in a `XX,XXX.XX` format. - - - :guilabel:`Extra advantages...`: if any extra advantages are offered to the applicant, enter it - in the :guilabel:`Extra advantages...` field to the right of the :guilabel:`Proposed Salary` - field. This should be short and descriptive, such as `unlimited sick time` or `retirement plan`. - -Application Summary tab ------------------------ +- :guilabel:`Source`: Using the drop-down menu, select where the applicant learned about the job + position. The following options come preconfigured in Odoo: :guilabel:`Search engine`, + :guilabel:`Lead Recall`, :guilabel:`Newsletter`, :guilabel:`Facebook`, :guilabel:`X`, + :guilabel:`LinkedIn`, :guilabel:`Monster`, :guilabel:`Glassdoor`, and :guilabel:`Craigslist`. To + add a new :guilabel:`Source`, type in the source, then click :guilabel:`Create "(new source)"`. +- :guilabel:`Medium`: Using the drop-down menu, specify how the job listing was found. The + preconfigured options are: :guilabel:`Banner`, :guilabel:`Direct`, :guilabel:`Email`, + :guilabel:`Facebook`, :guilabel:`Google Adwords`, :guilabel:`LinkedIn`, :guilabel:`Phone`, + :guilabel:`SMS`, :guilabel:`Television`, :guilabel:`Website`, :guilabel:`X` (formerly "Twitter"), + or :guilabel:`[Push Notifications] (website name)`. To add a new :guilabel:`Medium`, type in the + medium, then click :guilabel:`Create "(new medium)"`. +- :guilabel:`Referred By User`: If referral points are to be earned for this job position in the + **Referrals** application, select the user who referred the applicant from the drop-down menu. The + **Referrals** application **must** be installed for this field to appear. -Any additional details or notes that should be added to the applicant's card can be typed into this -field. +.. image:: add-new-applicants/details-tab.png + :alt: All the fields of the Details tab for a new applicant form entered. Skills tab ---------- -Skills can be added to the applicant's card. For details on adding skills, refer to the -:ref:`Create new employees ` document. +Skills can be added to the applicant's card. For details on adding skills, refer to the :ref:`Create +new employees ` document. diff --git a/content/applications/hr/recruitment/add-new-applicants/details-tab.png b/content/applications/hr/recruitment/add-new-applicants/details-tab.png new file mode 100644 index 0000000000..37d61c4391 Binary files /dev/null and b/content/applications/hr/recruitment/add-new-applicants/details-tab.png differ diff --git a/content/applications/hr/recruitment/add-new-applicants/new-applicant.png b/content/applications/hr/recruitment/add-new-applicants/new-applicant.png index 71197b25eb..f7cfef3b83 100644 Binary files a/content/applications/hr/recruitment/add-new-applicants/new-applicant.png and b/content/applications/hr/recruitment/add-new-applicants/new-applicant.png differ diff --git a/content/applications/hr/recruitment/add-new-applicants/quick-add.png b/content/applications/hr/recruitment/add-new-applicants/quick-add.png index 7377f13406..8b37c1091d 100644 Binary files a/content/applications/hr/recruitment/add-new-applicants/quick-add.png and b/content/applications/hr/recruitment/add-new-applicants/quick-add.png differ diff --git a/content/applications/hr/recruitment/applicant_analysis.rst b/content/applications/hr/recruitment/applicant_analysis.rst new file mode 100644 index 0000000000..69063414f3 --- /dev/null +++ b/content/applications/hr/recruitment/applicant_analysis.rst @@ -0,0 +1,91 @@ +================== +Applicant analysis +================== + +The *Applicant Analysis* report allows recruiting departments to see which job positions have the +most applicants, which have the most referrals, and how long it takes for applicants to move through +the pipeline. + +Knowing how many applicants each specific job position has, along with statistics about how many are +hired and refused, can provide valuable insights. This information can assist the recruiting team to +pivot their strategies to acquire the most desirable candidates. + +Applicant analysis report +========================= + +Start by navigating to :menuselection:`Recruitment app --> Reporting --> Applicant Analysis`. This +presents a line chart of all applicants for the last year. + +Three separate color-coded metrics are presented: :guilabel:`In Progress`, :guilabel:`Hired`, and +:guilabel:`Refused`. + +Hover the cursor over a month of the chart, and a pop-up window appears, displaying the specific +numbers for that month. + +.. image:: applicant_analysis/line-chart.png + :alt: The default Applicant Analysis report. + +Pivot table view +---------------- + +For a more detailed view of the information in the :guilabel:`Applicant Analysis` report, click the +:icon:`oi-view-pivot` :guilabel:`(Pivot)` icon in the top-right corner. This displays all the +information in a pivot table. + +In this view, the job positions are displayed in the rows, and the columns display the total numbers +of applicants, including how many of those applicants were hired or refused, and who is still in the +recruitment process. The displayed information can be modified, if desired. + +In this example, there are 18 total applicants. Out of that, six have been hired, two have been +refused, and ten are still in the recruitment pipeline. The :guilabel:`Experienced Developer` +position has six total applicants, three of which were hired, one refused, and two still in +progress. + +.. image:: applicant_analysis/pivot-view.png + :alt: The detailed pivot table view. + +Use case: applicants with referrals +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To get a better understanding of how effective the company's :doc:`referral program <../referrals>` +is, the :guilabel:`Applicant Analysis` report can be modified to show how many applicants were +referred by current employees. + +From the :icon:`oi-view-pivot` :guilabel:`(Pivot)` view of the :guilabel:`Applicant Analysis` +report, first click the :guilabel:`Measures` button to reveal a drop-down menu of options. + +Click both :guilabel:`Has Referrer` and :guilabel:`Count`, to activate those two measures. Then, +click :guilabel:`Applicant`, :guilabel:`Hired`, :guilabel:`In Progress` and :guilabel:`Refused` to +deactivate those default measures. + +Now, the column displays the number of applicants that came from a referral in the :guilabel:`Has +Referrer` column, and the total number of applicants in the :guilabel:`Count` column. + +.. image:: applicant_analysis/referral.png + :alt: The detailed pivot table view displaying the number of referrals and the total applicants. + +In this example, the :guilabel:`Experienced Developer` and :guilabel:`Interior Designer` job +positions both have applicants from referrals, while the rest do not have any referrals. + +Hired through referrals +*********************** + +It is possible to modify this report even further to see how many referred applicants end up being +hired. + +To view this data, click on a :icon:`fa-plus-square` :guilabel:`[job position]` row, which reveals a +drop-down menu. Then, click :guilabel:`State` to show the various states applicants are currently +in. + +.. note:: + Only states that have applicants in them are shown for each job position. If a state does **not** + have any applicants, it does not appear in the list. + +To expand the other rows, and display the various states, click on the :icon:`fa-plus-square` +:guilabel:`[job position]` button. + +.. image:: applicant_analysis/state.png + :alt: The detailed pivot table view displaying applicants hired through referrals. + +Both the :guilabel:`Experienced Developer` and :guilabel:`Interior Designer` roles yielded one +referral hire each, confirming that developers and designers generate the highest-success referrals. diff --git a/content/applications/hr/recruitment/applicant_analysis/line-chart.png b/content/applications/hr/recruitment/applicant_analysis/line-chart.png new file mode 100644 index 0000000000..3fa1e80fff Binary files /dev/null and b/content/applications/hr/recruitment/applicant_analysis/line-chart.png differ diff --git a/content/applications/hr/recruitment/applicant_analysis/pivot-view.png b/content/applications/hr/recruitment/applicant_analysis/pivot-view.png new file mode 100644 index 0000000000..8afb55fd22 Binary files /dev/null and b/content/applications/hr/recruitment/applicant_analysis/pivot-view.png differ diff --git a/content/applications/hr/recruitment/applicant_analysis/referral.png b/content/applications/hr/recruitment/applicant_analysis/referral.png new file mode 100644 index 0000000000..955192c634 Binary files /dev/null and b/content/applications/hr/recruitment/applicant_analysis/referral.png differ diff --git a/content/applications/hr/recruitment/applicant_analysis/state.png b/content/applications/hr/recruitment/applicant_analysis/state.png new file mode 100644 index 0000000000..5d4675137c Binary files /dev/null and b/content/applications/hr/recruitment/applicant_analysis/state.png differ diff --git a/content/applications/hr/recruitment/cv-display.png b/content/applications/hr/recruitment/cv-display.png index c5bc3cb550..3590666ed2 100644 Binary files a/content/applications/hr/recruitment/cv-display.png and b/content/applications/hr/recruitment/cv-display.png differ diff --git a/content/applications/hr/recruitment/full-composer.png b/content/applications/hr/recruitment/full-composer.png index 6d44c2f3ec..35f4048a83 100644 Binary files a/content/applications/hr/recruitment/full-composer.png and b/content/applications/hr/recruitment/full-composer.png differ diff --git a/content/applications/hr/recruitment/gear.png b/content/applications/hr/recruitment/gear.png index f33dd957ee..ea0fe4010e 100644 Binary files a/content/applications/hr/recruitment/gear.png and b/content/applications/hr/recruitment/gear.png differ diff --git a/content/applications/hr/recruitment/new-applicants-button.png b/content/applications/hr/recruitment/new-applicants-button.png index a9db035314..e16ce9f564 100644 Binary files a/content/applications/hr/recruitment/new-applicants-button.png and b/content/applications/hr/recruitment/new-applicants-button.png differ diff --git a/content/applications/hr/recruitment/new_job.rst b/content/applications/hr/recruitment/new_job.rst index 07c740e02b..1b18df86e7 100644 --- a/content/applications/hr/recruitment/new_job.rst +++ b/content/applications/hr/recruitment/new_job.rst @@ -2,23 +2,24 @@ Job positions ============= -In Odoo *Recruitment*, all job positions are shown on the default dashboard in the *Recruitment* -app. This includes positions that are being actively recruited for, as well as inactive positions. +In Odoo's **Recruitment** application, all job positions are shown on the default dashboard in the +**Recruitment** app, which includes both active and inactive positions. Each job position is shown in an individual Kanban card. If the job position is active, and -candidates can apply, a :guilabel:`Published` banner appears in the top-right corner of the card. +candidates can apply, a :guilabel:`PUBLISHED` banner appears in the top-right corner of the card. View submitted applications by clicking anywhere on a job position card. .. image:: new_job/jobs.png - :align: center :alt: Main dashboard view of Recruitment app showing all job positions. +.. _job-position/create-job-position: + Create a new job position ========================= -To create a new job position from the main dashboard in the *Recruitment* app, click the -:guilabel:`New` button in the top-left corner, and a :guilabel:`Create a Job Position` modal +To create a new job position from the main dashboard in the **Recruitment** app, click the +:guilabel:`New` button in the top-left corner, and a :guilabel:`Create a Job Position` pop-up window appears. First, enter the name of the :guilabel:`Job Position` (such as `Sales Manager`, `Mechanical @@ -33,76 +34,116 @@ When complete, click the :guilabel:`Create` button to save the entry, or the :gu button to delete it. .. image:: new_job/job-title.png - :align: center :alt: Create a new job position. Once the job position has been created, it appears as a card in the Kanban view on the main -*Recruitment* app dashboard. +**Recruitment** app dashboard. .. _recruitment/new_job_position/edit: Edit a new job position ----------------------- -After the job position is created, it's time to enter the details for the position. Click on the -:guilabel:`⋮ (three dots)` icon in the upper-right corner of the relevant card to reveal several -options, and then click :guilabel:`Configuration` to edit the details. +After the job position is created, it is time to enter the details for the position. Click on the +:icon:`fa-ellipsis-v` :guilabel:`(Dropdown menu)` icon in the upper-right corner of the relevant +card to reveal several options, and then click :guilabel:`Configuration` to edit the details. .. image:: new_job/edit-job.png - :align: center :alt: Edit the job position card. +Recruitment tab +~~~~~~~~~~~~~~~ + All the basic information about the job position is listed under the :guilabel:`Recruitment` tab. None of the fields are required, but it is important to configure and populate the -:guilabel:`Department`, :guilabel:`Location`, :guilabel:`Employment Type`, and :guilabel:`Job -Summary` fields, as they are all visible to prospective applicants on the website. +:guilabel:`Department`, :guilabel:`Job Location`, :guilabel:`Employment Type` fields, and the +:guilabel:`Job Summary` tab, as they are all visible to prospective applicants on the website. + +.. note:: + Some fields listed below may not appear depending on the database configuration and other + installed applications. The fields can be filled out as follows: -- :guilabel:`Department`: select the relevant department for the job position. This is visible on +- :guilabel:`Department`: Select the relevant department for the job position. This is visible on the website. -- :guilabel:`Job Location`: select the physical address for the job. If the job position is remote, +- :guilabel:`Job Location`: Select the physical address for the job. If the job position is remote, leave this field blank. This is visible on the website. -- :guilabel:`Email Alias`: enter an email address to which applicants can send a resumé. Once - emailed, Odoo automatically creates an application for them. +- :guilabel:`Industry`: Select the relevant industry the job position falls under. This field + corresponds to the industries on job boards. Odoo comes with 86 preconfigured industries. It is + *not* recommended to add a new industry, as it may hide the job position during some searched on + the various job boards. +- :guilabel:`Email Alias`: Enter an email address to which applicants can send a resumé. Once + emailed, Odoo automatically creates an application for them. If an email was entered when creating + the job position, this field is populated. - :guilabel:`Employment Type`: select what type of position the job is, using the drop-down menu. The default options are :guilabel:`Permanent`, :guilabel:`Temporary`, :guilabel:`Seasonal`, - :guilabel:`Interim`, :guilabel:`Full-Time`, and :guilabel:`Part-Time`. This is visible on the - website. -- :guilabel:`Company`: select the company the job is for. This field only appears if using a + :guilabel:`Full-Time`, :guilabel:`Intern`, :guilabel:`Student`, :guilabel:`Apprenticeship`, + :guilabel:`Thesis`, :guilabel:`Statutory`, and :guilabel:`Employee`. Depending on the installed + localization, other options may be available. This is visible on the website. +- :guilabel:`Working Schedule`: Select the working schedule for the job position. Odoo provides one + working schedule by default, :guilabel:`Standard 40 hours/week`, but all working schedules in the + database are available. +- :guilabel:`Salary Range`: Enter both the minimum and maximum salaries offered for the position in + the two fields. Then, set the last field to the time-frame for the salary range. The default + options are :guilabel:`Hour`, :guilabel:`Day`, :guilabel:`Week`, :guilabel:`Bi-Week`, + :guilabel:`Month`, and :guilabel:`Year`. +- :guilabel:`Expected Skills`: Select all the desired skills for the job position, using the + drop-down menu. The skills presented are :ref:`configured in the Employees app + `. +- :guilabel:`Company`: Select the company the job is for. This field only appears if using a multi-company database. -- :guilabel:`Target`: enter the number of employees to be hired for this position. -- :guilabel:`Is Published`: activate this option to publish the job online. -- :guilabel:`Website`: select the website the job is published on. -- :guilabel:`Recruiter`: select the person responsible for recruiting this role. -- :guilabel:`Interviewers`: select who should perform the interviews. Multiple people can be +- :guilabel:`Mission Dates`: Using the calendar selector, set the start date for the job position. + If the job is temporary and has a specific end date, set the end date in the second field. +- :guilabel:`Target`: Enter the number of employees to be hired for this position. +- :guilabel:`Website`: Select the website the job is published on. +- :guilabel:`Recruiter`: Select the person responsible for recruiting this role. +- :guilabel:`Interviewers`: Select who should perform the interviews. Multiple people can be selected. - :guilabel:`Interview Form`: select an :ref:`Interview form ` that applicants fill out prior to their interview. -- :guilabel:`Contract Template`: select a contract template to be used when offering the job to a +- :guilabel:`Contract Template`: Select a contract template to be used when offering the job to a candidate. -- :guilabel:`Process Details` section: this section contains information that is displayed online - for the job position. This informs the applicants of the timeline and steps for the recruitment - process, so they know when to expect a reply. - - :guilabel:`Time to Answer`: enter the number of days before the applicant is contacted. - - :guilabel:`Process`: enter the various stages the candidate goes through during the recruitment - process. - - :guilabel:`Days to get an Offer`: enter the number of days before the applicant should expect - an offer after the recruitment process has ended. +.. image:: new_job/recruitment-tab.png + :alt: The job information details in the Recruitment tab. + +Job summary tab +~~~~~~~~~~~~~~~ + +Enter the job description in the :guilabel:`Job Summary` tab. This description is visible on the +website. + +.. image:: new_job/job-summary.png + :alt: The summary of the position in the Job Summary tab. + +Application info tab +~~~~~~~~~~~~~~~~~~~~ + +The :guilabel:`Process Details` section of the :guilabel:`Application Info` tab contains information +that is displayed online for the job position. This informs the applicants of the timeline and steps +for the recruitment process, so they know when to expect a reply. + +The following fields are populated by default, but can be modified to suit the recruitment timeline +of the business: + +- :guilabel:`Time to Answer`: Enter the number of days before the applicant is contacted. + :guilabel:`2 open days` populates this field by default. +- :guilabel:`Process`: Enter the various stages the candidate goes through during the recruitment + process. By default, two process steps are visible: :guilabel:`1 Phone Call` and :guilabel:`1 + Onsite Interview`. +- :guilabel:`Days to get an Offer`: Enter the number of days before the applicant should expect an + offer after the recruitment process has ended. The default is :guilabel:`4 Days after Interview`. + +.. image:: new_job/app-info.png + :alt: Enter job information details in the recruitment tab. .. note:: The :guilabel:`Process Details` section is a text field. All answers are typed in rather than selected from a drop-down menu. The text is displayed on the website exactly as it appears in this tab. -Finally, enter the job description in the :guilabel:`Job Summary` tab. - -.. image:: new_job/recruitment-tab.png - :align: center - :alt: Enter job information details in the recruitment tab. - .. _recruitment/interview: Create interview form @@ -117,22 +158,21 @@ Before creating an interview form, ensure the proper settings are enabled. Navig :guilabel:`Recruitment Process` section, ensure the :guilabel:`Send Interview Survey` option is enabled. -Since there are no pre-configured forms in Odoo, all interview forms must be created. To create an +Since there are no preconfigured forms in Odoo, all interview forms must be created. To create an interview form, start from the :guilabel:`Recruitment` tab of the :guilabel:`Job Position` form. In the :guilabel:`Interview Form` field, enter a name for the new interview form. As the name is typed, several options populate beneath the entry: :guilabel:`Create (interview form name)`, :guilabel:`Search More...`, and :guilabel:`Create and edit...`. Click :guilabel:`Create and edit...` -and a :guilabel:`Create Interview Form` modal appears. +and a :guilabel:`Create Interview Form` pop-up window appears. .. image:: new_job/blank-interview-form.png - :align: center - :alt: The blank interview form modal. + :alt: The blank interview form pop-up window. .. note:: The option :guilabel:`Search More...` only appears if there are any interview forms already created. If no interview forms exist, the only options available are :guilabel:`Create (interview form name)`, and :guilabel:`Create and edit...`. -Proceed to fill out the modal interview form as a typical survey. For specific directions on how to -create a survey, refer to the :doc:`survey essentials <../../marketing/surveys/create>` document, -which provides step-by-step instructions on how to create and configure a survey. +Proceed to fill out the interview form pop-up window as a typical survey. For specific directions on +how to create a survey, refer to the :doc:`survey essentials <../../marketing/surveys/create>` +document, which provides step-by-step instructions on how to create and configure a survey. diff --git a/content/applications/hr/recruitment/new_job/app-info.png b/content/applications/hr/recruitment/new_job/app-info.png new file mode 100644 index 0000000000..4f3c341248 Binary files /dev/null and b/content/applications/hr/recruitment/new_job/app-info.png differ diff --git a/content/applications/hr/recruitment/new_job/blank-interview-form.png b/content/applications/hr/recruitment/new_job/blank-interview-form.png index 5ed5b6b560..6e4ebd3bca 100644 Binary files a/content/applications/hr/recruitment/new_job/blank-interview-form.png and b/content/applications/hr/recruitment/new_job/blank-interview-form.png differ diff --git a/content/applications/hr/recruitment/new_job/edit-job.png b/content/applications/hr/recruitment/new_job/edit-job.png index 93d6c6961f..efae04cde1 100644 Binary files a/content/applications/hr/recruitment/new_job/edit-job.png and b/content/applications/hr/recruitment/new_job/edit-job.png differ diff --git a/content/applications/hr/recruitment/new_job/job-summary.png b/content/applications/hr/recruitment/new_job/job-summary.png new file mode 100644 index 0000000000..8238385257 Binary files /dev/null and b/content/applications/hr/recruitment/new_job/job-summary.png differ diff --git a/content/applications/hr/recruitment/new_job/job-title.png b/content/applications/hr/recruitment/new_job/job-title.png index 15dcd0f4b9..da21d30d40 100644 Binary files a/content/applications/hr/recruitment/new_job/job-title.png and b/content/applications/hr/recruitment/new_job/job-title.png differ diff --git a/content/applications/hr/recruitment/new_job/recruitment-tab.png b/content/applications/hr/recruitment/new_job/recruitment-tab.png index 75f237a0da..70211f697d 100644 Binary files a/content/applications/hr/recruitment/new_job/recruitment-tab.png and b/content/applications/hr/recruitment/new_job/recruitment-tab.png differ diff --git a/content/applications/hr/recruitment/offer_job_positions.rst b/content/applications/hr/recruitment/offer_job_positions.rst index b1ebd56f73..65b35ad8ac 100644 --- a/content/applications/hr/recruitment/offer_job_positions.rst +++ b/content/applications/hr/recruitment/offer_job_positions.rst @@ -2,8 +2,9 @@ Offer job positions =================== -Once an applicant has successfully passed the various interview stages, the recruitment team is -ready to send an offer for employment. The next step is to send the applicant a contract. +After an applicant has successfully passed the various interview stages, the recruitment team is +ready to send an offer for employment. The first step when offering a job position is to send the +applicant a contract. .. seealso:: Refer to the :doc:`recruitment <../recruitment>` documentation for details on the various stages @@ -23,8 +24,17 @@ the top-right of the applicant's form. The next step is to send an offer to the applicant. Start by selecting the desired applicant's card to open their applicant form. -On the applicant's form, click the :guilabel:`Generate Offer` button. A :guilabel:`Generate a -Simulation Link` pop-up window appears. +On the applicant's form, click the :guilabel:`Generate Offer` button to load the :guilabel:`Offer +for (applicant's email)` page. + +.. important:: + If the applicant does not have an email address listed on their applicant card, an + :guilabel:`Invalid Operation` pop-up window warning appears, stating: :guilabel:`Offer link can + not be send. The applicant needs to have a name and email.` + + Click :guilabel:`Close`, then enter an email on the applicant's card. Once an email is entered, + click the :guilabel:`Generate Offer` button, and the :guilabel:`Offer for (applicant's email)` + page loads. Most fields are pre-populated with information from the job position. If any necessary fields are blank, or if any information needs to be updated, enter, or update, the relevant information in the @@ -32,80 +42,79 @@ corresponding fields. .. note:: Depending on the localization setting for the company, and which applications are installed, some - fields may not appear in the :guilabel:`Generate a Simulation Link` pop-up window. + fields may not appear on the :guilabel:`Offer for (applicant's email)` page. - For example, if the *Fleet* application is **not** installed, any fields related to vehicles do + For example, if the **Fleet** application is **not** installed, any fields related to vehicles do **not** appear. Universal fields ---------------- -The following fields appear in the :guilabel:`Generate a Simulation Link` pop-up window, regardless -of the localization. +The following fields appear in the :guilabel:`Offer for (applicant's email)` page, regardless of the +localization. -- :guilabel:`Contract Template`: the template currently being used to populate the - :guilabel:`Generate a Simulation Link` pop-up window. Use the drop-down menu to select a different - :guilabel:`Contract Template`, if desired. +- :guilabel:`Title`: The name for the contract appears in a default `Offer for (applicant's email)` + format. +- :guilabel:`Contract Template`: The template currently being used to populate the :guilabel:`Offer + for (applicant's email)` page. Use the drop-down menu to select a different :guilabel:`Contract + Template`, if desired. .. note:: - To modify the template, hover over the current template name, and click the :icon:`oi-launch` - :guilabel:`Internal link` icon that appears to the right of the field. Make any desired - changes, then click :guilabel:`Save & Close`. + To modify the template, hover over the current template name, and click the + :icon:`fa-arrow-right` :guilabel:`(Internal link)` icon that appears to the right of the field. + Make any desired changes, then click :guilabel:`Save & Close`. -- :guilabel:`Job Position`: the name of the :guilabel:`Job Position` being offered to the applicant. - The selections available in the drop-down menu correspond to the job position configured on the - main *Recruitment* dashboard. -- :guilabel:`Job Title`: the selected :guilabel:`Job Position` populates this field, by default. - The title can be modified to suit the specific applicant's position and provide more details. +- :guilabel:`Employer Budget`: The salary being offered to the applicant. +- :guilabel:`Job Title`: The selected :guilabel:`Employee Job` populates this field, by default. The + title can be modified to suit the specific applicant's position and provide more details. .. example:: An applicant is offered a marketing manager job at a shoe company, specifically for the children's line. - The :guilabel:`Job Position` selected from the drop-down menu is `Marketing Manager`, and the + The :guilabel:`Employee Job` selected from the drop-down menu is `Marketing Manager`, and the :guilabel:`Job Title` is modified for their specific responsibilities, `Marketing Manager: Children's Shoes`. -- :guilabel:`Department`: the department the job position falls under. -- :guilabel:`Contract Start Date`: the date the contract takes effect. The default date is the - current date. To modify the date, click on the displayed date to reveal a calendar popover window. - Navigate to the desired month, then click the day to select the date. -- :guilabel:`Yearly Cost`: the annual salary being offered. -- :guilabel:`Link Expiration Date`: the number of days the job offer is valid. The default - expiration date is `30` days. Modify the expiration date, if desired. +- :guilabel:`Employee Job`: The name of the :guilabel:`Job Title` being offered to the applicant. + The selections available in the drop-down menu correspond to the job position configured on the + main **Recruitment** app dashboard. + +- :guilabel:`Department`: The department the job position falls under. +- :guilabel:`Contract Start Date`: The date the proposed contract takes effect. The default date is + the current date. To modify the date, click on the displayed date to reveal a calendar popover + window. Navigate to the desired month, then click the day to select the date. +- :guilabel:`Offer Create Date`: The day the offer is created, By default, the current date + populates this field and *cannot* be modified. +- :guilabel:`Offer Validity Date`: The last day the offer is valid. After this date the contract + cannot be signed. +- :guilabel:`Link`: The link to the contract being sent to the candidate. +- :guilabel:`Validity Days Count`: The number of days the contract is valid. The default expiration + date is `30` days. Modify the expiration date, if desired. +- :guilabel:`Applicant`: The name of the applicant appears in this field, and cannot be modified. Send offer ---------- -Once the :guilabel:`Generate a Simulation Link` pop-up window is complete, click :guilabel:`Send By -Email` to reveal an email pop-up window. - -.. important:: - If the applicant does not have an email address listed on their applicant card, a warning appears - in a red box at the bottom of the :guilabel:`Generate a Simulation Link` pop-up window, stating: - :guilabel:`The applicant does not have a valid email set. The Offer Link won't be able to be - completed.` Click :guilabel:`Discard`, then enter an email on the applicant's card. Once an email - is entered, click the :guilabel:`Generate Offer` button, and the email pop-up window loads again. +Once all desired modifications have been made to the :guilabel:`Offer for (applicant's email)` page, +click the :guilabel:`Send By Email` button to reveal an email pop-up window. -The default :guilabel:`Recruitment: Your Salary Package` email template is used (set in the -:guilabel:`Load template` field), and the :guilabel:`Recipients`, :guilabel:`Subject`, and email -body are pre-populated based on the email template. +The default `Recruitment: Your Salary Package` email template is used, and the :guilabel:`To`, +:guilabel:`Subject`, and email body are pre-populated based on the email template. -If any attachments need to be added, click the :icon:`fa-paperclip` :guilabel:`Attachments` button, +If any attachments need to be added, click the :icon:`fa-paperclip` :guilabel:`(paperclip)` button, and a file explorer window appears. Navigate to the desired file, then click :guilabel:`Open` to -attach it to the email. The attachment loads, and is listed above the :icon:`fa-paperclip` -:guilabel:`Attachments` button. +attach it to the email. The attachment loads, and is listed at the bottom of the email body. Once the email is ready to send, click :guilabel:`Send`. The email pop-up window closes, and an -:guilabel:`Offers` smart button appears at the top of the applicant's card. +:icon:`fa-handshake-o` :guilabel:`Offers` smart button appears at the top of the applicant's card. .. note:: - To send an offer, ensure the *Sign* application is installed. This is necessary, so the offer can - be sent to the applicant by the recruiter, and they can actually sign the offer. The applicant - does **not** need any software installed to sign the offer. + To send an offer, ensure the **Sign** application is installed. This is necessary, so the offer + can be sent to the applicant by the recruiter, and they can actually sign the offer. The + applicant does **not** need any software installed to sign the offer. .. image:: offer_job_positions/send-offer.png - :align: center :alt: Send an email to the applicant with a link to the offered salary. Configure your package @@ -122,29 +131,29 @@ Once the applicant is hired, the personal information entered on the webpage is employee record, when created. Once all the information is completed, the applicant can then accept the offer by clicking the -:guilabel:`Review Contract & Sign` button to accept the contract, and sign it using the *Sign* +:guilabel:`Review Contract & Sign` button to accept the contract, and sign it using the **Sign** application. +Management signatures +--------------------- + +Once the applicant has signed the contract, the next step is for the person responsible within the +company (the :guilabel:`HR Responsible`) must then sign the contract. + +The person responsible for signing the contract receives an activity alert that their signature is +requested of them in the **Sign** app. + .. _recruitment/offer_job_positions/contract-signed: Contract signed =============== -Once the applicant has accepted the offer and signed the contract, the next step is to move the -applicant to the :guilabel:`Contract Signed` stage. This stage is folded in the Kanban view, by -default. - -To move the applicant to that stage, drag-and-drop the applicant's card to the :guilabel:`Contract -Signed` stage. If the stage is not visible, click the :icon:`fa-ellipsis-h` :guilabel:`(ellipsis)` -button to the right of :guilabel:`Contract Proposal` on the applicant's form, and click -:guilabel:`Contract Signed` from the resulting drop-down menu. - -Once the applicant is moved to the :guilabel:`Contract Signed` stage, a green :guilabel:`HIRED` -banner appears in the top-right of the applicant's card and form. +Once all parties have fully signed the contract, the applicant is automatically moved to the +:guilabel:`Contract Signed` stage, and a green :guilabel:`HIRED` banner appears in the top-right of +both the applicant's card and form. .. image:: offer_job_positions/hired.png - :align: center - :alt: Hired banner in the top right corner of applicant card. + :alt: Hired banner in the top-right corner of applicant card. .. _recruitment/new-employee: @@ -159,4 +168,4 @@ An employee form appears, with information from the applicant's card, and the em Fill out the rest of the employee form. For detailed information on the fields, refer to the :doc:`../employees/new_employee` documentation. -Once completed, the employee record is saved in the *Employees* app. +Once completed, the employee record is saved in the **Employees** app. diff --git a/content/applications/hr/recruitment/offer_job_positions/hired.png b/content/applications/hr/recruitment/offer_job_positions/hired.png index 1e60e2ff2f..74416c8c02 100644 Binary files a/content/applications/hr/recruitment/offer_job_positions/hired.png and b/content/applications/hr/recruitment/offer_job_positions/hired.png differ diff --git a/content/applications/hr/recruitment/offer_job_positions/send-offer.png b/content/applications/hr/recruitment/offer_job_positions/send-offer.png index 6e4cadc4d0..792ca8f1e2 100644 Binary files a/content/applications/hr/recruitment/offer_job_positions/send-offer.png and b/content/applications/hr/recruitment/offer_job_positions/send-offer.png differ diff --git a/content/applications/hr/recruitment/post_job.rst b/content/applications/hr/recruitment/post_job.rst new file mode 100644 index 0000000000..413c307811 --- /dev/null +++ b/content/applications/hr/recruitment/post_job.rst @@ -0,0 +1,162 @@ +================== +Post job positions +================== + +After a job position has been :doc:`created and configured `, the next step is to share it, +so that prospective applicants can apply. + +Job positions can be shared on the :ref:`company website ` or on :ref:`job boards +`. + +.. _post-job/website: + +Publish to website +================== + +To publish a job listing on the company's website, first a setting must be enabled in the +**Recruitment** app. Navigate to :menuselection:`Recruitment app --> Configuration --> Settings`, +and enable the :guilabel:`Online Posting` option. Click the :guilabel:`Save` button after making any +changes. + +.. note:: + The :guilabel:`Online Posting` is only available if the :doc:`Website <../../websites/website>` + application is also installed. + +Once the setting has been enabled, open the main **Recruitment** dashboard by navigating to +:menuselection:`Recruitment app --> Applications --> By Job Position`. A toggle appears in the +lower-left corner of every job position card, and indicates whether the role is :guilabel:`Not +Published` or :guilabel:`Published`. + +Click on the toggle to change the current state of the job position. When a job position is +published, a green :guilabel:`PUBLISHED` banner appears in the top-right corner of the card. + +To view the listing on the website, click the :icon:`oi-launch` :guilabel:`Job Page` in the +lower-right corner of the job card. + +.. _post-job/boards: + +Post on job boards +================== + +Posting a job on a job board is an effective way to reach a wider audience, and attract more +candidates. + +.. note:: + Check back frequently for more updates, as more job boards are added. + +Job board settings +------------------ + +To publish a job listing onto a job board outside of Odoo, first a setting must be configured in the +**Recruitment** app. Navigate to :menuselection:`Recruitment app --> Configuration --> Settings`, +and click :icon:`oi-arrow-right` :guilabel:`Choose a Job Board`. + +This loads a page displaying the :guilabel:`Recruitment Integration Monster` module. Click +:guilabel:`Activate` to install the module. + +.. note:: + If the :guilabel:`Recruitment Integration Monster` module is already installed, no + :guilabel:`Activate` button appears, only a :guilabel:`Module Info` button. + +After the module is installed, the database reloads to the main dashboard. Open the **Recruitment** +app, and navigate to :menuselection:`Configuration --> Settings`. A :guilabel:`Monster Credentials` +section appears in the :guilabel:`Job Posting` section. + +Enter the :guilabel:`Username` and :guilabel:`Password` for Monster in the corresponding fields, +then click the :guilabel:`Save` button. + +Publish on job board +-------------------- + +Once the credentials have been configured for the job board, it is possible to post a job position. +Navigate to the **Recruitment** app dashboard, and click :guilabel:`# To Recruit` on the desired job +card. + +Click the :guilabel:`Publish on Job Board` button, and a :guilabel:`Publish on Job Board` form loads +in a pop-up window. Fill out the following information on the form: + +- :guilabel:`Job`: The name of the job position appears here by default, and cannot be modified. +- :guilabel:`Job Board`: Using the drop-down menu, select the job board being posted to. +- :guilabel:`Apply Method`: Click the desired radio button to determine how applicants apply for the + position. + + - :guilabel:`Send an Email`: Select this for applicants to apply for the job via email. + - :guilabel:`Redirect to company's website`: Select this for applicants to apply for the job via + the company website. + +- :guilabel:`Email` or :guilabel:`Job url`: The selected :guilabel:`Apply Method` determines which + field appears. The field is populated with the information from the job card, if available. Make + any desired modifications to this field, for example enter a tracking url for the job board + listing. +- :guilabel:`From` and :guilabel:`to`: Using the calendar selector, select the date the list should + be posted to the job board, in the :guilabel:`From` field. The :guilabel:`to` field says + :guilabel:`No Limit`, by default. If the job position should be removed from the job board on a + specific date, enter it in the second field. +- :guilabel:`Description` tab: The description from the job card populates this tab, by default. + Make any desired changes to it in this section. This is what appears on the job board. + + .. tip:: + Click the :guilabel:`Generate Description` (:icon:`fa-magic` :guilabel:`AI`) to use AI to edit + or create the job description. + +Once the listing is ready, click the :guilabel:`Post` button. After the post has been published to a +job board, the page reloads to the :guilabel:`Job Boards Posts` page, and the new post appears in a +Kanban card. + +.. image:: post_job/job-board.png + :alt: A job board listing form filled out. + +Job board emails +~~~~~~~~~~~~~~~~ + +When posting job positions on a job board, like Indeed or LinkedIn, the job board posts the job +position, and typically allows the website visitor to apply to the job directly from the job board. + +When someone applies to a job directly from a job board, an email is sent to Odoo from a specific +email address, such as `jobs-listings@linkedin.com`. The email uses regular expression (regex) +rules, which are instructions to match text in the email, and map it to specific fields in Odoo. + +When Odoo receives an email from the job board's corresponding email address, it runs the regex +rule, and pulls applicant information from the email, when creating an applicant record. + +.. example:: + The regex rule for :guilabel:`LinkedIn` (emails received from: `jobs-listings@linkedin.com`) is + :guilabel:`New application:.*from (.*)`. This rule tells Odoo to capture everything after the + word `from` when creating the applicant record. + + An email subject of `New application: Job ID 123 from John Doe` will capture `John Doe` and + create an applicant record for `John Doe`. + +To view the currently configured job board emails, navigate to :menuselection:`Recruitment app --> +Configuration --> Emails`. Three emails come preconfigured in the database; for +:guilabel:`LinkedIn`, :guilabel:`Jobsdb`, and :guilabel:`Indeed`. + +Create job board emails +*********************** + +To create a new job board email, navigate to :menuselection:`Recruitment app --> Configuration --> +Emails`. Click the :guilabel:`New` button, and a blank :guilabel:`Emails` form loads. + +Enter the :guilabel:`Name` for the platform, such as `Glassdoor`, in the corresponding field. Next, +enter the email address the applications will come from, in the :guilabel:`Email` field. Last, enter +the :guilabel:`regex` rules in the corresponding field. + +View job board listings +----------------------- + +To view all the job positions that have been posted to a job board, navigate to +:menuselection:`Recruitment --> Applications --> Job Boards Posts`. This presents the :guilabel:`Job +Boards Posts` dashboard and all job board postings. + +Each listing is displayed in an individual Kanban card, with the following information: + +- :guilabel:`Job Board Icon`: the icon for the job board where the listing is posted. +- :guilabel:`Job Board Listing Title`: the job position title and job board name. +- :guilabel:`From`: the date the listing was published. +- :guilabel:`To`: the date the listing will be removed from the job board. +- :guilabel:`User Icon`: the icon of the user who posted the listing. + +Click on any Kanban card to view the details for the specific job board listing. + +.. image:: post_job/posts.png + :alt: All job positions posted to a job board. diff --git a/content/applications/hr/recruitment/post_job/job-board.png b/content/applications/hr/recruitment/post_job/job-board.png new file mode 100644 index 0000000000..856a0133e2 Binary files /dev/null and b/content/applications/hr/recruitment/post_job/job-board.png differ diff --git a/content/applications/hr/recruitment/post_job/posts.png b/content/applications/hr/recruitment/post_job/posts.png new file mode 100644 index 0000000000..e570a594a2 Binary files /dev/null and b/content/applications/hr/recruitment/post_job/posts.png differ diff --git a/content/applications/hr/recruitment/recruitment-flow.rst b/content/applications/hr/recruitment/recruitment-flow.rst index a32594dc65..63c7867cb3 100644 --- a/content/applications/hr/recruitment/recruitment-flow.rst +++ b/content/applications/hr/recruitment/recruitment-flow.rst @@ -5,7 +5,7 @@ Recruitment flow When a prospective employee applies for a job in Odoo, there is a preconfigured process from the :ref:`initial inquiry ` to the :ref:`creating of a new employee ` once hired. The following outlines the default recruitment process for -Odoo's *Recruitment* application. +Odoo's **Recruitment** application. .. important:: The following is based on Odoo's default recruitment pipeline. Be advised that if @@ -21,36 +21,32 @@ At the start of the process, all applicants appear in the :guilabel:`New` stage :guilabel:`Applications` page, whether submitted online or if the applicant is :doc:`manually entered by a recruiter `. -When the applicant's card is created, Odoo automatically populates the -:guilabel:`Subject/Application`, the :guilabel:`Applicant's Name`, :guilabel:`Email`, and -:guilabel:`Mobile` number, on the applicant's card. This information is required when applying for -a job position, by default. +The :guilabel:`Candidate`, :guilabel:`Email`, and :guilabel:`Phone` number on the applicant's card +are filled as soon as it is created. By default, these details are required for every job position. .. note:: If the website application form is modified, different fields may be populated, based on what - information is requested on the website. + information is required on the website. -If the applicant entered any information in the *Short Introduction* section of the online -application, it populates the :guilabel:`Application Summary` tab at the bottom of the applicant's -card. +Anything typed in the *Short Introduction* section appears in the applicant's chatter as an +:guilabel:`Other Information` note from :guilabel:`OdooBot`. Resumé ------ If a resumé was attached to the online application, it appears in the :guilabel:`Files` section of -the chatter, and is also stored in the *Documents* application. +the chatter, and is also stored in the **Documents** application. To find the recruitment documents, navigate to the main :menuselection:`Documents app` dashboard, and click the :guilabel:`Recruitment` folder on the left-hand side. All recruitment documents are stored within that folder. If the :ref:`CV Display ` option was enabled in the :ref:`Settings -` of the *Recruitment* app, the resumé appears on the applicant's card, on the -right-hand side. +` of the **Recruitment** app, the resumé appears on the applicant's card. .. note:: Depending on the browser zoom level, or size of the browser screen, the resumé may appear below - the main applicant card information as a PDF link. + the main applicant card information as a PDF link, or on the right side as an image. Send interview -------------- @@ -58,7 +54,7 @@ Send interview At any point in the hiring process, an interview can be sent to the applicant to obtain more information. These interviews are custom-made, and can be formatted in a variety of ways. -The *Surveys* application is **required** to send interviews to an applicant, so it **must** be +The **Surveys** application is required to send interviews to an applicant, so it **must** be installed. Odoo uses the term *interview*, but these can be thought of as questionnaires, surveys, tests, @@ -115,7 +111,8 @@ If the emailed interview must be completed by a specific date, enter that date i To do so, click the empty field next to :guilabel:`Answer deadline`, and a calendar selector appears. Use the :icon:`fa-chevron-left` :guilabel:`(left)` and :icon:`fa-chevron-right` :guilabel:`(right)` arrows, on either side of the month, to navigate to the desired month. Then, -click on the desired day to select the date. +click on the desired day to select the date. Next, select the time the interview is due, in the two +fields at the bottom of the calendar selector. The :guilabel:`Mail Template` field is pre-populated, based on the configuration for the interview. A different template can be chosen from the drop-down menu, if desired. If a new template is @@ -125,9 +122,8 @@ To send the email with the interview link to the applicant, click :guilabel:`Sen the email pop-up window. .. image:: recruitment-flow/send-survey.png - :align: center :alt: Send a custom survey, also referred to as an interview form, to an applicant using a - pre-configured template. + preconfigured template. .. _recruitment/initial-qualification: @@ -137,9 +133,9 @@ Initial qualification If an applicant seems to be a good potential candidate, they are moved to the :guilabel:`Initial Qualification` stage. -This stage exists to quickly sort candidates that have potential, from those that do not meet the -requirements. No automatic actions, such as emails, are set for this stage. This stage simply -informs the recruitment team to potentially set up a phone call or an interview with the candidate. +This stage exists to sort candidates that have potential, from those that do not meet the +requirements. No automatic actions, such as emails, are set for this stage. This stage informs the +recruitment team to potentially set up a phone call or an interview with the candidate. .. note:: In order to move an applicant's card from one stage to another, the applicant's card can either @@ -154,7 +150,6 @@ informs the recruitment team to potentially set up a phone call or an interview change appears in the chatter, as well. .. image:: recruitment-flow/stage-change.png - :align: center :alt: Change the stage of an applicant by clicking on the desired stage at the top of the applicant's card. @@ -174,14 +169,10 @@ Alternatively, open the desired applicant's card from the :guilabel:`Application the :guilabel:`First Interview` stage on the status bar at the top of the individual applicant's card. -.. image:: recruitment-flow/move.png - :align: center - :alt: An applicant's card moves from one stage to another by using the click and drag method. - .. tip:: The :guilabel:`First Interview` stage can be modified, so when the applicant's card moves to the :guilabel:`First Interview` stage, an email can be automatically sent to the applicant, stating - an interview is requested. In this pre-configured email template, a link to the recruiting team's + an interview is requested. In this preconfigured email template, a link to the recruiting team's calendar appears, allowing the applicant to schedule their interview. :ref:`Edit ` the :guilabel:`First Interview` stage, and select the diff --git a/content/applications/hr/recruitment/recruitment-flow/move.png b/content/applications/hr/recruitment/recruitment-flow/move.png deleted file mode 100644 index e1b51993b6..0000000000 Binary files a/content/applications/hr/recruitment/recruitment-flow/move.png and /dev/null differ diff --git a/content/applications/hr/recruitment/recruitment-flow/send-survey.png b/content/applications/hr/recruitment/recruitment-flow/send-survey.png index d78efc02ef..06bd4eeab8 100644 Binary files a/content/applications/hr/recruitment/recruitment-flow/send-survey.png and b/content/applications/hr/recruitment/recruitment-flow/send-survey.png differ diff --git a/content/applications/hr/recruitment/recruitment-flow/stage-change.png b/content/applications/hr/recruitment/recruitment-flow/stage-change.png index 3f7e1462a6..32ce7b2582 100644 Binary files a/content/applications/hr/recruitment/recruitment-flow/stage-change.png and b/content/applications/hr/recruitment/recruitment-flow/stage-change.png differ diff --git a/content/applications/hr/recruitment/recruitment_analysis.rst b/content/applications/hr/recruitment/recruitment_analysis.rst deleted file mode 100644 index 286dfd262e..0000000000 --- a/content/applications/hr/recruitment/recruitment_analysis.rst +++ /dev/null @@ -1,101 +0,0 @@ -==================== -Recruitment analysis -==================== - -The *Recruitment Analysis* report allows recruiting departments to see which job positions have -the most applicants, which have the most referrals, and how long it takes for applicants to move -through the pipeline. - -Knowing how many applicants each specific job position has, along with statistics about how many are -hired and refused, can provide valuable insights. This information can assist the recruiting team to -pivot their strategies to acquire the most desirable candidates. - -Recruitment analysis report -=========================== - -Start by navigating to :menuselection:`Recruitment app --> Reporting --> Recruitment Analysis`. -This presents a line chart of all applicants for the last year. - -Three separate color-coded metrics are presented: :guilabel:`In Progress`, :guilabel:`Hired`, and -:guilabel:`Refused`. - -Hover the cursor over a month of the chart, and a pop-up window appears, displaying the specific -numbers for that month. - -.. image:: recruitment_analysis/line-chart.png - :align: center - :alt: The default Recruitment Analysis report. - -Pivot table view ----------------- - -For a more detailed view of the information in the :guilabel:`Recruitment Analysis` report, click -the :icon:`oi-view-pivot` :guilabel:`(Pivot)` icon in the top-right corner. This displays all the -information in a pivot table. - -In this view, the job positions are displayed in the rows, and the columns display the total numbers -of applicants, including how many of those applicants were hired or refused. The displayed -information can be modified, if desired. - -In this example, there are 17 total applicants. Out of that, three have been hired, and four -refused. The :guilabel:`Experienced Developer` position has eight total applicants, two of which -were hired, and two were refused. - -.. image:: recruitment_analysis/pivot-view.png - :align: center - :alt: The detailed pivot table view. - -Use case: applicants with referrals -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To get a better understanding of how effective the company's :doc:`referral program <../referrals>` -is, the :guilabel:`Recruitment Analysis` report can be modified to show how many applicants were -referred by current employees. - -From the :icon:`oi-view-pivot` :guilabel:`(Pivot)` view of the :guilabel:`Recruitment Analysis` -report, first click the :guilabel:`Measures` button to reveal a drop-down menu of options. - -Click both :guilabel:`Has Referrer` and :guilabel:`Count`, to activate those two measures. Then, -click :guilabel:`# Applicant`, :guilabel:`# Hired`, and :guilabel:`# Refused` to deactivate those -default measures. - -Now, the column displays the number of applicants that came from a referral in the :guilabel:`Has -Referrer` column, and the total number of applicants in the :guilabel:`Count` column. - -.. image:: recruitment_analysis/referral.png - :align: center - :alt: The detailed pivot table view displaying the number of referrals and the total applicants. - -In this example, the :guilabel:`Experienced Developer` job position has the most applicants from -referrals. Out of the eight applicants, six have applied through a referral from a current employee. -Meanwhile, the :guilabel:`Marketing and Community Manager` job position has the least amount of -referrals out of the total applicants, only one out of six. - -Hired through referrals -*********************** - -It is possible to modify this report even further to see how many referred applicants end up being -hired. - -To view this data, click on a :icon:`fa-plus-square` :guilabel:`[job position]` row, which reveals a -drop-down menu. Then, click :guilabel:`State` to show the various states applicants are currently -in. - -.. note:: - Only states that have applicants in them are shown for each job position. If a state does **not** - have any applicants, it does not appear in the list. - -To expand the other rows, and display the various states, click on the :icon:`fa-plus-square` -:guilabel:`[job position]` button. - -.. image:: recruitment_analysis/state.png - :align: center - :alt: The detailed pivot table view displaying applicants hired through referrals. - -In this example, the :guilabel:`Experienced Developer` job position is the most successful in terms -of referrals. Both of the hired employees came from internal referrals. Meanwhile, there have been -no hired employees for the :guilabel:`Chief Executive Officer` position, and the only hired employee -for the :guilabel:`Marketing and Community Manager` was not referred by an employee. - -In this scenario, it is possible to determine that the current software developers are providing the -most referrals, with the highest success rate. diff --git a/content/applications/hr/recruitment/recruitment_analysis/line-chart.png b/content/applications/hr/recruitment/recruitment_analysis/line-chart.png deleted file mode 100644 index 9fc43e9b2a..0000000000 Binary files a/content/applications/hr/recruitment/recruitment_analysis/line-chart.png and /dev/null differ diff --git a/content/applications/hr/recruitment/recruitment_analysis/pivot-view.png b/content/applications/hr/recruitment/recruitment_analysis/pivot-view.png deleted file mode 100644 index 5d9f65f67a..0000000000 Binary files a/content/applications/hr/recruitment/recruitment_analysis/pivot-view.png and /dev/null differ diff --git a/content/applications/hr/recruitment/recruitment_analysis/referral.png b/content/applications/hr/recruitment/recruitment_analysis/referral.png deleted file mode 100644 index 6ac01d7f31..0000000000 Binary files a/content/applications/hr/recruitment/recruitment_analysis/referral.png and /dev/null differ diff --git a/content/applications/hr/recruitment/recruitment_analysis/state.png b/content/applications/hr/recruitment/recruitment_analysis/state.png deleted file mode 100644 index 56eac63b43..0000000000 Binary files a/content/applications/hr/recruitment/recruitment_analysis/state.png and /dev/null differ diff --git a/content/applications/hr/recruitment/refuse_applicant.rst b/content/applications/hr/recruitment/refuse_applicant.rst index 00577ce485..48b0f3366e 100644 --- a/content/applications/hr/recruitment/refuse_applicant.rst +++ b/content/applications/hr/recruitment/refuse_applicant.rst @@ -4,13 +4,13 @@ Refuse applicants At any point in the recruitment process, an applicant can be refused for a job position. -To refuse an applicant, start by navigating to the applicant's card in the *Recruitment* app. This +To refuse an applicant, start by navigating to the applicant's card in the **Recruitment** app. This is done in one of two ways: - Navigate to :menuselection:`Recruitment app --> Applications --> All Applications`. In the :guilabel:`Applications` list, click anywhere on the desired applicant's line to open that specific applicant's card. -- Navigate to the main *ob Positions* dashboard by navigating to :menuselection:`Recruitment app +- Navigate to the main *Job Positions* dashboard by navigating to :menuselection:`Recruitment app --> Applications --> By Job Position`. Next, click on the desired job position card, then click on the individual applicant card from the :guilabel:`Applications` page. @@ -37,15 +37,13 @@ The default refuse reasons in Odoo, and their corresponding email templates, are * - Email Template - Refusal Reason * - :guilabel:`Recruitment: Refuse` - - | :guilabel:`Doesn't fit the job requirements` - | :guilabel:`Language issues` - | :guilabel:`Role already fulfilled` + - | :guilabel:`Does not fit the job requirements` + | :guilabel:`Job already fulfilled` | :guilabel:`Duplicate` | :guilabel:`Spam` * - :guilabel:`Recruitment: Not interested anymore` - - | :guilabel:`Refused by Applicant: don't like job` - | :guilabel:`Refused by Applicant: better offer` - | :guilabel:`Refused by Applicant: salary` + - | :guilabel:`Refused by applicant: job fit` + | :guilabel:`Refused by applicant: salary` Additional refusal reasons :ref:`can be created, and existing ones can be modified (or deleted) `. @@ -58,8 +56,8 @@ Create or modify refuse reasons ------------------------------- To view and configure refuse reasons, navigate to :menuselection:`Recruitment app --> Configuration ---> Applications: Refuse Reasons`. Doing so reveals the :guilabel:`Refuse Reasons` page, where all -the existing refuse reasons are listed. +--> Refuse Reasons`. Doing so reveals the :guilabel:`Refuse Reasons` page, where all the existing +refusal reasons are listed. To create a new refuse reason from the :guilabel:`Refuse Reasons` page, click the :guilabel:`New` button in the top-left corner. A blank line appears at the bottom of the list, with an empty field @@ -68,8 +66,8 @@ present in the :guilabel:`Description` column. Type in the new refuse reason in the field. It is recommended to enter a reason that is short and concise, such as `Offer expired` or `Withdrew application`. -Then, in the :guilabel:`Email Template` field, click on the field to reveal a drop-down menu. -Select an :guilabel:`Email Template` from the list to be used when this refuse reason is selected. +Then, in the :guilabel:`Email Template` field, click on the field to reveal a drop-down menu. Select +an :guilabel:`Email Template` from the list to be used when this refuse reason is selected. If a new :guilabel:`Email Template` is desired, type in the name for the new template in the field. Then, click :guilabel:`Create and edit...`, and a :guilabel:`Create Email Template` form pop-up @@ -101,12 +99,11 @@ Send refusal email ================== After clicking the :guilabel:`Refuse` button on an applicant form, a :ref:`Refuse Reason -` can be selected from the :guilabel:`refuse reason` pop-up window. +` is then selected from the :guilabel:`Refuse Reason` pop-up window. Then, two fields appear below the selected refusal reason: :guilabel:`Send Email` and :guilabel:`Email Template`. .. image:: refuse_applicant/refuse-pop-up.png - :align: center :alt: The Refuse Reason pop-up window that appears when refusing an applicant. The applicant's email address automatically populates the :guilabel:`Send Email` field; additional @@ -124,7 +121,6 @@ refusal email is sent to the applicant, and a red :guilabel:`Refused` banner app applicant's card in the top-right corner. .. image:: refuse_applicant/refuse.png - :align: center :alt: An applicant's card with the refused banner appearing in the top-right corner in red. View refused applicants @@ -134,11 +130,14 @@ After refusal, the applicant's card is no longer visible in the job position's K it is still possible to view applicants who have been refused. To view only the refused applicants, go to :menuselection:`Recruitment app --> Applications --> By -Job Positions`, or :menuselection:`Recruitment app --> Applications --> All Applications`. - -On the :guilabel:`Applications` page, click the :icon:`fa-caret-down` :guilabel:`(caret down)` -button in the :guilabel:`Search...` bar, then click :guilabel:`Refused`, located under the -:guilabel:`Filters` section. +Job Positions`, or :menuselection:`Recruitment app --> Applications --> All Applications`. Both +methods navigate to the :guilabel:`Applications` dashboard, the only difference is :guilabel:`By Job +Positions` displays applicants in a Kanban view, while :guilabel:`All Applications` displays +applicants in a list view. + +On the :guilabel:`Applications` page, click the :icon:`fa-caret-down` :guilabel:`(Toggle Search +Panel)` button in the search bar, then click :guilabel:`Refused`, located under the +:icon:`fa-funnel` :guilabel:`Filters` section. All applicants that have been refused for the job position appear on the :guilabel:`Applications` page for that position, organized by the stage they were in when they were refused. diff --git a/content/applications/hr/recruitment/refuse_applicant/refuse-pop-up.png b/content/applications/hr/recruitment/refuse_applicant/refuse-pop-up.png index ee65b94e20..b8c68c4ee5 100644 Binary files a/content/applications/hr/recruitment/refuse_applicant/refuse-pop-up.png and b/content/applications/hr/recruitment/refuse_applicant/refuse-pop-up.png differ diff --git a/content/applications/hr/recruitment/refuse_applicant/refuse.png b/content/applications/hr/recruitment/refuse_applicant/refuse.png index 9194f3fd4c..75a9aee81e 100644 Binary files a/content/applications/hr/recruitment/refuse_applicant/refuse.png and b/content/applications/hr/recruitment/refuse_applicant/refuse.png differ diff --git a/content/applications/hr/recruitment/schedule_interviews.rst b/content/applications/hr/recruitment/schedule_interviews.rst index d4e3dabf1f..fafa9b2e73 100644 --- a/content/applications/hr/recruitment/schedule_interviews.rst +++ b/content/applications/hr/recruitment/schedule_interviews.rst @@ -2,12 +2,14 @@ Schedule interviews =================== -Schedule in-person, virtual, and phone interviews with Odoo through the *Recruitment* app. - -An interview can be scheduled in one of two ways: either by the :ref:`recruitment team +An in-person, virtual, or phone interview can be scheduled in one of two ways through the +**Recruitment** app, either by the :ref:`recruitment team `, or by the :ref:`applicant `. +With one drag-and-drop, Odoo emails the candidate with a self-service link, the candidate books the +time slot, and sends the meeting to everyone's calendar. No more back-and-forth emails or calls. + .. _recruitment/schedule_interviews/recruitment-scheduled: Recruitment team scheduled interviews @@ -21,27 +23,26 @@ To schedule the interview, navigate to the applicant's card, by first going to t :guilabel:`Applications` page for that job position. Then, click the desired applicant's card to view their detailed applicant form. -To schedule an phone, virtual, or in-person interview, click the :guilabel:`No Meeting` smart button -at the top of the applicant's record. +To schedule an phone, virtual, or in-person interview, click the :icon:`fa-calendar` :guilabel:`No +Meeting` smart button at the top of the applicant's record. .. note:: - The *Meetings* smart button displays :guilabel:`No Meeting` if no meetings are currently - scheduled. For applicants who are new to the :guilabel:`First Interview` stage, this is the - default. + The :guilabel:`Meetings` smart button displays :icon:`fa-calendar` :guilabel:`No Meeting` if no + meetings are currently scheduled. For applicants who are new to the :guilabel:`First Interview` + stage, this is the default. - If there is one meeting already scheduled, the smart button displays *1 Meeting*, with the date - of the upcoming meeting beneath it. If more than one meeting is scheduled, the button displays - *Next Meeting*, with the date of the first upcoming meeting beneath it. + If there is one meeting already scheduled, the smart button displays :guilabel:`1 Meeting`, with + the date of the upcoming meeting beneath it. If more than one meeting is scheduled, the button + displays :guilabel:`Next Meeting`, with the date of the first upcoming meeting beneath it. -Clicking the *Meetings* smart button loads a calendar, showing the scheduled meetings and events -for the currently signed-in user, as well as the employees who are listed under the +Clicking the :guilabel:`Meetings` smart button loads a calendar, showing the scheduled meetings and +events for the currently signed-in user, as well as the employees who are listed under the :guilabel:`Attendees` section, located to the right of the calendar. To change the currently loaded meetings and events being displayed, uncheck an attendee whose calendar events are to be hidden. Only the checked attendees are visible on the calendar. .. image:: schedule_interviews/calendar.png - :align: center :alt: The calendar view, highlighting how to change the displayed meetings. To add a meeting to the calendar when in the *Day* or *Week* view, click on the start time of the @@ -70,19 +71,22 @@ interview. After entering in a required name for the meeting, the fields available to modify on the :guilabel:`New Event` card are as follows: -- :guilabel:`Meeting Title`: enter the subject for the meeting. This should clearly indicate the - purpose of the meeting. The default subject is the :guilabel:`Subject/Application Name` on the +- :guilabel:`Meeting Title`: Enter the subject for the meeting. This should clearly indicate the + purpose of the meeting. The default subject is the :guilabel:`Candidate` name entered on the applicant's card. -- :guilabel:`Start`: start and end date and times for the meeting. Clicking either of these fields - opens a calendar pop-up window. Click :guilabel:`Apply` to close the window. -- :guilabel:`All Day`: tick the box to schedule an all-day interview. If this box is ticked, the +- :guilabel:`Start`: Configure the start and end date and times for the meeting. Clicking either of + these fields opens a calendar pop-up window. Click on the desired date to select it, and then + enter the time in the corresponding field. Click :icon:`fa-check` :guilabel:`Apply` to close the + window. +- :guilabel:`All Day`: Tick the box to schedule an all-day interview. If this box is ticked, the :guilabel:`Start` field changes to :guilabel:`Start Date`. -- :guilabel:`Attendees`: select the people who should attend the meeting. The default employee - listed is the person who created the meeting. Add as many other people as desired. -- :guilabel:`Videocall URL`: if the meeting is virtual, or if there is a virtual option available, +- :guilabel:`Attendees`: Select the people who should attend the meeting. The default attendees are + the prospective candidate, and the assigned recruiter for the job position. Add as many other + people as desired. +- :guilabel:`Videocall URL`: If the meeting is virtual, or if there is a virtual option available, click :icon:`fa-plus` :guilabel:`Odoo meeting`, and a URL is automatically created for the meeting, which populates the field. -- :guilabel:`Description`: enter a brief description in this field. There is an option to enter +- :guilabel:`Description`: Enter a brief description in this field. There is an option to enter formatted text, such as numbered lists, headings, tables, links, photos, and more. Use the powerbox feature, by typing a `/` to reveal a list of options. @@ -119,19 +123,15 @@ window. Enter any of the following additional fields: `15` to set the meeting to occur on the fifteenth of every month). - :guilabel:`Until`: using the drop-down menu, select when the meetings stop repeating. The available options are :guilabel:`Number of repetitions`, :guilabel:`End date`, and - :guilabel:`Forever`. If :guilabel:`Number of repetitions` is selected, enter the number of - total meetings to occur in the blank field to the right. If :guilabel:`End date` is selected, - specify the date using the calendar pop-up window, or type in a date in a XX/XX/XXXX format. + :guilabel:`Forever`. If :guilabel:`Number of repetitions` is selected, enter the number of total + meetings to occur in the blank field to the right. If :guilabel:`End date` is selected, specify + the date using the calendar pop-up window, or type in a date in a MM/DD/YYYY format. :guilabel:`Forever` schedules meetings indefinitely. - :guilabel:`Location`: enter the location for the meeting. - :guilabel:`Tags`: select any tags for the meeting using the drop-down menu, or add a new tag by typing in the tag and clicking :guilabel:`Create "tag"`. There is no limit to the number of tags that can be used. -- :guilabel:`Appointment`: if an appointment is associated with this meeting, select it from the - drop-down menu, or create a new appointment by typing in the appointment name, then clicking - :guilabel:`Create & Edit...` from the resulting drop-down men. A :guilabel:`Create Appointment` - form loads. Enter the information on the form, then click :guilabel:`Save & Close`. - :guilabel:`Privacy`: select if the organizer appears either :guilabel:`Available` or :guilabel:`Busy` for the duration of the meeting. Next, select the visibility of this meeting, using the drop-down menu to the right of the first selection. Options are :guilabel:`Public`, @@ -148,7 +148,6 @@ window. Enter any of the following additional fields: reminders can be selected in this field. .. image:: schedule_interviews/new-event.png - :align: center :alt: A new meeting card with all the details populated, and ready to save. Send meeting to attendees @@ -159,25 +158,21 @@ pop-up window, and the meeting details are correct, the meeting can be sent to t email or text message, from the expanded event form (what is seen when the :guilabel:`More Options` button is clicked on in the :guilabel:`New Event` pop-up window). -To send the meeting via email, click the :icon:`fa-envelope` :guilabel:`Email` button next to the +To send the meeting via email, click the :icon:`fa-envelope` :guilabel:`EMAIL` button next to the :guilabel:`Attendees` field on the expanded meeting form. A :guilabel:`Contact Attendees` email configurator pop-up window appears. A pre-formatted email, using the default :guilabel:`Calendar: Event Update` email template, populates the email body field. -The followers of the job application, as well as the user who created the meeting, are added as -:guilabel:`Recipients` by default. If needed, add the applicant's email address to the list to send -the email to the applicant, as well. Make any other desired changes to the email. If an attachment -is needed, click the :guilabel:`Attachments` button, navigate to the file, then click -:guilabel:`Open`. Once the email is ready to be sent, click :guilabel:`Send`. +The applicant, followers of the job application, as well as the user who created the meeting, are +added to the :guilabel:`To` by default. Make any desired changes to the email. .. image:: schedule_interviews/email-event.png - :align: center :alt: Enter the information to send the event via email. -To send the meeting via text message, click the :icon:`fa-mobile` :guilabel:`SMS` button next to -the :guilabel:`Attendees` field on the expanded meeting form. A :guilabel:`Send SMS Text Message` -pop-up window appears. +To send the meeting via text message, click the :icon:`fa-mobile` :guilabel:`SMS` button next to the +:guilabel:`Attendees` field on the expanded meeting form. A :guilabel:`Send SMS` pop-up window +appears. At the top, a blue banner appears if any attendees do not have valid mobile numbers, and lists how many records are invalid. If a contact does not have a valid mobile number listed, click @@ -188,12 +183,11 @@ When no warning message appears, type in the message to be sent to the attendees :guilabel:`(smile add)` icon on the right-side of the pop-up window. The number of characters, and amount of text messages required to send the message (according to -GSM7 criteria) appears beneath the :guilabel:`Message` field. Click :guilabel:`Put In Queue` to have +GSM7 criteria) appears beneath the :guilabel:`Message` field. Click :guilabel:`Put in queue` to have the text sent later, after any other messages are scheduled, or click :guilabel:`Send Now` to send the message immediately. .. image:: schedule_interviews/send-sms.png - :align: center :alt: Send a text message to the attendees of the meeting. .. note:: @@ -206,64 +200,39 @@ the message immediately. Applicant scheduled interviews ============================== -By default, the recruitment interview stages are **not** set up for applicants to schedule their own -interviews. +Coordinating interview times typically requires several email exchanges and can slow the recruitment +process. Enabling Odoo's self-service scheduling removes that bottleneck: when an applicant is moved +to an interview stage, the system automatically sends a scheduling link, records the selected slot, +and updates all relevant calendars. -However, if the :guilabel:`First Interview` or :guilabel:`Second Interview` stages are modified to -send the :guilabel:`Recruitment: Schedule Interview` email template when an applicant reaches that -stage, the applicant receives a link to the recruitment team's calendar, and can schedule the -interview on their own. The recruitment team's availability is reflected in the calendar. - -In order for applicants to be able to schedule their own interviews, a :ref:`stage must first be -modified ` in the *Recruitment* app. +This automation is turned off by default. To activate it, assign the :guilabel:`Recruitment: +Schedule Interview` email template to either the :guilabel:`First Interview` or :guilabel:`Second +Interview` stage (see :ref:`recruitment/schedule_interviews/modify-stage`). .. _recruitment/schedule_interviews/modify-stage: Modify stage ------------ -To modify either the :guilabel:`First Interview` or :guilabel:`Second Interview` stage, first -navigate to the main :menuselection:`Recruitment` app dashboard. Next, click on the desired job card -to navigate to the :guilabel:`Applications` page for that job position. - -Hover over the name of the stage, and a :icon:`fa-cog` :guilabel:`(gear)` icon appears in the -upper-right hand side of the stage name. Click the :icon:`fa-cog` :guilabel:`(gear)` icon, and a -drop-down menu appears. Then, click on the :guilabel:`Edit` option, and an :guilabel:`Edit: (Stage)` -form appears. - -.. image:: schedule_interviews/edit-stage.png - :align: center - :alt: The drop-down that appears after clicking the cog. - -The :guilabel:`Email Template` field is blank, by default. Using the drop-down menu, select -:guilabel:`Recruitment: Schedule interview` for the :guilabel:`Email Template` field, then click -:guilabel:`Save & Close` when done. +:ref:`Modify ` either the :guilabel:`First Interview` or +:guilabel:`Second Interview` stage so the stage's :guilabel:`Email Template` field is set to +:guilabel:`Recruitment: Schedule interview`. .. image:: schedule_interviews/interview-template.png - :align: center :alt: The Recruitment: Schedule Interview email template populating the Email Template field. Send email ---------- -After either the :guilabel:`First Interview` or :guilabel:`Second Interview` stages are -:ref:`modified to send the ` :guilabel:`Recruitment: -Schedule interview` email to the applicant upon moving their applicant card to one of those stages, -the following email is received by the applicant: - -`Subject: Can we plan an interview together for your (Job Position) application?` +After configuring the :guilabel:`First Interview` or :guilabel:`Second Interview` stages to +:ref:`send emails `, drag-and-drop the applicant card +into one of these stages to send the email. -`Congratulations! -Your application is really interesting and we'd like to plan an interview with you. -Can you please use the button below to schedule it with one of our recruiters?` +Self-scheduled interview +------------------------ -`Plan my interview` - -Schedule interview ------------------- - -When the applicant received the email, they click the :guilabel:`Plan my interview` button at the -bottom of the email. This navigates the applicant to a private online scheduling page, which is +When the applicant received the email, they click the :guilabel:`Schedule my interview` button at +the bottom of the email. This navigates the applicant to a private online scheduling page, which is **only** accessible through the emailed link. This page displays the :guilabel:`MEETING DETAILS` on the right side of the screen. This includes @@ -271,31 +240,10 @@ the format and length of the meeting. In this example. the interview is virtual (:icon:`fa-video-camera` :guilabel:`Online`) and the duration is a half hour (:icon:`fa-clock-o` :guilabel:`30 minutes`). -First, if there is an option of who to meet with, the user selects who they are scheduling their -meeting with, by clicking on their icon and name. If only one person is available to interview the -applicant, this step is not available. If the applicant does not wish to chose an interviewer, they -can just click :guilabel:`See all availabilities` :icon:`fa-arrow-right`. - -.. image:: schedule_interviews/select-interviewer.png - :align: center - :alt: The first screen seen after clicking 'Plan my interview', where the applicant selects their - interviewer. - -.. note:: - If the applicant selects an interviewer, the applicant is shown a :guilabel:`Select a date & - time` page, and **only** sees the dates and times that specific person is available. In addition, - that interviewer's information (name, email, and phone number) appears on the right-side of the - screen, under the heading :guilabel:`OPERATOR`, located beneath the :guilabel:`MEETING DETAILS`. - - If the applicant clicks :guilabel:`See all availabilities` :icon:`fa-arrow-right` instead, or if - there are no interviewer options available, the user is navigated to the same :guilabel:`Select a - date & time` page, but there is no :guilabel:`OPERATOR` section visible. - -Then the applicant clicks on an available day on the calendar, signified by a square around the -date. Once a day is selected, they click on one of the available times to select that date and time. +Then the applicant clicks on an available day on the calendar, signified by purple text. Once a day +is selected, they click on one of the available times to select that date and time. .. image:: schedule_interviews/select-date-time.png - :align: center :alt: The calendar screen with dates and times to schedule an interview. .. tip:: @@ -311,7 +259,6 @@ When everything is entered on the :guilabel:`Add more details about you` page, t the :guilabel:`Confirm Appointment` button, and the interview is scheduled. .. image:: schedule_interviews/confirmation.png - :align: center :alt: The confirmation page with all the details for the interview displayed. After confirming the interview, the applicant is taken to a confirmation page, where all the details @@ -320,4 +267,4 @@ is available, through the :guilabel:`Add to iCal/Outlook` and :guilabel:`Add to buttons, beneath the interview details. The applicant is also able to cancel or reschedule the interview, if necessary, with the -:guilabel:`Cancel/Reschedule` button. +:guilabel:`Cancel your appointment` link at the bottom of the confirmation. diff --git a/content/applications/hr/recruitment/schedule_interviews/calendar.png b/content/applications/hr/recruitment/schedule_interviews/calendar.png index 1f3c0f44fd..d2aa65f07c 100644 Binary files a/content/applications/hr/recruitment/schedule_interviews/calendar.png and b/content/applications/hr/recruitment/schedule_interviews/calendar.png differ diff --git a/content/applications/hr/recruitment/schedule_interviews/confirmation.png b/content/applications/hr/recruitment/schedule_interviews/confirmation.png index d2b06695bb..537e2c0006 100644 Binary files a/content/applications/hr/recruitment/schedule_interviews/confirmation.png and b/content/applications/hr/recruitment/schedule_interviews/confirmation.png differ diff --git a/content/applications/hr/recruitment/schedule_interviews/edit-stage.png b/content/applications/hr/recruitment/schedule_interviews/edit-stage.png deleted file mode 100644 index 524397f34d..0000000000 Binary files a/content/applications/hr/recruitment/schedule_interviews/edit-stage.png and /dev/null differ diff --git a/content/applications/hr/recruitment/schedule_interviews/email-event.png b/content/applications/hr/recruitment/schedule_interviews/email-event.png index 1eb70b43a0..8c49545939 100644 Binary files a/content/applications/hr/recruitment/schedule_interviews/email-event.png and b/content/applications/hr/recruitment/schedule_interviews/email-event.png differ diff --git a/content/applications/hr/recruitment/schedule_interviews/interview-template.png b/content/applications/hr/recruitment/schedule_interviews/interview-template.png index 04653f20be..b8f77ed072 100644 Binary files a/content/applications/hr/recruitment/schedule_interviews/interview-template.png and b/content/applications/hr/recruitment/schedule_interviews/interview-template.png differ diff --git a/content/applications/hr/recruitment/schedule_interviews/new-event.png b/content/applications/hr/recruitment/schedule_interviews/new-event.png index a5edc34a22..7885056a8c 100644 Binary files a/content/applications/hr/recruitment/schedule_interviews/new-event.png and b/content/applications/hr/recruitment/schedule_interviews/new-event.png differ diff --git a/content/applications/hr/recruitment/schedule_interviews/select-date-time.png b/content/applications/hr/recruitment/schedule_interviews/select-date-time.png index 0528ebcc20..f7943847e4 100644 Binary files a/content/applications/hr/recruitment/schedule_interviews/select-date-time.png and b/content/applications/hr/recruitment/schedule_interviews/select-date-time.png differ diff --git a/content/applications/hr/recruitment/schedule_interviews/select-interviewer.png b/content/applications/hr/recruitment/schedule_interviews/select-interviewer.png deleted file mode 100644 index cd003f7100..0000000000 Binary files a/content/applications/hr/recruitment/schedule_interviews/select-interviewer.png and /dev/null differ diff --git a/content/applications/hr/recruitment/schedule_interviews/send-sms.png b/content/applications/hr/recruitment/schedule_interviews/send-sms.png index 8797f677f5..31c2d4b7b2 100644 Binary files a/content/applications/hr/recruitment/schedule_interviews/send-sms.png and b/content/applications/hr/recruitment/schedule_interviews/send-sms.png differ diff --git a/content/applications/hr/recruitment/send-survey.png b/content/applications/hr/recruitment/send-survey.png index d78efc02ef..ddaabf2648 100644 Binary files a/content/applications/hr/recruitment/send-survey.png and b/content/applications/hr/recruitment/send-survey.png differ diff --git a/content/applications/hr/recruitment/source_analysis.rst b/content/applications/hr/recruitment/source_analysis.rst index 551c0310a1..ee252c5593 100644 --- a/content/applications/hr/recruitment/source_analysis.rst +++ b/content/applications/hr/recruitment/source_analysis.rst @@ -23,13 +23,8 @@ This presents the data for the :icon:`fa-filter` :guilabel:`Last 365 Days Applic Hover the cursor over any column to view the specific numbers fort that column. .. image:: source_analysis/source-analysis.png - :align: center :alt: The default bar chart of the source analysis information. -To view more details, view the :guilabel:`Source Analysis` report in a pivot table. To do so, click -the :icon:`oi-view-pivot` :guilabel:`(Pivot)` icon in the top-right corner. The data is presented in -a pivot table, with rows populated by job positions, and columns populated stages. - Source effectiveness report =========================== @@ -37,12 +32,16 @@ To identify which sources (e.g., job boards, social media, employee referrals, c produce the most hires, the pivot table view of the :guilabel:`Source Analysis` report can be configured to display further details. +To view the :guilabel:`Source Analysis` report in a pivot table, click the :icon:`oi-view-pivot` +:guilabel:`(Pivot)` icon in the top-right corner. The data is presented in a pivot table, with rows +populated by job positions, and columns populated by stages. + To expand this chart to show what specific sources the applicants came from, click the :icon:`fa-plus-square` :guilabel:`Total` box above the columns, to reveal a drop-down menu, and click :guilabel:`Source`. Each column is then grouped by the source, such as: :guilabel:`Search engine`, :guilabel:`Facebook`, -:guilabel:`Newsletter`, etc. Each source displays a separate count for :guilabel:`Applicant`, +:guilabel:`LinkedIn`, etc. Each source displays a separate count for :guilabel:`Applicant`, :guilabel:`Hired`, and :guilabel:`Refused`. This information, as presented, makes it difficult to view the specific numbers for each source. @@ -50,7 +49,6 @@ Click the :icon:`fa-exchange` :guilabel:`(Flip axis)` icon, to swap the informat rows represent the source, and the columns represent the job positions, further divided by stage. .. image:: source_analysis/source-pivot.png - :align: center :alt: The axes flipped in the source analysis report, in pivot table view. In this view, the total number of applicants, hired employees, and refused applicants, are displayed @@ -73,7 +71,6 @@ Once :guilabel:`Medium` is selected for one source, clicking into another row au the specific metrics for the mediums for that source. .. image:: source_analysis/medium.png - :align: center :alt: The sources rows, expanded to also show the medium for each source. .. note:: diff --git a/content/applications/hr/recruitment/source_analysis/source-analysis.png b/content/applications/hr/recruitment/source_analysis/source-analysis.png index 1fe4e6d0c5..769a8b3e99 100644 Binary files a/content/applications/hr/recruitment/source_analysis/source-analysis.png and b/content/applications/hr/recruitment/source_analysis/source-analysis.png differ diff --git a/content/applications/hr/recruitment/stages.png b/content/applications/hr/recruitment/stages.png index d4a28d50f3..da3ec7ecfa 100644 Binary files a/content/applications/hr/recruitment/stages.png and b/content/applications/hr/recruitment/stages.png differ diff --git a/content/applications/hr/recruitment/status-dots.png b/content/applications/hr/recruitment/status-dots.png index 9b9e457c2f..d585da2958 100644 Binary files a/content/applications/hr/recruitment/status-dots.png and b/content/applications/hr/recruitment/status-dots.png differ diff --git a/content/applications/hr/recruitment/team_performance.rst b/content/applications/hr/recruitment/team_performance.rst index 22ae69bb6e..2a65dd604e 100644 --- a/content/applications/hr/recruitment/team_performance.rst +++ b/content/applications/hr/recruitment/team_performance.rst @@ -1,6 +1,6 @@ -========================== -Team performance reporting -========================== +================ +Team performance +================ The *Team Performance* report in the **Recruitment** app shows how many applicants each recruiter is managing. @@ -15,7 +15,7 @@ To access the *Team Performance* report, navigate to :menuselection:`Recruitment --> Team Performance`. The number of :guilabel:`In Progress`, :guilabel:`Hired`, and :guilabel:`Refused` applicants for -each recruiter is displayed in the :icon:`fa-area-chart` :guilabel:`(Graph)` view. +each recruiter is displayed in a default :icon:`fa-area-chart` :guilabel:`(Graph)` view. The information shown is for the :icon:`fa-filter` :guilabel:`Last 365 Days Applicant` default filter, as displayed in the search bar. @@ -24,7 +24,6 @@ Hover the cursor over any column to view a popover window, displaying the specif column. .. image:: team_performance/team-performance.png - :align: center :alt: The default bar chart of the team performance report. Pivot table view @@ -34,24 +33,24 @@ For a more detailed view of the information in the :guilabel:`Team Performance` :icon:`oi-view-pivot` :guilabel:`(Pivot)` icon in the top-right corner. This displays all the information in a pivot table. -In this view, the job positions are displayed in the rows, while the columns display the total -number of applicants. The applicants are further organized by :guilabel:`# Applicant` (in process), -:guilabel:`# Hired`, and :guilabel:`# Refused`. +In this view, the job positions populate the rows, while the columns populate the number of +applicants. The first column, :guilabel:`Applicant`, is the total number of applicants across all +stages for that job position. The subsequent columns display the total applicants that have been +:guilabel:`Hired`, :guilabel:`Refused`, and :guilabel:`In Progress` for each job position. The displayed information can be modified, if desired. -In this example, there are 19 total applicants. Out of those 19, eight have been hired, and three -refused. +In this example, there are 20 total applicants. Out of those 20, eight have been hired, five have +been refused, and seven are still in the recruitment process. From the data presented, the :guilabel:`Experienced Developer` job position is the most successful. -This job position has the highest number of total applicants, as well as the most hires. In -addition, the :guilabel:`Experienced Developer` has the least amount of refused applicants. +This job position has one of the highest number of total applicants (tied with the +:guilabel:`Marketing and Community Manager` position), as well as the most hires. -This pivot table also shows that the :guilabel:`Chief Executive Officer` position is the hardest to -fill, as it has the fewest total applicants. +This pivot table also shows that the :guilabel:`Quality Control Inspector` position is the hardest +to fill, as it has the fewest total applicants. .. image:: team_performance/team-perf-pivot.png - :align: center :alt: The detailed pivot table view. Use case: recruiter performance over time @@ -62,34 +61,31 @@ information, begin with the :guilabel:`Team Performance` report in the :icon:`oi :guilabel:`(Pivot)` view. Next, click the :icon:`fa-caret-down` :guilabel:`(down arrow)` in the search bar, revealing a -drop-down menu. Click :guilabel:`Add Custom Group` :icon:`oi-caret-down` at the bottom of the +drop-down menu. Click :guilabel:`Add Custom Group` :icon:`fa-caret-down` at the bottom of the :icon:`oi-group` :guilabel:`Group By` column, then click :guilabel:`Recruiter`. Click away from the drop-down menu to close it. Now, each row on the table represents a recruiter. .. image:: team_performance/by-recruiter.png - :align: center :alt: The pivot table now displaying the recruiters in the rows. To compare the team's performance over different time periods, click the :icon:`fa-caret-down` -:guilabel:`(down arrow)` in the search bar. Click :guilabel:`Start Date` :icon:`fa-caret-down` in -the :icon:`fa-filter` :guilabel:`Filters` column, revealing various time periods to select. +:guilabel:`(down arrow)` in the search bar. Click :guilabel:`Application Date` :icon:`fa-caret-down` +in the :icon:`fa-filter` :guilabel:`Filters` column, revealing various time periods to select. In this example, the desired data is the comparison between the team's performance in the third quarter (June - August) and the second quarter (April - July). To do so, click :guilabel:`Q3`. Once -clicked, the current year is also ticked. In this example, it is :guilabel:`2024`. +clicked, the current year is also ticked. In this example, it is :guilabel:`2025`. After making this selection, a :icon:`fa-adjust` :guilabel:`Comparison` column appears. Click :guilabel:`Start Date: Previous Period` to compare the third quarter with the second quarter, for the various recruiters. .. image:: team_performance/compare.png - :align: center :alt: A comparison table of recruiter totals of Q2 and Q3. -From this report, several things can be extrapolated: the total number of applicants increased, the -number of hired applicants remained the same, while the number of refused applicants decreased. +From this report, some things can be extrapolated: the total number of applicants, the number of +hired applicants, the number of refused applicants, and the number of applicants still in the +recruitment pipeline all increased. -Additionally, :guilabel:`Jane Jobs` had the highest increase in number of applicants during the -third quarter, but her number of hired applicants went down :guilabel:`67%`. The recruiter with the -best overall numbers was :guilabel:`Rose Recruiter`, who had both their active applicants and hired -applicants, increase in the third quarter, while their refused applicants went down. +Additionally, :guilabel:`Maggie Davidsons` had the highest increase in number of hired applicants +during the third quarter, while their number of refused applicants went down. diff --git a/content/applications/hr/recruitment/team_performance/by-recruiter.png b/content/applications/hr/recruitment/team_performance/by-recruiter.png index b98b8b51fc..c7323a7f0f 100644 Binary files a/content/applications/hr/recruitment/team_performance/by-recruiter.png and b/content/applications/hr/recruitment/team_performance/by-recruiter.png differ diff --git a/content/applications/hr/recruitment/team_performance/compare.png b/content/applications/hr/recruitment/team_performance/compare.png index 2da27a8202..1545a30d0d 100644 Binary files a/content/applications/hr/recruitment/team_performance/compare.png and b/content/applications/hr/recruitment/team_performance/compare.png differ diff --git a/content/applications/hr/recruitment/team_performance/team-perf-pivot.png b/content/applications/hr/recruitment/team_performance/team-perf-pivot.png index da295b01e3..1c6c99cd3d 100644 Binary files a/content/applications/hr/recruitment/team_performance/team-perf-pivot.png and b/content/applications/hr/recruitment/team_performance/team-perf-pivot.png differ diff --git a/content/applications/hr/recruitment/team_performance/team-performance.png b/content/applications/hr/recruitment/team_performance/team-performance.png index 65cc589949..aba08353e5 100644 Binary files a/content/applications/hr/recruitment/team_performance/team-performance.png and b/content/applications/hr/recruitment/team_performance/team-performance.png differ diff --git a/content/applications/hr/recruitment/time_in_stage/bar-chart.png b/content/applications/hr/recruitment/time_in_stage/bar-chart.png deleted file mode 100644 index 3360d02aaa..0000000000 Binary files a/content/applications/hr/recruitment/time_in_stage/bar-chart.png and /dev/null differ diff --git a/content/applications/hr/recruitment/time_in_stage.rst b/content/applications/hr/recruitment/velocity_analysis.rst similarity index 64% rename from content/applications/hr/recruitment/time_in_stage.rst rename to content/applications/hr/recruitment/velocity_analysis.rst index b2b1f9cf02..0b69bf6d4e 100644 --- a/content/applications/hr/recruitment/time_in_stage.rst +++ b/content/applications/hr/recruitment/velocity_analysis.rst @@ -1,21 +1,21 @@ -====================== -Time in stage analysis -====================== +================= +Velocity analysis +================= -The *Time In Stage Analysis* report provides information on how long applicants stay in each stage -of the recruitment process. This is important, as every job position has specific :ref:`process -details ` that state the length of time applicants should expect -to wait between specific stages. +The *Velocity Analysis* report provides information on how long applicants stay in each stage of the +recruitment process. This is important, as every job position has specific :ref:`process details +` that state the length of time applicants should expect to wait +between specific stages. Knowing how long applicants remain in each stage can help highlight possible bottlenecks. Analyzing this data allows the recruitment team to assess each stage, identify any issues, and pivot their strategies to move applicants through each stage, within the expected time interval. -Time in stage analysis report -============================= +Velocity analysis report +======================== -To access the report, navigate to :menuselection:`Recruitment app --> Reporting --> Time in Stage -Analysis`. By default, the report displays data from all job positions, with the stages populating +To access the report, navigate to :menuselection:`Recruitment app --> Reporting --> Velocity +Analysis`. By default, the report displays data for all job positions, with the stages populating the x-axis, and the number of days populating the y-axis, in a :icon:`fa-line-chart` :guilabel:`(Line Chart)`. @@ -25,24 +25,23 @@ days. Hover over a stage in the line chart to reveal a popover window listing all the job positions within it, and the average number of days each job position sits in each stage. -For a more visually digestible view of the information in the :guilabel:`Time In Stage Analysis` -report, click the :icon:`fa-bar-chart` :guilabel:`(Bar Chart)` icon in the upper-left corner. This -displays all the information in a bar chart. +For a more visually digestible view of the information in the :guilabel:`Velocity Analysis` report, +click the :icon:`fa-bar-chart` :guilabel:`(Bar Chart)` icon in the upper-left corner. This displays +all the information in a bar chart. In this view, it is easier to visualize the differences between the job positions, regarding how -long applicants stay in each stage. From this view, recruiters can more easily determine which job -positions have delays or bottlenecks at certain stages. +long applicants stay in each stage. From this view, recruiters can determine which job positions +have delays or bottlenecks at certain stages. -.. image:: time_in_stage/bar-chart.png - :align: center - :alt: The bar chart view of the Time In Stage Analysis report. +.. image:: velocity_analysis/bar-chart.png + :alt: The bar chart view of the Velocity Analysis report. Use case: comparing times by month ---------------------------------- -With the :guilabel:`Time In Stage Analysis` report, it is possible to see if there are certain -months where applicants take longer to be moved through the pipeline. To view this data, switch to -the :icon:`oi-view-pivot` :guilabel:`(Pivot)` view in the upper-right corner. +With the :guilabel:`Velocity Analysis` report, it is possible to see if there are certain months +where applicants take longer to be moved through the pipeline. To view this data, switch to the +:icon:`oi-view-pivot` :guilabel:`(Pivot)` view in the upper-right corner. This presents the data in a detailed pivot table, with the rows representing the different job positions, and the columns representing the stages. The average :guilabel:`Days in Stage` populates @@ -52,9 +51,8 @@ the various boxes. If a field is empty, it indicates no applicant has been in that stage. Instead, all applicants moved from a previous stage without being placed in the stage with an empty field. -.. image:: time_in_stage/time-pivot.png - :align: center - :alt: The pivot table view of the Time In Stage Analysis report. +.. image:: velocity_analysis/time-pivot.png + :alt: The pivot table view of the Velocity Analysis report. Click :icon:`fa-minus-square-o` :guilabel:`Total` above the job position rows to collapse the information. Next, click :icon:`fa-plus-square` :guilabel:`Total` again, revealing a drop-down menu. @@ -64,8 +62,7 @@ further grouping options. Click :guilabel:`Start Date` from the expanded list. After doing so, the data presented is grouped with the various months from the previous 365 days for the rows, leaving the :guilabel:`Days In Stage` as the columns. -.. image:: time_in_stage/time-dates.png - :align: center +.. image:: velocity_analysis/time-dates.png :alt: The pivot table showing the months averages for times in stage. In this example, :guilabel:`July 2024` had the longest time that applicants spent in each stage, on diff --git a/content/applications/hr/recruitment/velocity_analysis/bar-chart.png b/content/applications/hr/recruitment/velocity_analysis/bar-chart.png new file mode 100644 index 0000000000..6c57de9268 Binary files /dev/null and b/content/applications/hr/recruitment/velocity_analysis/bar-chart.png differ diff --git a/content/applications/hr/recruitment/time_in_stage/time-dates.png b/content/applications/hr/recruitment/velocity_analysis/time-dates.png similarity index 100% rename from content/applications/hr/recruitment/time_in_stage/time-dates.png rename to content/applications/hr/recruitment/velocity_analysis/time-dates.png diff --git a/content/applications/hr/recruitment/time_in_stage/time-pivot.png b/content/applications/hr/recruitment/velocity_analysis/time-pivot.png similarity index 100% rename from content/applications/hr/recruitment/time_in_stage/time-pivot.png rename to content/applications/hr/recruitment/velocity_analysis/time-pivot.png diff --git a/content/applications/hr/referrals.rst b/content/applications/hr/referrals.rst index 322bba8b1e..ac5ad5eb38 100644 --- a/content/applications/hr/referrals.rst +++ b/content/applications/hr/referrals.rst @@ -4,22 +4,22 @@ Referrals ========= -Odoo's *Referrals* application is a centralized place where all information regarding referrals is +Odoo's **Referrals** application is a centralized place where all information regarding referrals is housed - from points earned, coworkers hired, and rewards selected. Users can recommend people they know for job positions, and then earn referral points as those people progress through the recruitment pipeline. Once enough referral points are earned, they can be exchanged for prizes. The -*Referrals* application integrates with the *Employees*, *Recruitment*, and *Website* applications, -all of which must be installed in order for the *Referrals* application to function. +**Employees**, **Recruitment**, and **Website** apps must all be installed for the **Referrals** app +to function. -The only configurations needed for the *Referrals* application *after* it has been installed, are -related to the :doc:`rewards `; everything else is pre-configured when Odoo -*Referrals* is installed. +The only configurations needed for the **Referrals** app *after* it has been installed, are related +to the :doc:`rewards `; everything else is preconfigured when Odoo **Referrals** +is installed. Users with either :guilabel:`Referral User`, :guilabel:`Officer`, or :guilabel:`Administrator` -access rights for the *Recruitment* application have access to the *Referrals* application. Only -users with :guilabel:`Administrator` access rights for the *Recruitment* application have access to -the :doc:`reporting ` and configurations menus. For more information on users -and access rights, refer to these documents: :doc:`../general/users` and +access rights for the **Recruitment** app can access the **Referrals** app. Only users with +:guilabel:`Administrator` access rights for the **Recruitment** app have access to the +:doc:`reporting ` and configuration menus. For more information on users and +access rights, refer to these documents: :doc:`../general/users` and :doc:`../general/users/access_rights`. .. _referrals/onboarding: @@ -27,50 +27,48 @@ and access rights, refer to these documents: :doc:`../general/users` and Onboarding ========== -When opening the *Referrals* application for the first time, a pre-configured onboarding script -appears. This is in the form of four slides, each explaining the different parts of the *Referrals* -application. At the top of the dashboard, the following message is displayed throughout all the -onboarding slides: :guilabel:`GATHER YOUR TEAM! Job Referral Program`. Behind this main message is -an image, and beneath it some more explanatory text. +When opening the **Referrals** app for the first time, a preconfigured onboarding script appears. +This script consists of four slides, each explaining the different parts of the **Referrals** app. +At the top of the dashboard, the following message is displayed throughout all the onboarding +slides: :guilabel:`GATHER YOUR TEAM! Job Referral Program`. Behind this main message is an image, +and beneath it some more explanatory text. Each of the onboarding slides has a corresponding image and message that is displayed. After reading -each message, click the :guilabel:`Next` button to advance to the next slide. +each message, click the :guilabel:`Next` :icon:`fa-angle-right` button to advance to the next slide. The text that appears on each slide is as follows: -#. :guilabel:`Oh no! Villains are lurking the city! Help us recruit a team of superheroes to save - the day!` -#. :guilabel:`Browse through open job positions, promote them on social media, or refer friends.` -#. :guilabel:`Collect points and exchange them for awesome gifts in the shop.` -#. :guilabel:`Compete against your colleagues to build the best justice league!` +#. :guilabel:`OH NO! VILLAINS ARE LURKING THE CITY! HELP US RECRUIT A TEAM OF SUPERHEROES TO SAVE + THE DAY!` +#. :guilabel:`BROWSE THROUGH OPEN JOB POSITIONS, PROMOTE THEM ON SOCIAL MEDIA, OR REFER FRIENDS.` +#. :guilabel:`COLLECT POINTS AND EXCHANGE THEM FOR AWESOME GIFTS IN THE SHOP.` +#. :guilabel:`COMPETE AGAINST YOUR COLLEAGUES TO BUILD THE BEST JUSTICE LEAGUE!` .. note:: - The onboarding slides will appear every time the *Referrals* application is opened, until all the + The onboarding slides will appear every time the **Referrals** app is opened, until all the slides have been viewed and the :guilabel:`Start Now` button has been clicked. If the onboarding is exited at any point, or if the :guilabel:`Start Now` button has *not* been clicked, the - onboarding slides will begin again when the *Referrals* application is opened. Once the + onboarding slides will begin again when the **Referrals** app is opened. Once the :guilabel:`Start Now` button has been clicked, the onboarding slides will not be seen again, and - the main dashboard will load when the *Referrals* application is opened from that point on. + the main dashboard will load when the **Referrals** app is opened from that point on. -At any point during onboarding, the :guilabel:`Skip` button may be clicked. This exits the -onboarding, and the main *Referrals* dashboard loads. If :guilabel:`Skip` is clicked, onboarding -slides will not load anymore when opening the *Referrals* application. +At any point during onboarding, click the :guilabel:`Skip` button to open the main **Referrals** +dashboard. .. image:: referrals/onboarding.png - :align: center :alt: An onboarding slide with the skip and next buttons visible at the bottom. .. note:: - If there are any candidates hired that the user had referred prior to opening the Referrals app - (meaning the onboarding slides have not appeared before), when :guilabel:`Start Now` is clicked - at the end of onboarding, instead of going to the main dashboard, a :ref:`hired + If there are any candidates hired that the user had referred prior to opening the **Referrals** + app (meaning the onboarding slides have not appeared before), when :guilabel:`Start Now` is + clicked at the end of onboarding, instead of going to the main dashboard, a :ref:`hired ` screen appears instead. Modifying onboarding slides --------------------------- Onboarding slides can be modified if desired. Only users with :guilabel:`Administrator` rights for -the *Recruitment* application can modify onboarding slides. To edit a slide, navigate to +the **Recruitment** app can modify onboarding slides. To edit a slide, navigate to :menuselection:`Referrals app --> Configuration --> Onboarding.` Each line displays the text for the individual onboarding slide. To edit an onboarding slide, click on an individual slide line to open the slide's onboarding form. @@ -83,22 +81,20 @@ particular company. The :guilabel:`Company` field only appears when in a multi-company database. The image can be modified, as well. Hover over the image thumbnail in the top-right corner of the -form. A :guilabel:`✏️ (pencil)` icon and :guilabel:`🗑️ (garbage can)` icon appear. Click the -:guilabel:`✏️ (pencil)` icon to change the image. A file navigator window loads. Navigate to the -desired image, select it, then click :guilabel:`Open`. The new image appears in the thumbnail. To -delete an image, click the :guilabel:`🗑️ (garbage can)` icon, then select a new image using the -:guilabel:`✏️ (pencil)` icon. +form. An :icon:`fa-pencil` :guilabel:`(Edit)` icon and :icon:`fa-trash-o` :guilabel:`(Clear)` icon +appear. Click the :icon:`fa-pencil` :guilabel:`(Edit)` icon to change the image. A file navigator +window loads. Navigate to the desired image, select it, then click :guilabel:`Open`. The new image +appears in the thumbnail. To delete an image, click the :icon:`fa-trash-o` :guilabel:`(Clear)` icon, +then select a new image using the :icon:`fa-pencil` :guilabel:`(Edit)` icon. .. image:: referrals/edit-onboarding.png - :align: center :alt: An onboarding slide in edit mode, with the main fields highlighted. The sequence in which the slides appear can be changed from the *Onboarding* dashboard. Click the -:guilabel:`(six small gray boxes)` icon to the left of the the slide text, and drag the slide to the -desired position. +:icon:`oi-draggable` :guilabel:`(draggable)` icon to the left of the slide text, and drag the slide +to the desired position. .. image:: referrals/onboarding-reorder.png - :align: center :alt: The onboarding slides in a list, with the drag and drop arrows highlighted. .. _referrals/hired: @@ -106,41 +102,40 @@ desired position. Hired referrals =============== -When a candidate that has been referred by a user is hired, the user "grows their superhero team" -and adds superhero avatars to their Referrals dashboard. +When a candidate referred by a user is hired, the user *"grows their superhero team"* and adds +superhero avatars to their **Referrals** dashboard. -After a referral has been hired, when the user next opens the Referrals app, instead of the main -dashboard, a hired page loads. The text :guilabel:`(Referral Name) has been hired! Choose an avatar +After a referral has been hired, when the user next opens the **Referrals** app, instead of the main +dashboard, a hired page loads. The text :guilabel:`(REFERRAL NAME) HAS BEEN HIRED! Choose an avatar for your new friend!` appears. Below this message are five avatar thumbnails to choose from. If an avatar has already been assigned to a referral, the thumbnail is grayed out, and the name that the avatar has been chosen for appears beneath the avatar. Click on an available avatar to select it. -If more than one referral was hired since opening the *Referrals* application, after selecting the -first avatar, the user is prompted to select another avatar for the subsequent hired referral. Once -all avatars have been selected, the dashboard loads and all the avatars are now visible. Mouse over -each avatar and their name is displayed above them. +If more than one referral was hired since completing onboarding in the **Referrals** app, after +selecting the first avatar, the user is prompted to select another avatar for the subsequent hired +referral. Once all avatars have been selected, the dashboard loads and all the avatars are now +visible. Mouse over each avatar and their name is displayed above them. .. image:: referrals/avatars.png - :align: center - :alt: The hired screen. A selection of avatars are presented to chose from, with any already + :alt: The hired screen. A selection of avatars are presented to choose from, with any already chosen are greyed out. Modify friends -------------- Friend avatars are able to be modified in the same manner that :ref:`levels ` are -modified. Only users with :guilabel:`Administrator` rights for the *Recruitment* application can -make modifications to friends. The pre-configured friends can be seen and modified by navigating to -:menuselection:`Referrals app --> Configuration --> Friends`. Each friend avatar appears in the +modified. Only users with :guilabel:`Administrator` rights for the **Recruitment** app can make +modifications to friends. The preconfigured friends can be seen and modified by navigating to +:menuselection:`Referrals app --> Configuration --> Friends`. Each friend's avatar appears in the :guilabel:`Dashboard Image` column, and the corresponding name appears in the :guilabel:`Friend Name` column. The default images are a motley group of hero characters, ranging from robots to dogs. To modify a friend's dashboard image, thumbnail, name, or position, click on an individual friend to -open the referral friend form. Click :guilabel:`Edit` to make modifications. Type the name in the -:guilabel:`Friend Name` field. The name is solely to differentiate the friends in the configuration -menu; the friend's name is not visible anywhere else in the *Referrals* application. +open the referral friend form. Type the name in the :guilabel:`Friend Name` field. The name is +solely to differentiate the friends in the configuration menu; the friend's name is not visible +anywhere else in the **Referrals** app. The :guilabel:`Position` can be set to either :guilabel:`Front` or :guilabel:`Back`. This determines the position of the friend in relation to the user's super hero avatar. Click the radio button next @@ -148,55 +143,65 @@ to the desired selection, and the friend will appear either in front of or behin when activated. If desired, both the thumbnail :guilabel:`Image` and the :guilabel:`Dashboard Image` can be -modified. Hover over the image being replaced to reveal a :guilabel:`✏️ (pencil)` icon and -:guilabel:`🗑️ (garbage can)` icon. Click the :guilabel:`✏️ (pencil)` icon, and a file explorer -window appears. Navigate to the desired image file, then click :guilabel:`Open` to select it. +modified. Hover over the image being replaced to reveal an :icon:`fa-pencil` :guilabel:`(Edit)` +icon and :icon:`fa-trash-o` :guilabel:`(Clear)` icon. Click the :icon:`fa-pencil` :guilabel:`(Edit)` +icon, and a file explorer window appears. Navigate to the desired image file, then click +:guilabel:`Open` to select it. -The referral friend form automatically saves, but can be saved manually at any time by clicking the -*Save manually* option, represented by a :guilabel:`(cloud upload)` icon, located in the top-left -corner. To cancel any changes made, click the :guilabel:`✖️ (Discard all changes)` icon to delete -any changes, and revert to the original content. +To cancel any changes made, click the :icon:`fa-times` :guilabel:`(Discard all changes)` icon to +delete any changes, and revert to the original content. .. image:: referrals/edit-friend.png - :align: center :alt: A friend form in edit mode. .. warning:: It is not advised to edit the images. An image file must have a transparent background in order for it to render properly. Only users with knowledge about transparent images should attempt - adjusting any images in the *Referrals* application. + adjusting any images in the **Referrals** app. Once an image is changed and the friend is saved, it is **not possible** to revert to the - original image. To revert to the original image, the *Referrals* application must be *uninstalled - then reinstalled.* + original image. To revert to the original image, the **Referrals** app must be *uninstalled then + reinstalled.* .. _referrals/levels: Levels ====== -The *Referrals* application has pre-configured levels that are reflected in the user's avatar on the -Referrals dashboard. As a user refers potential employees and earns points, they can *level up*, +The **Referrals** app has preconfigured levels that are reflected in the user's avatar on the +**Referrals** dashboard. As a user refers potential employees and earns points, they can *level up*, much like in a video game. -Levels have no functional impact on the performance of the application. They are solely used for the -purpose of adding achievement tiers for participants to aim for, gamifying referrals for the user. +.. note:: + Levels have no functional impact on the performance of the app. They are solely used for the + purpose of adding achievement tiers for participants to aim for, gamifying referrals for the + user. -The user's current level is displayed at the top of the main *Referrals* application dashboard, -directly beneath their photo, in a :guilabel:`Level: X` format. In addition, a colored ring appears -around the user's photo, indicating how many points the user currently has, and how many additional -points they need to level up. The cyan colored portion of the ring represents points earned, while -the white colored portion represents the points still needed before they can level up. +The user's current level is displayed at the top of the main **Referrals** app dashboard, directly +beneath their photo, in a :guilabel:`Level: #` format. In addition, a colored ring appears around +the user's photo, indicating how many points the user currently has, and how many additional points +they need to level up. The cyan colored portion of the ring represents points earned, while the +white colored portion represents the points still needed before they can level up. Modify levels ------------- -Only users with :guilabel:`Administrator` rights for the *Recruitment* application can modify -levels. The pre-configured levels can be seen and modified by navigating to -:menuselection:`Referrals app --> Configuration --> Levels`. Each avatar appears in the -:guilabel:`Image` column, and the corresponding level number appears in the :guilabel:`Level Name` -column. The default images are of Odoo superheroes, and each level adds an additional element to -their avatar, such as capes and shields. +Only users with :guilabel:`Administrator` rights for the **Recruitment** app can modify levels. + +.. warning:: + It is not advised to edit the images. An image file must have a transparent background in order + for it to render properly. Only users with knowledge about transparent images should attempt + adjusting any images in the **Referrals** app. + + Once an image is changed and the level is saved, it is **not possible** to revert to the original + image. To revert to the original image, the **Referrals** app must be *uninstalled then + reinstalled.* + +The preconfigured levels can be seen and modified by navigating to :menuselection:`Referrals app --> +Configuration --> Levels`. Each avatar appears in the :guilabel:`Image` column, and the +corresponding level number appears in the :guilabel:`Level Name` column. The default images are of +Odoo superheroes, and each level adds an additional element to their avatar, such as capes and +shields. To modify a level's image, name, or points required to reach the level, click on an individual level in the list to open the level form, then make modifications. @@ -207,46 +212,33 @@ number of referral points needed to reach that level in the :guilabel:`Requireme points needed to level up are the total accumulated points earned over the lifetime of the employee, not additional points from the previous level that must be earned. -If desired, the :guilabel:`Image` can also be modified. Hover over the image to reveal a -:guilabel:`✏️ (pencil)` icon and :guilabel:`🗑️ (garbage can)` icon. Click the :guilabel:`✏️ -(pencil)` icon, and a file explorer window appears. Navigate to the desired image file, then click -:guilabel:`Open` to select it. +If desired, the :guilabel:`Image` can also be modified. Hover over the image to reveal an +:icon:`fa-pencil` :guilabel:`(Edit)` icon and a :icon:`fa-trash-o` :guilabel:`(Clear)` icon. Click +the :icon:`fa-pencil` :guilabel:`(Edit)` icon and a file explorer window appears. Navigate to the +desired image file, then click :guilabel:`Open` to select it. -The level form saves automatically, but can be saved manually at any time by clicking the *save -manually* option, represented by a :guilabel:`(cloud upload)` icon, located in the top-left corner. -To cancel any changes made, click the :guilabel:`✖️ (Discard all changes)` icon to delete any -changes, and revert to the original content. +To cancel any changes made, click the :icon:`fa-times` :guilabel:`(Discard all changes)` icon to +delete any changes, and revert to the original content. .. image:: referrals/levels.png - :align: center :alt: A level form in edit mode. -.. warning:: - It is not advised to edit the images. An image file must have a transparent background in order - for it to render properly. Only users with knowledge about transparent images should attempt - adjusting any images in the *Referrals* application. - - Once an image is changed and the level is saved, it is **not possible** to revert to the original - image. To revert to the original image, the *Referrals* application must be *uninstalled then - reinstalled.* - Level up -------- Once enough points have been accumulated to level up, the circle around the user's photo is -completely filled in with a cyan color, a large image stating :guilabel:`Level up!` appears above -the photo, and the phrase :guilabel:`Click to level up!` appears beneath the user's photo and +completely filled in with a cyan color, a large image stating :guilabel:`LEVEL UP!` appears above +the photo, and the phrase :guilabel:`CLICK TO LEVEL UP!` appears beneath the user's photo and current level. -Click on either the :guilabel:`LEVEL UP!` graphic, the user's photo, or the text :guilabel:`Click to -level up!` beneath the user's photo to level up the user. The user's avatar changes to the current +Click on either the :guilabel:`LEVEL UP!` graphic, the user's photo, or the text :guilabel:`CLICK TO +LEVEL UP!` beneath the user's photo to level up the user. The user's avatar changes to the current level, and the ring around the photo is updated to indicate the current amount of points. -Leveling up does not cost the user any points, the user simply needs to earn the specified amount of +Leveling up does not cost the user any points, the user only needs to earn the specified amount of points required. .. image:: referrals/level-up.png - :align: center :alt: A 'Click to level up!' appears beneath the user's image, and a large 'Level up!' appears above their image. diff --git a/content/applications/hr/referrals/alerts.rst b/content/applications/hr/referrals/alerts.rst index 015e277909..65bce81803 100644 --- a/content/applications/hr/referrals/alerts.rst +++ b/content/applications/hr/referrals/alerts.rst @@ -2,21 +2,22 @@ Alerts ====== -In the *Referrals* application, it is possible to post a message, also referred to as an *alert*, at -the top of the dashboard to share important information with users. +In the **Referrals** application, it is possible to post a message, also referred to as an *alert*, +at the top of the dashboard to share important information with users. -Alerts remain on the main *Referrals* dashboard for the specified amount of time configured on the +Alerts remain on the main **Referrals** dashboard for the specified amount of time configured on the individual alert. .. image:: alerts/alerts.png - :align: center :alt: Two alert banners appear above the user's photo. +.. _referrals/create-alert: + Create an alert =============== -Only users with *Administrator* access rights for the *Recruitment* application can create alerts. -To add a new alert, navigate to the :menuselection:`Referrals app --> Configuration --> Alerts`. +Only users with *Administrator* access rights for the **Recruitment** app can create alerts. To add +a new alert, navigate to the :menuselection:`Referrals app --> Configuration --> Alerts`. Click :guilabel:`New` to open a blank alert form. Enter the following information on the form: @@ -27,13 +28,13 @@ Click :guilabel:`New` to open a blank alert form. Enter the following informatio the alert should be displayed for, select the desired company from the drop-down menu in this field. - If this field remains blank, the alert is visible to everyone with access to the *Referrals* - application. + If this field remains blank, the alert is visible to everyone with access to the **Referrals** + app. - If a company is specified, only users within that company (who also have access to the *Referrals* - application) see the alert. This field **only** appears when in a multi-company database. + If a company is specified, only users within that company (who also have access to the + **Referrals** app) see the alert. This field **only** appears in a multi-company database. - :guilabel:`Alert`: enter the text for the alert. This message appears inside the alert banner on - the main *Referrals* dashboard. + the main **Referrals** app dashboard. - :guilabel:`On Click`: there are three options for the alert. Click the radio button next to the desired selection. The options are: @@ -45,16 +46,32 @@ Click :guilabel:`New` to open a blank alert form. Enter the following informatio Click` section. Enter the desired URL in that field. .. image:: alerts/alert-form.png - :align: center :alt: An alert form completely filled in with all selections entered. +Notify users +============ + +In addition to posting an alert on the **Referrals** app, users can be contacted directly via email, +instead of waiting for users to view the alert when they open the **Referrals** app. + +After :ref:`creating an alert `, click the :guilabel:`Send Mail` button +above the alert form. This causes a :guilabel:`Send Mail` pop-up window to load. + +The currently configured users populate the :guilabel:`User` field, and the :guilabel:`Subject` is +populated with `New Alert In Referrals App`, by default. + +The :guilabel:`Body` is populated with `A new alert has been added to the Referrals app! Check your +dashboard now!`, with the word `dashboard` linked to the **Referrals** app dashboard. + +Make any desired modifications to the email, then click :guilabel:`Send`. + Dismiss an alert ================ It is possible to dismiss an alert, if a user does not wish to see a specific alert again. To dismiss an alert, click the :icon:`fa-times` :guilabel:`(remove)` icon on the far-right side of -the alert to remove the alert from the dashboard. +the alert on the **Referrals** app dashboard, to remove the alert. -This prevents the alert from appearing again, even when opening the *Referrals* application for the -first time in a new session. +This prevents the alert from appearing again, even when opening the **Referrals** app for the first +time in a new session. diff --git a/content/applications/hr/referrals/avatars.png b/content/applications/hr/referrals/avatars.png index bc2b899f0a..2756debaa6 100644 Binary files a/content/applications/hr/referrals/avatars.png and b/content/applications/hr/referrals/avatars.png differ diff --git a/content/applications/hr/referrals/edit-friend.png b/content/applications/hr/referrals/edit-friend.png index 5dc7fe478e..ff1ec871a0 100644 Binary files a/content/applications/hr/referrals/edit-friend.png and b/content/applications/hr/referrals/edit-friend.png differ diff --git a/content/applications/hr/referrals/edit-onboarding.png b/content/applications/hr/referrals/edit-onboarding.png index 6bfafebffc..ca072408d8 100644 Binary files a/content/applications/hr/referrals/edit-onboarding.png and b/content/applications/hr/referrals/edit-onboarding.png differ diff --git a/content/applications/hr/referrals/level-up.png b/content/applications/hr/referrals/level-up.png index e3583d7d29..4eeea91722 100644 Binary files a/content/applications/hr/referrals/level-up.png and b/content/applications/hr/referrals/level-up.png differ diff --git a/content/applications/hr/referrals/levels.png b/content/applications/hr/referrals/levels.png index c6d61fb7bf..4c51e4a166 100644 Binary files a/content/applications/hr/referrals/levels.png and b/content/applications/hr/referrals/levels.png differ diff --git a/content/applications/hr/referrals/onboarding-reorder.png b/content/applications/hr/referrals/onboarding-reorder.png index 88ce1880ac..4640d2b962 100644 Binary files a/content/applications/hr/referrals/onboarding-reorder.png and b/content/applications/hr/referrals/onboarding-reorder.png differ diff --git a/content/applications/hr/referrals/onboarding.png b/content/applications/hr/referrals/onboarding.png index 4cbe450401..6a60a60b93 100644 Binary files a/content/applications/hr/referrals/onboarding.png and b/content/applications/hr/referrals/onboarding.png differ diff --git a/content/applications/hr/referrals/points.rst b/content/applications/hr/referrals/points.rst index 79e8826c8d..39631ce7a6 100644 --- a/content/applications/hr/referrals/points.rst +++ b/content/applications/hr/referrals/points.rst @@ -19,15 +19,15 @@ statuses beneath the avatar. The options are: :guilabel:`Referrals`, :guilabel:` The current number of referrals that are still active in the recruitment pipeline, but have not yet been hired or refused, appear above :guilabel:`Ongoing`. The number of referrals that have been -hired, appear above :guilabel:`Successful`. The total number of referrals, both the ongoing and +hired, appears above :guilabel:`Successful`. The total number of referrals, both the ongoing and successful referrals combined, appears above :guilabel:`Referrals`. My referrals ============ To see all the referrals, both ongoing and successful, click :guilabel:`Referrals`. The -:guilabel:`My Referral` screen page displays all the referrals, with each individual referral housed -in its own referral card. +:guilabel:`My Referral` screen page displays all referrals, with each individual referral housed in +its own referral card. A successful referral displays a white :icon:`fa-check` :guilabel:`Hired` badge in the top-right corner of the card, along with a vertical green stripe on the left-side of the card. Referrals that diff --git a/content/applications/hr/referrals/reporting.rst b/content/applications/hr/referrals/reporting.rst index 8b48aacc52..e4042d26cf 100644 --- a/content/applications/hr/referrals/reporting.rst +++ b/content/applications/hr/referrals/reporting.rst @@ -27,14 +27,13 @@ Referral amounts for all stages are displayed, including :guilabel:`Not Hired` ( Hover over any bar to view a popover containing specific data for that particular bar. -In this view, it is easy to see which :guilabel:`Medium` is the most successful. +In this view, it is clear which :guilabel:`Medium` is the most successful. .. example:: In this example, both :guilabel:`Email` and :guilabel:`LinkedIn` are the mediums with the most referrals, but :guilabel:`Email` has the most referrals that were hired. .. image:: reporting/employee-report.png - :align: center :alt: The default report in the Referrals app. Use case: hired referrals @@ -69,7 +68,6 @@ This information can be helpful to the recruitment team, so they can determine t referrers in the company, and who is the most successful in terms of hires. .. image:: reporting/employee-counts.png - :align: center :alt: The customized report showing which employees have the most referrals and hires. .. tip:: @@ -83,5 +81,5 @@ referrers in the company, and who is the most successful in terms of hires. Click :guilabel:`Confirm`, and the selected spreadsheet loads, with the new table in it. - The spreadsheet is stored in the *Documents* application. This application **must** be installed - to use the :guilabel:`Insert in Spreadsheet` option. + The spreadsheet is stored in the **Documents** application. This application **must** be + installed to use the :guilabel:`Insert in Spreadsheet` option. diff --git a/content/applications/hr/referrals/rewards.rst b/content/applications/hr/referrals/rewards.rst index 8549bc0668..282c9da804 100644 --- a/content/applications/hr/referrals/rewards.rst +++ b/content/applications/hr/referrals/rewards.rst @@ -3,7 +3,7 @@ Rewards ======= After employees have successfully earned referral points, they can exchange their points by -purchasing rewards in Odoo's *Referrals* application. Rewards **must** be :ref:`created and +purchasing rewards in Odoo's **Referrals** application. Rewards **must** be :ref:`created and configured ` before employees can :ref:`redeem points for rewards `. @@ -12,11 +12,14 @@ configured ` before employees can :ref:`redeem points for rewa Create rewards ============== -Rewards are the only configurations needed when setting up the *Referrals* application. +Rewards are the only configurations needed when setting up the **Referrals** application. -Only users with :guilabel:`Administrator` rights for the *Recruitment* application can create or +Only users with :guilabel:`Administrator` rights for the **Recruitment** application can create or modify rewards. +.. seealso:: + :doc:`../../general/users/access_rights` + To add rewards, navigate to :menuselection:`Referrals app --> Configuration --> Rewards`. Click :guilabel:`New`, and a reward form loads. Enter the following information on the form: @@ -34,19 +37,18 @@ To add rewards, navigate to :menuselection:`Referrals app --> Configuration --> - :guilabel:`Gift Responsible`: using the drop-down menu, select the person responsible for procuring and delivering the reward to the recipient. This person is alerted when the reward is - bought in the *Referrals* application, so they know when to deliver the reward to the recipient. + bought in the **Referrals** app, so they know when to deliver the reward to the recipient. - :guilabel:`Photo`: add a photo of the reward, which appears on the rewards page. Hover over the image box in the top-right corner (a square with a camera and plus sign inside it), and a :icon:`fa-pencil` :guilabel:`(pencil)` icon appears. Click the :icon:`fa-pencil` :guilabel:`(pencil)` icon to select and add a photo to the reward form. Once a photo is added, - hovering over the image reveals two icons instead of one: a :icon:`fa-pencil` - :guilabel:`(pencil)` icon and a :icon:`fa-trash-o` :guilabel:`(trash can)` icon. Click the - :icon:`fa-trash-o` :guilabel:`(trash can)` icon to delete the currently selected image. + hovering over the image reveals two icons instead of one: a :icon:`fa-pencil` :guilabel:`(pencil)` + icon and a :icon:`fa-trash-o` :guilabel:`(trash can)` icon. Click the :icon:`fa-trash-o` + :guilabel:`(trash can)` icon to delete the currently selected image. - :guilabel:`Description` tab: type in the description for the reward. This is visible on the reward card, beneath the title. This field is required. .. image:: rewards/rewards.png - :align: center :alt: A filled out reward form with all details entered. .. important:: @@ -82,6 +84,5 @@ reward are subtracted from the user's available points. The rewards presented ar reflect the user's current available points. .. image:: rewards/redeem-rewards.png - :align: center :alt: Buy button appears below a mug and backpack reward, while the bicycle reward states how many more reward points are needed to redeem. diff --git a/content/applications/hr/referrals/share_jobs.rst b/content/applications/hr/referrals/share_jobs.rst index a4cbbf5f15..07a486380a 100644 --- a/content/applications/hr/referrals/share_jobs.rst +++ b/content/applications/hr/referrals/share_jobs.rst @@ -2,26 +2,29 @@ Share job positions =================== -In Odoo *Referrals*, users can earn referral points by sharing job positions with potential -applicants. Job positions can be shared in several ways, through the :ref:`View Jobs -` button and the :ref:`Email A Friend ` button, located -at the bottom of the *Referrals* app dashboard. +In Odoo **Referrals**, users can earn referral points by sharing job positions with potential +applicants. Individual job positions can be shared in several ways: via :ref:`email +`, :ref:`SMS `, :ref:`WhatsApp `, a +:ref:`tracking link `, and various :ref:`social media platforms `. + +Additionally, *all* job positions can be :ref:`shared via email `, instead of +sharing individual job positions. .. note:: - Sharing jobs can **only** occur after onboarding slides have been viewed or skipped. + Sharing jobs can **only** occur after :ref:`onboarding ` slides have been + viewed or skipped. .. _referrals/view-jobs: -View Jobs -========= +View all jobs +============= To see all job positions that are actively recruiting candidates, click the :guilabel:`View Jobs` -button on the main *Referrals* dashboard. This presents all job positions, with each individual job +button on the main **Referrals** app dashboard. This presents all job positions, with each job presented with its own card. .. image:: share_jobs/jobs.png - :align: center - :alt: The 'View Jobs' screen, displaying all current open job positions. All information is + :alt: The View Jobs screen, displaying all current open job positions. All information is displayed on the card. Each job position card contains the following information: @@ -30,24 +33,30 @@ Each job position card contains the following information: form. - The number of :guilabel:`Open Positions` being recruited. This information is taken from the *Expected New Employees* field of the *Recruitment* tab of the job form. -- The points a user earns when an applicant applies for the position. +- The :doc:`points ` a user earns when an applicant applies for the position. - The job description detailing the job position. This information is taken from the *Job Position* tab of the job form. -To see all the details for a job position, click the :guilabel:`More Info` button on the specific -card. This opens the job position webpage in a new browser tab. This is what an applicant sees -before applying for a position. - .. note:: - Only published job positions are visible in the *Referrals* app. To check which job positions are - published or not, refer to the :doc:`../recruitment/new_job` documentation. + Only published job positions are visible in the **Referrals** app. To check which job positions + are published or not, refer to the :doc:`../recruitment/new_job` documentation. -Refer friends -============= +Share an individual job +======================= + +To share an individual job position, first click the :guilabel:`View Jobs` button on the main +**Referrals** app dashboard. This presents a list of all currently published jobs. From this page, +an individual job can be shared with someone using one of the methods below. -To share a job position with someone, click the :guilabel:`Refer Friend` button on the specific job -position card. A pre-configured :guilabel:`Send Job Offer by Mail` pop-up window appears. Enter the -recipient's email address in the :guilabel:`Email` field. +.. _referrals/email: + +Send email +---------- + +To share an individual job position via email, click the :icon:`fa-envelope-o` :guilabel:`Send +Email` button on the specific job position card. A preconfigured email template appears in a pop-up +window, using the :guilabel:`Send Job Offer by Mail` template. Enter the recipient's email address +in the :guilabel:`Email` field. The :guilabel:`Subject` and :guilabel:`Body` are populated using a default template. The :guilabel:`Subject` `Job for you` is present, by default, but can be modified, if desired. @@ -58,78 +67,126 @@ position listed on the website. When the prospective employee receives the email, the link sends them to the job position page, where they can apply for the position, and the person who referred them is tracked in the -*Referrals* application. +**Referrals** app. If desired, add any text or closing salutation to the email body. When all edits have been made, click :guilabel:`Send Mail` to send the email, or click :guilabel:`Cancel` to close the pop-up window. .. image:: share_jobs/email.png - :align: center :alt: Referral email pop-up window with the email message inside it. -Share a job -=========== +.. _referrals/sms: + +Send SMS +-------- + +To share an individual job position with someone via SMS (text message), click the :icon:`fa-mobile` +:guilabel:`Send SMS` button on the specific job position card. A preconfigured :guilabel:`Send Job +Offer by SMS` pop-up window appears. Enter the recipient's mobile number in the +:guilabel:`Recipient` field. -Other than sending an email, job positions can be shared, via social media platforms, and by -tracking links to the job position. At the bottom of each job position card are four icons, and -corresponding tracking links, that can be used to share the job position, keeping track of -applicants in the *Referrals* application. +Modify the prepopulated :guilabel:`Body` message, if desired, then click the :guilabel:`Send SMS` +button to send the message, or click :guilabel:`Cancel` to close the pop-up window and cancel the +message. -.. image:: share_jobs/share.png - :align: center - :alt: The various sharing icons that appear for each job. +.. note:: + Sending text messages is **not** a default capability with Odoo. To send text messages, credits + are required, which need to be purchased. For more information on IAP credits and plans, refer to + the :doc:`../../essentials/in_app_purchase` documentation. -Link ----- +.. _referrals/whatsapp: -To share the job position with a customized tracking link, click the :guilabel:`Share Now` button -with the :icon:`fa-chain` :guilabel:`(link)` icon above it. A :guilabel:`Link to Share` pop-up -window appears with the tracking link. Click :guilabel:`Copy` to copy the link. After the link is -copied, click the :guilabel:`Close` button to close the pop-up window. Next, share the link with -the prospective employee. +Send WhatsApp +------------- -Facebook +To share an individual job position with someone via WhatsApp, click the :icon:`fa-whatsapp` +:guilabel:`Send WhatsApp` button on the specific job position card. A preconfigured :guilabel:`Send +Job Offer by WhatsApp` pop-up window appears. Enter the recipient's mobile number in the +:guilabel:`Recipient` field. + +Modify the default message, if desired, then click the :guilabel:`Send WhatsApp` button to send the +message, or click :guilabel:`Cancel` to close the pop-up window and cancel the message. + +.. note:: + To send WhatsApp messages, WhatsApp must be configured in Odoo. For more information, refer to + the :doc:`../../productivity/whatsapp` documentation. + +Job page -------- -To share the job position using Facebook, click the :guilabel:`Share Now` button with the -:icon:`fa-facebook` :guilabel:`(Facebook)` icon above it. +To see all the details for a job position, click the :icon:`fa-globe` :guilabel:`Job Page` button on +the specific card. Doing so opens the job position webpage in a new browser tab. This is what an +applicant sees before applying for a position. + +.. _referrals/link: + +Share now +--------- -If the user is already logged into Facebook, when the the :guilabel:`Share Now` button is clicked, a -:guilabel:`Share on Facebook` page loads in a new tab, with the link populated in the main body of -the new post in a pop-up window. If the user is *not* already logged in, a log-in screen loads, -instead, prompting the user to log-in to Facebook first. +To share the job position with a customized tracking link, click the :icon:`fa-chain` +:guilabel:`Share Now` button to copy the link. A pop-up window in the corner of the computer loads, +stating `Referral link: (link to Job Position) has been copied to clipboard`. + +Next, share the link with the prospective employee. + +.. _referrals/social: + +Share a job via social media +---------------------------- + +Other than sending an email, SMS, WhatsApp message, or sharing a tracking link, job positions can be +shared via social media platforms (:ref:`Facebook `, :ref:`X `, and +:ref:`LinkedIn `. On each job position card are the three corresponding social +media icons that can be used to share the job position, keeping track of applicants in the +**Referrals** application. + +.. _referrals/facebook: + +Facebook +~~~~~~~~ + +To share the job position using Facebook, click the :icon:`fa-facebook` :guilabel:`Share Now` +button. + +If the user is already logged into Facebook, when the :icon:`fa-facebook` :guilabel:`Share Now` +button is clicked, Facebook loads in a new tab, where a :guilabel:`Create post` pop-up window loads +with the tracking link attached. Type in any additional information to add to the post, then share the job position using the available options in Facebook. +.. note:: + To share the job via Facebook,first, the user **must** be logged into Facebook. If the user is + *not* already logged in, when the :icon:`fa-facebook` :guilabel:`Share Now` button is clicked, a + new tab loads, stating `You are not logged in. Please login and try again.` + +.. _referrals/x: + X (formerly Twitter) --------------------- +~~~~~~~~~~~~~~~~~~~~ -A job position can also be shared on X. Click the :guilabel:`Share Now` button with the -:guilabel:`(X)` icon above it. +To share a job position on X, click the :guilabel:`X Share Now` button. -If the user is already signed-in to X, when the :guilabel:`Share Now` button is clicked, an X page +If the user is already signed-in to X, when the :guilabel:`X Share Now` button is clicked, an X page loads in a new tab with a pre-populated message ready to post, in a draft pop-up window. If the user is *not* already signed-in, a sign-in screen loads instead, prompting the user to first sign-in to X. -The default message is: +Type in any additional information, or make any edits to the default message, then share using the +available options in X. -`Amazing job offer for (Job Position)! Check it live: (link to Job Position)` - -Type in any additional information, or make any edits to the message, then share using the available -options in X. +.. _referrals/linkedin: LinkedIn --------- +~~~~~~~~ -To share a job position on LinkedIn, click the :guilabel:`Share Now` button with the -:icon:`fa-linkedin` :guilabel:`(LinkedIn)` icon above it. +To share a job position on LinkedIn, click the :icon:`fa-linkedin` :guilabel:`Share Now` button. -If the user is already logged into LinkedIn, when the :guilabel:`Share Now` button is clicked, a new -tab loads in LinkedIn, with a link to the job position at the top. If the user is *not* already -logged in, a log-in screen loads instead, prompting the user to log-in to LinkedIn first. +If the user is already logged into LinkedIn, when the :icon:`fa-linkedin` :guilabel:`Share Now` +button is clicked, a new tab loads in LinkedIn, with a link to the job position at the top. If the +user is *not* already logged in, a log-in screen loads instead, prompting the user to log-in to +LinkedIn first. The job position can be shared either in a public post, or in a private message to an individual (or group of individuals). @@ -139,27 +196,20 @@ available options in LinkedIn. .. _referrals/email-jobs: -Email a friend --------------- +Share job list +============== Another way to share job opportunities is to share the entire current list of open job positions, instead of one job position at a time. To do this, navigate to the :menuselection:`Referrals` main dashboard. Click the :guilabel:`Email a friend` button at the bottom of the screen. A :guilabel:`Send Job Offer by Mail` pop-up window appears. -Enter the email address in the :guilabel:`Email` field. The email can be sent to multiple -recipients by separating each email address with a comma followed by a single space. The -:guilabel:`Subject` is pre-configured with :guilabel:`Job for you`, but can be edited. - -The email :guilabel:`Body` is also populated with pre-configured text. The text that appears is: - -`Hello,` - -`There are some amazing job offers in my company! Have a look, they can be interesting for you\:` - -`See Job Offers` +Enter the email address in the :guilabel:`Email` field. The email can be sent to multiple recipients +by separating each email address with a comma followed by a single space. The :guilabel:`Subject` is +preconfigured with :guilabel:`Job for you`, but can be edited. The email :guilabel:`Body` is also +populated with preconfigured text. -The :guilabel:`See Job Offers` text is a tracking link to a complete list of all job positions +The link to all active job positions is a tracking link to a complete list of all job positions currently being recruited for. Add any additional text and make any edits to the message body, if necessary. Then, click :guilabel:`Send Mail` to send the email. This sends the message, and closes the window. diff --git a/content/applications/hr/referrals/share_jobs/email.png b/content/applications/hr/referrals/share_jobs/email.png index 668639301b..a2407e06ed 100644 Binary files a/content/applications/hr/referrals/share_jobs/email.png and b/content/applications/hr/referrals/share_jobs/email.png differ diff --git a/content/applications/hr/referrals/share_jobs/jobs.png b/content/applications/hr/referrals/share_jobs/jobs.png index ac9a31326a..a00deab3dc 100644 Binary files a/content/applications/hr/referrals/share_jobs/jobs.png and b/content/applications/hr/referrals/share_jobs/jobs.png differ diff --git a/content/applications/hr/referrals/share_jobs/share.png b/content/applications/hr/referrals/share_jobs/share.png deleted file mode 100644 index 3652d2405f..0000000000 Binary files a/content/applications/hr/referrals/share_jobs/share.png and /dev/null differ diff --git a/content/applications/hr/time_off.rst b/content/applications/hr/time_off.rst index 2948a550f1..c8a31b2268 100644 --- a/content/applications/hr/time_off.rst +++ b/content/applications/hr/time_off.rst @@ -1,7 +1,7 @@ :show-content: ======== -Time Off +Time off ======== Odoo's **Time Off** application serves as a centralized hub for all time-off-related information. @@ -12,7 +12,7 @@ requests and time off balances. Managers can :doc:`allocate time off `. -Detailed :ref:`reports ` can be run to see how much time off (and what kinds of +Detailed :doc:`reports ` can be run to see how much time off (and what kinds of time off) are being used, :ref:`accrual plans ` can be created, and :ref:`public holidays ` can be set. @@ -23,8 +23,11 @@ time off) are being used, :ref:`accrual plans ` can be c sections require specific access rights. To better understand how access rights affect the **Time Off** app, refer to the - :doc:`employees/new_employee` document, specifically the section about configuring the work - information tab. + :doc:`employees/new_employee` document, specifically the section about configuring the *Work + Information* tab. + +.. seealso:: + :doc:`../general/users/access_rights` Configuration ============= @@ -42,8 +45,8 @@ To view the currently configured time off types, navigate to :menuselection:`Tim Configuration --> Time Off Types`. The time off types are presented in a list view. The **Time Off** app comes with four preconfigured time off types: :guilabel:`Paid Time Off`, -:guilabel:`Sick Time Off`, :guilabel:`Unpaid`, and :guilabel:`Compensatory Days`. These can be -modified to suit business needs, or used as-is. +:guilabel:`Sick Time Off`, :guilabel:`Unpaid`, :guilabel:`Compensatory Days`, and :guilabel:`Extra +Hours`. These can be modified to suit business needs, or used as-is. Create time off type ~~~~~~~~~~~~~~~~~~~~ @@ -52,7 +55,7 @@ To create a new time off type, navigate to :menuselection:`Time Off app --> Conf Off Types`. From here, click the :guilabel:`New` button to reveal a blank time off type form. Enter the name for the particular type of time off in the blank line at the top of the form, such as -`Sick Time` or `Vacation`. Then, enter the following information on the form. +`Vacation` or `Bereavement`. Then, enter the following information on the form. .. note:: The only **required** fields on the time off type form are the name of the :guilabel:`Time Off @@ -60,9 +63,13 @@ Enter the name for the particular type of time off in the blank line at the top :guilabel:`Time Off Requests` and :guilabel:`Allocation Requests` sections **must** be configured. -Time Off Requests section +.. _time_off/time-off-requests: + +Time off requests section ************************* +This section determines how approvals are handled for time off requests for this time off type. + - :guilabel:`Approval`: select what specific kind of approval is required for the time off type. The options are: @@ -75,12 +82,14 @@ Time Off Requests section is set on the *Work Information* tab on the :ref:`employee's form `, is required to approve the time off request. - :guilabel:`By Employee's Approver and Time Off Officer`: Both the employee's :ref:`specified - time off approver` and the :ref:`Time Off Officer + time off approver ` and the :ref:`Time Off Officer ` are required to approve the time off request. -Allocation Requests section +Allocation requests section *************************** +This section determines how allocation requests are handled for this time off type. + - :guilabel:`Requires allocation`: If the time off must be allocated to employees, select :guilabel:`Yes`. If the time off can be requested without time off being previously allocated, select :guilabel:`No Limit`. If :guilabel:`No Limit` is selected, the following options do not @@ -104,21 +113,31 @@ Allocation Requests section - :guilabel:`Approval`: Select the type of approvals required for the allocation of this particular time off type. - - :guilabel:`Approved by Time Off Officer` indicates the :ref:`Time Off Officer - ` set on this form must approve the allocation. - - :guilabel:`No validation needed` indicates that no approvals are required. + - :guilabel:`No Validation`: No approvals are required when requesting additional allocations for + the time off type. The allocation request is automatically approved. + - :guilabel:`By Time Off Officer`: Only the specified :ref:`Time Off Officer + `, set on this form in the :guilabel:`Notified Time Off Officer` + field, is required to approve the allocation request. This option is selected, by default. + - :guilabel:`By Employee's Approver`: Only the employee's specified approver for time off, which + is set on the *Work Information* tab on the :ref:`employee's form `, is + required to approve the allocation request. + - :guilabel:`By Employee's Approver and Time Off Officer`: Both the employee's :ref:`specified + time off approver ` and the :ref:`Time Off Officer + ` are required to approve the allocation request. Configuration section ********************* - .. _`time_off/time-off-officer`: +This section determines all other details regarding the time off type, aside from approvals and +allocations. This includes how the time off must be taken (hours, half days, or days), if the time +off is visible to other users, and how the time off affects the **Payroll** app. + +.. _`time_off/time-off-officer`: -- :guilabel:`Notified Time Off Officer`: Select the person who is notified and responsible for +- :guilabel:`Notified Time Off Officer`: Select the user who is notified and responsible for approving requests and allocations for this specific type of time off. - :guilabel:`Take Time Off in`: Select the format the time off is requested in from the drop-down - menu. - - The options are: + menu. The options are: - :guilabel:`Day`: if time off can only be requested in full day increments (8 hours). - :guilabel:`Half Day`: if time off can only be requested in half day increments (4 hours). @@ -134,6 +153,20 @@ Configuration section request would be for three hours, since the two extra worked hours are used first, and deducted from the request. +- :guilabel:`Public Holiday Included`: Enable this option if public holidays should be included in + time off requests. + + .. example:: + An employee in the United States requests time off for the week of July 4th, for a total of + five days. Since the 4th of July is a holiday in the United States, the time off request is + automatically modified to use four vacation days and one public holiday, instead of five + vacation days. That is because the holiday is included, and the user does not need to use their + own vacation time for a public holiday. + + This option reduces extra work for users, enabling them to make only one time off request for + the entire week, instead of making two separate requests, one for the days *before* the + holiday, and another one for the days *after* the holiday. + - :guilabel:`Allow To Attach Supporting Document`: Enable this option to allow the employee to attach documents to the time off request. This is useful in situations where documentation is required, such as long-term medical leave. @@ -146,11 +179,11 @@ Configuration section blank, the time off type applies to all companies in the database. This field **only** appears in a multi-company database. -Negative Cap section +Negative cap section ******************** Enable the :guilabel:`Allow Negative Cap` option if employees are able to request more time off than -they currently have, allowing a negative balance. If enabled, an :guilabel:`Amount in Negative` +they currently have, allowing a negative balance. If enabled, an :guilabel:`Maximum Excess Amount` field appears. In this field, enter the maximum amount of negative time allowed, in days. .. example:: @@ -158,13 +191,12 @@ field appears. In this field, enter the maximum amount of negative time allowed, requires five days of time off. The `Vacation` time off type has the :guilabel:`Allow Negative Cap` option enabled, and the - :guilabel:`Amount in Negative` is set to five. + :guilabel:`Maximum Excess Amount` is set to five. These settings allow Sara to submit a request for five days of the `Vacation` time off type. If approved, her `Vacation` time off balance will be negative two (-2) days. .. image:: time_off/time-off-type-form-top.png - :align: center :alt: The top half of the time off type form, with all the information filled out for sick time off. @@ -188,14 +220,13 @@ When an employee takes time off, and is also using timesheets, Odoo creates entr - :guilabel:`Task`: Select the task that appears in the timesheet for this time off type. The default options are: :guilabel:`Time Off`, :guilabel:`Meeting`, or :guilabel:`Training`. -Display Option section +Display option section ********************** - :guilabel:`Color`: Select a color to be used in the **Time Off** app dashboard. - :guilabel:`Cover Image`: Select an icon to be used in the **Time Off** app dashboard. .. image:: time_off/time-off-type-form-bottom.png - :align: center :alt: The lower half of the time off type form, with all the information filled out for sick time off. @@ -241,18 +272,17 @@ Enter the following information on the form: .. example:: An employee is granted time off from an accrual plan configured to accrue one day of vacation for every five days worked. The accrual plan is based on the employee's worked time (the - :guilabel:`Based on worked time` checkbox is ticked). + :guilabel:`Based on worked time` checkbox is ticked), which means they **only** earn vacation + time for the five weekdays they work, *not* the entire seven day week period. - The employee works standard 40-hour weeks. According to the accrual plan, they should earn - four vacation days per month. + The employee works standard 40-hour weeks. According to the accrual plan, they should earn four + vacation days per month. - The employee takes five days off. The :ref:`time off type ` the - employee has taken has the :guilabel:`Kind of Time Off` configured as an :guilabel:`Absence`. + The employee takes five days off using a :ref:`time off type ` with + the :guilabel:`Kind of Time Off` set as an :guilabel:`Absence`. Because the plan grants + vacation only for worked time, those five days do not count toward accrual. - Since the accrual plan only grants time off based on the worked time, the employee does **not** - accrue a vacation day for the five days of time off that is considered an absence. - - At the end of the month, the employee accrues only three days, instead of four. + As a result, the employee accrues only three vacation days that month instead of four. - :guilabel:`Milestone Transition`: This field is **only** visible after a minimum of two :ref:`rules ` have been configured on the accrual plan. This selection determines @@ -260,11 +290,10 @@ Enter the following information on the form: pay period, decide whether the employee changes milestones :guilabel:`Immediately` or :guilabel:`After this accrual's period` (after the current pay period). - :guilabel:`Company`: This field **only** appears in a multi-company database. Using the drop-down - menu, select the company the accrual plan applies to. If left blank, the accrual plan can be used + menu, select the company the accrual plan applies to. If left blank, the accrual plan is available for all companies. .. image:: time_off/accrual-plan-form.png - :align: center :alt: An accrual plan form with all the entries filled out. .. _time_off/rules: @@ -279,6 +308,8 @@ section, and a :guilabel:`Create Milestone` modal form appears. Fill out the following fields on the form: +.. _time_off/accrue: + - :guilabel:`Employee accrue`: Select the parameters for earned time off in this section. First, select either :guilabel:`Days` or :guilabel:`Hours` for the increment of accrued time using @@ -294,29 +325,33 @@ Fill out the following fields on the form: Depending on which option is selected, additional fields may appear. For example, if :guilabel:`Twice a month` is selected, two additional fields appear, to specify the two days of each month the milestone occurs. -- :guilabel:`Cap accrued time`: If there is a maximum amount of days the employee can accrue with +- :guilabel:`Cap accrued time`: If there is a maximum amount of time the employee can accrue with this plan, enable this option. - When enabled, two additional fields appear beneath it. Select the type of time period from the - drop-down menu, either :guilabel:`Days` or :guilabel:`Hours`. + When enabled, two additional fields appear to the right of the checkbox. The second field is + populated with either :guilabel:`Days` or :guilabel:`Hours`, matching the selection made in the + :ref:`Employee Accrue ` section. - Then, enter a numerical value in the field to specify the maximum amount of time that can be - accrued. -- :guilabel:`Milestone reached`: Enter the number and value of the time period that must pass before - the employee starts to accumulate time off. The first value is numerical; enter a number in the - first field. + Enter a numerical value in the first field to specify the maximum amount of time that can be + accrued, in the specified increments. +- :guilabel:`Start Accruing`: Enter the number and value of the time period that must pass before + the employee starts to accumulate time off. - Then, select the type of time period using the drop-down menu in the second field. The options - are: :guilabel:`Days`, :guilabel:`Months`, or :guilabel:`Years`. + Use the first field to enter a numerical value, then set the second field to the desired time + increment (either :guilabel:`Days`, :guilabel:`Months`, or :guilabel:`Years`). - :guilabel:`Carry over`: select how any unused time off is handled. The options are either: - - :guilabel:`None. Accrued time reset to 0`: Any unused time off is gone. + - :guilabel:`None. Accrued time reset to 0`: Any unused time off is lost. - :guilabel:`All accrued time carried over`: All unused time off is rolled over to the next calendar year. - :guilabel:`Carry over with a maximum`: Unused time off is rolled over to the next calendar year, - but there is a cap. An :guilabel:`Up to` field appears if this is selected. Enter the maximum - number of :guilabel:`Days` that can roll over to the following year. Any time off beyond this - parameter is lost. + but there is a cap. An :guilabel:`Up to` field appears if this is selected. + + Enter the maximum number of :guilabel:`Hours` or :guilabel:`Days` that can roll over to the + following year. The presented time increment is determined by how the :ref:`Employee Accrue + ` section is configured. + + Any time off beyond this parameter is lost. .. important:: If the :guilabel:`Carry over` field is set to :guilabel:`None. Accrued time reset to 0`, that @@ -338,24 +373,56 @@ Fill out the following fields on the form: The carry over set on the *rule* takes precedence over the carry over set on the *accrual plan form*. +- :guilabel:`Milestone cap`: Tick this checkbox to set a limit on the total amount of time that can + be accrued every calendar year. Enter the total maximum number of :guilabel:`Hours` or + :guilabel:`Days` the employee can accrue during a year. The presented time increment is determined + by how the :ref:`Employee Accrue ` section is configured. + + If the :guilabel:`Carry over` field is set to :guilabel:`None. Accrued time reset to 0`, the + :guilabel:`Milestone cap` field does not appear. +- :guilabel:`Carry Over Validity`: Tick this checkbox to set a time-limit on how long the employee + has to use any rolled over time off. First, set the second field to the desired time-period using + the drop-down menu, either :guilabel:`Days` or :guilabel:`Months`. + + Next, enter the maximum number of :guilabel:`Days` or :guilabel:`Months` the employee has to use + their rolled over time off. After that time period passes, any unused rolled over time will + expire. + + If the :guilabel:`Carry over` field is set to :guilabel:`None. Accrued time reset to 0`, the + :guilabel:`Carry Over Validity` field does not appear. + Once the form is completed, click :guilabel:`Save & Close` to save the :guilabel:`Create Milestone` form, and close the modal, or click :guilabel:`Save & New` to save the form and create another milestone. Add as many milestones as desired. -.. image:: time_off/milestone.png - :align: center - :alt: A milestone form with all the entries filled out. +.. example:: + This milestone form is configured so the employee earns five days a year. They start to earn this + time yearly, on January 1st. + + The employee can never accrue more than 120 days of time off with this accrual plan. Anytime they + have 120 days banked, they will stop accruing more time off. + + Additionally, they can roll over up to 100 days of time off to the next year, and they have three + months to use that rollover time. + + Note that due to the :guilabel:`Capped accrued time` of 120 days, the employee cannot carry over + any time off that exceeds 120 days in total. + + .. image:: time_off/milestone.png + :alt: A milestone form with all the entries filled out. .. _time_off/public-holidays: Public holidays --------------- -To observe public or national holidays, and provide extra days off as holidays to employees, -configure the observed *public holidays* in Odoo. +Since holidays vary from country to country, or even city to city, there are no public holidays +preconfigured in Odoo. To observe public or national holidays, and provide extra days off as +holidays to employees, configure the observed public holidays in Odoo. -It is important to configure these days in Odoo, so employees are aware of the days they have off, -and do not request time off on days that are already set as a public holiday (non-working days). +It is important to configure public holidays in Odoo, so employees are aware of the days they have +off, and do not request time off on days that are already set as a public holiday (non-working +days). Additionally, all public holidays configured in the **Time Off** app are also reflected in any app that uses working schedules, such as **Calendar**, **Planning**, **Manufacturing**, and more. @@ -363,13 +430,11 @@ that uses working schedules, such as **Calendar**, **Planning**, **Manufacturing Due to Odoo's integration with other apps that use working schedules, it is considered best practice to ensure *all* public holidays are configured. -Create public holiday -~~~~~~~~~~~~~~~~~~~~~ +Create public holidays +~~~~~~~~~~~~~~~~~~~~~~ To create a public holiday, navigate to :menuselection:`Time Off app --> Configuration --> Public -Holidays`. - -All currently configured public holidays appear in a list view. +Holidays`. All currently configured public holidays appear in a default list view. Click the :guilabel:`New` button, and a new line appears at the bottom of the list. @@ -381,7 +446,7 @@ Enter the following information on that new line: .. note:: The :guilabel:`Company` field is hidden, by default. To view this field, click the - :icon:`oi-settings-adjust` :guilabel:`(additional options)` icon in the top-right corner of the + :icon:`oi-settings-adjust` :guilabel:`(settings adjusts)` icon in the top-right corner of the list, to the far-right of the column titles, and activate the :guilabel:`Company` selection from the drop-down menu that appears. @@ -389,7 +454,7 @@ Enter the following information on that new line: starts, then click :icon:`fa-check` :guilabel:`Apply`. By default, this field is configured for the current date. The start time is set according to the start time for the company (according to the :ref:`working schedules `). If the user's computer is set to a - different time zone, the start time is adjusted according, compared to the company's time zone. + different time zone, the start time is adjusted accordingly, compared to the company's time zone. - :guilabel:`End Date`: Using the date and time picker, select the date and time the holiday ends, then click :icon:`fa-check` :guilabel:`Apply`. By default, this field is configured for the current date, and the time is set to the end time for the company (according to the :ref:`working @@ -415,7 +480,6 @@ Enter the following information on that new line: drop-down menu. .. image:: time_off/holidays.png - :align: center :alt: The list of public holidays in the configuration menu. Mandatory days @@ -455,12 +519,10 @@ Enter the following information on that new line: - :guilabel:`End Date`: Using the calendar picker, select the date the mandatory day ends. If creating a single mandatory day, the end date should be the same as the start date. - :guilabel:`Color`: If desired, select a color from the available presented options. If no color is - desired, select the `No color` option, represented by a white box with a red line diagonally - across it. The selected color appears on the main **Time Off** app dashboard, in both the calendar - and in the legend. + desired, select the `No color` option, represented by a white box with. The selected color appears + on the main **Time Off** app dashboard, in both the calendar and in the legend. .. image:: time_off/mandatory.png - :align: center :alt: The Mandatory Days section with three configured days. Overview @@ -468,22 +530,24 @@ Overview To view a color-coded schedule of the user's time off, and/or of the team managed by them, navigate to :menuselection:`Time Off app --> Overview`. This presents a calendar with the default filter of -`My Team`, in a month view. +`My Team`, in a quarterly (three month) view. -To change the time period displayed, click on the :guilabel:`Month` button to reveal a drop-down -menu. Then, select either :guilabel:`Day`, :guilabel:`Week`, or :guilabel:`Year` to present the -calendar in that corresponding view. +To change the time period displayed, click on the :icon:`fa-calendar` :guilabel:`(time period)` +button to reveal a drop-down menu. Then, select either :guilabel:`Today`, :guilabel:`This week`, +:guilabel:`This month`, :guilabel:`This year`, or a custom time period, to present the calendar in +that corresponding view. To navigate forward or backward in time, in the selected increment (:guilabel:`Month`, -:guilabel:`Week`, etc.), click the :guilabel:`← (left arrow)` or :guilabel:`→ (right arrow)` to move -either forward or backward in that specified amount of time. +:guilabel:`Week`, etc.), click the :icon:`oi-arrow-left` :guilabel:`(left arrow)` or +:icon:`oi-arrow-right` :guilabel:`(right arrow)` buttons to move either forward or backward in that +specified amount of time. For example, if :guilabel:`Month` is selected, the arrows adjust the view +by one month. -For example, if :guilabel:`Month` is selected, the arrows adjust the view by one month. +To return to a view containing the current day, click the :icon:`fa-crosshairs` :guilabel:`(Focus +Today)` button at any time. -To return to a view containing the current day, click the :guilabel:`Today` button at any time. - -Team members are listed alphabetically on individual lines, and their requested time off, -regardless of the status (*validated* or *to approve*), is visible on the calendar. +Team members are listed alphabetically on individual lines, and their requested time off, regardless +of the status (*validated* or *to approve*), is visible on the calendar. Each employee is color-coded. The employee's color is selected at random, and does *not* correspond to the type of time off they requested. @@ -502,89 +566,14 @@ hours or days are listed, along with the start and end time of the time off. To the time off request in a modal, click the :guilabel:`View` button. .. image:: time_off/overview.png - :align: center :alt: Overview of the user's team, with time off requests shown. -.. _time_off/reporting: - -Reporting -========= - -The reporting feature allows users to view time off for their team, either by employee or type of -time off. This allows users to see which employees are taking time off, how much time off they are -taking, and what time off types are being used. - -Any report can be added to a spreadsheet, when in either the :icon:`fa-area-chart` -:guilabel:`(Graph)` or :icon:`oi-view-pivot` :guilabel:`(Pivot)` view, through the *Insert in -Spreadsheet* button that appears in the top-left of the report. - -.. note:: - If the **Documents** app is installed, an option to add the report to a spreadsheet appears. If - not, the report can be added to a *Dashboard*. - -By employee ------------ - -To view a report of employee time off requests, navigate to :menuselection:`Time Off app --> -Reporting --> by Employee`. - -The default report presents the current year's data in a list view, displaying all the employees in -alphabetical order. Each employee's line is collapsed by default. To expand a line, click anywhere -on the line. - -The view expands, and has the time off requests organized by time off type. Click anywhere on a time -off type line to expand it, and view all the individual time off requests that fall under that type. - -The information shown in the list includes: the :guilabel:`Employee` name, :guilabel:`Number of -Days` off requested, the :guilabel:`Start Date`, :guilabel:`End Date`, :guilabel:`Status`, and -:guilabel:`Description`. - -.. image:: time_off/employee-report.png - :align: center - :alt: Report of time off, shown by each employee in a list view. - -The report can be displayed in other ways, as well. Click the corresponding button option in the -top-right corner of the page to view the data in that specific way. The various options are a -:icon:`oi-view-list` :guilabel:`(List)`, or default view, :icon:`fa-area-chart` :guilabel:`(Graph)`, -:icon:`oi-view-pivot` :guilabel:`(Pivot)` table, or :icon:`fa-calendar` :guilabel:`(Calendar)` view. - -When a selection has been made, additional options appear for that particular selection. For more -detailed information on the reports and their various options, refer to the :doc:`reporting -<../essentials/reporting>` documentation. - -By type -------- - -To view a list of all time off, organized by time off type, navigate to :menuselection:`Time Off app ---> Reporting --> by Type`. This shows all time off requests in a default bar chart. - -Hover over a bar to view the :guilabel:`Duration (Days)` of that specific time off type. - -.. image:: time_off/bar-chart.png - :align: center - :alt: The various time off types, and how many days requested, in a bar chart. Details are - highlighted in a red box. - -Click on a bar to go to a detailed list view of all the time off requests for that time off type. - -Each request is listed, with the following information displayed: the :guilabel:`Employee`, -:guilabel:`Number of Days`, :guilabel:`Request Type`, :guilabel:`Start Date`, :guilabel:`End Date`, -:guilabel:`Status`, and the :guilabel:`Description`. - -The report can be displayed in other ways, as well. Click the corresponding button option in the -top-right corner of the page to view the data in that way. The various options are a -:icon:`fa-area-chart` :guilabel:`(Graph)` (the default view), :icon:`oi-view-list` -:guilabel:`(List)`, or :icon:`oi-view-pivot` :guilabel:`(Pivot)` table. - -When a selection has been made, additional options appear for that particular selection. For more -detailed information on the reports, and their various options, refer to the :doc:`reporting -<../essentials/reporting>` documentation. - .. seealso:: - :doc:`time_off/allocations` - :doc:`time_off/request_time_off` - :doc:`time_off/my_time` - :doc:`time_off/management` + - :doc:`time_off/reporting` .. toctree:: :titlesonly: @@ -593,3 +582,4 @@ detailed information on the reports, and their various options, refer to the :do time_off/request_time_off time_off/my_time time_off/management + time_off/reporting diff --git a/content/applications/hr/time_off/allocations.rst b/content/applications/hr/time_off/allocations.rst index 1453ef9073..a50385ce85 100644 --- a/content/applications/hr/time_off/allocations.rst +++ b/content/applications/hr/time_off/allocations.rst @@ -2,6 +2,9 @@ Allocations =========== +Allocations are amounts of time off given to employees, either granted immediately or earned as the +employee works, through an accrual plan. + Once :ref:`time off types ` and :ref:`accrual plans ` have been configured, the next step is to *allocate*, or give, time off to employees. @@ -26,15 +29,17 @@ Click :guilabel:`New` to allocate time off, and a blank :guilabel:`Allocation` f After entering a name for the allocation on the first blank field of the form, enter the following information: +- :guilabel:`Name`: Enter a name for the allocation, typically containing the type of time off, and + the period of time it is available (example: `Annual Vacation Time Off - 2025`). - :guilabel:`Time Off Type`: Using the drop-down menu, select the type of time off that is being allocated to the employees. -- :guilabel:`Allocation Type`: Select either :guilabel:`Regular Allocation` or :guilabel:`Accrual - Allocation`. If the allocation is **not** based on an :ref:`accrual plan - `, select :guilabel:`Regular Allocation`. +- :guilabel:`Allocation Type`: Select how the allocation is granted. Choose :guilabel:`Regular + Allocation` if the time off is given immediately, or :guilabel:`Accrual Allocation` if the time + off is earned through an :ref:`accrual plan `. - :guilabel:`Accrual Plan`: If :guilabel:`Accrual Allocation` is selected for the :guilabel:`Allocation Type`, the :guilabel:`Accrual Plan` field appears. Using the drop-down menu, - select the accrual plan with which the allocation is associated. An accrual plan **must** be - selected for an :guilabel:`Accrual Allocation`. + select the accrual plan associated with the allocation. An accrual plan is **required** when using + the :guilabel:`Accrual Allocation` type. - :guilabel:`Validity Period/Start Date`: If :guilabel:`Regular Allocation` is selected for the :guilabel:`Allocation Type`, this field is labeled :guilabel:`Validity Period`. If :guilabel:`Accrual Allocation` is selected for the :guilabel:`Allocation Type`, this field is @@ -45,37 +50,14 @@ information: allocation, and click on the date to select it. If the allocation expires, select the expiration date in the next date field. If the time off does - *not* expire, leave the second date field blank. :guilabel:`No Limit` appears in the field if no - date is selected. + *not* expire, leave the second date field blank. If :guilabel:`Accrual Allocation` is selected for the :guilabel:`Allocation Type`, this second field is labeled :guilabel:`Run until`. - - .. important:: - If the :guilabel:`Start Date` entered is in the middle of a period of time, such as the middle - of the month, Odoo applies the allocation to the beginning or end of the period, depending on - the *Accrued Gain Time* entered on the :ref:`accrual plan ` (either *At - the start of the accrual period*, or *At the end of the accrual period*) instead of the - specific date entered. - - For example, an allocation is created, and references an accrual plan that grants time *At the - start of the accrual period*, monthly, on the first of the month. - - On the allocation form, the :guilabel:`Allocation Type` is set to :guilabel:`Accrual - Allocation`, and the :guilabel:`Start Date` entered is `06/16/24`. - - Odoo's **Time Off** app retroactively applies the allocation to the beginning of the time - period entered in the :guilabel:`Start Date`. - - Therefore, this allocation accrues time from `06/01/24`, rather than `06/16/24`. - - Additionally, if on the accrual form, the allocation references an accrual plan that grants - time *`At the end of the accrual period*, the allocation accrues time from `7/01/24` rather - than `6/18/24`. - - :guilabel:`Allocation`: Enter the amount of time that is being allocated to the employees. This field displays the time in either :guilabel:`Hours` or :guilabel:`Days`, depending on how the selected :ref:`Time Off Type ` is configured. +- :guilabel:`Employee`: Using the drop-down menu, select the employee being allocated the time off. - :guilabel:`Add a reason...`: If any description or note is necessary to explain the time off allocation, enter it in this field at the bottom of the form. @@ -83,8 +65,24 @@ information: :alt: A new allocation form with all the fields filled out for the annual two week vacation granted to all employees. -Multiple Allocations --------------------- +Accrual start date behavior +--------------------------- + +If the :guilabel:`Start Date` is in the middle of an accrual period, Odoo adjusts it to the start or +end of that period based on the *Accrued Gain Time* entered on the :ref:`accrual plan +`. + +.. example:: + - *At the start of the accrual period*: A :guilabel:`Start Date` of `06/16/25` applies from + `06/01/25` + - *At the end of the accrual period*: A :guilabel:`Start Date` of `06/18/25` applies from + `07/01/25` + +Automatic adjustments on the start date to either the begining or end of an accural period ensures +accruals align with the defined period boundaries, rather than the exact date entered. + +Multiple requests +----------------- When allocating time off, it is common to allocate time to several employees at once. This is done using the :guilabel:`Multiple Requests` feature. @@ -94,10 +92,10 @@ app --> Management --> Allocations`. Then, click the :icon:`fa-gear` :guilabel:` the upper-left corner, then click :icon:`fa-users` :guilabel:`Multiple Requests`. This reveals a :guilabel:`Multiple Requests` pop-up window. -This form is identical to the :guilabel:`Allocation` form, with an additional :guilabel:`Mode` -field. The :guilabel:`Mode` field determines how multiple employees are selected. +This form is identical to the :ref:`Allocation form `, with an additional +:guilabel:`Mode` field. The :guilabel:`Mode` field determines how multiple employees are selected. -Using the drop-down menu, select one of the following :guilabel:`Modes`: +Using the drop-down menu, select a :guilabel:`Mode` from one of the following options: - :guilabel:`By Employee`: This option allows for the selection of multiple individual employees that are unrelated in terms of department, company, or tags. Selecting this reveals an @@ -126,9 +124,31 @@ desired. Fill out the remainder of the :ref:`Multiple Requests form `, then click :guilabel:`Create Allocations` when done. -.. image:: allocations/multiple-requests.png - :alt: An allocation request form filled out for sick time for all employees within the sales - department. +.. example:: + A company hosts an annual picnic, including a raffle. There are five raffle prizes for a free + vacation day, which must be redeemed by the end of the year. The winners of this raffle all have + the tag `Raffle Winner - 2025 Employee Picnic Prize` added to their employee profiles. + + The time off officer creates multiple allocations, and configures the :ref:`Multiple Requests + form ` as follows: + + The name for the allocation is :guilabel:`Vacation Day - Raffle Prize - 2025 Picnic`. The + :guilabel:`Mode` is set to :guilabel:`By Employee Tag`, and the :guilabel:`Tag` identified is + :guilabel:`Raffle Winner - 2025 Employee Picnic Prize`. + + The :guilabel:`Time Off Type` is set to :guilabel:`Vacation Time Off`, with the + :guilabel:`Allocation Type` set to :guilabel:`Regular Allocaiton`, since the time off is given up + front, and is not *earned*. + + The :guilabel:`Validity Period` is set to :guilabel:`07/18/2025` :icon:`oi-arrow-right` + :guilabel:`12/31/2025`, since the compnay picnic was that day, and the earned vacation day + expires at the end of the year. + + The :guilabel:`Allocation` is set to :guilabel:`1.00 Days`, and `A bonus vacation day won at the + annual Company Picnic.` appears in the details at the bottom. + + .. image:: allocations/multiple-requests.png + :alt: An allocation request form filled out for a bonus vacation day for raffle winners. .. _time_off/request-allocation: @@ -146,13 +166,15 @@ list view. Both buttons open a new allocation request form. .. note:: Both options open a new allocation request form, but when requested from the :guilabel:`Dashboard`, the form appears in a pop-up window, and the *Validity Period* field does - **not** appear. When requested from the :guilabel:`My Allocations` list view, the screen - navigates to a new allocation request page, instead of presenting a pop-up window. + **not** appear. + + When requested from the :guilabel:`My Allocations` list view, the screen navigates to a new + allocation request page, instead of presenting a pop-up window. Enter the following information on the new allocation request form: -- :guilabel:`Time Off Type`: Select the type of time off being requested for the allocation from the - drop-down menu. After a selection is made, the title updates with the time off type. +- :guilabel:`Time Off Type`: Using the drop-down menu, select the type of time off being requested + for the allocation. After a selection is made, the title updates with the time off type. - :guilabel:`Validity Period`: By default, the current date populates this field, and it is **not** able to be modified. This field **only** appears when requesting an allocation from the :guilabel:`My Allocations` view (:menuselection:`Time Off --> My Time --> My Allocations`). @@ -167,8 +189,7 @@ If the request was created from the :guilabel:`Dashboard`, click the :guilabel:` on the :guilabel:`New Allocation` pop-up window to save the information and submit the request. If the form was completed from the :guilabel:`My Allocations` list view, the information is -automatically saved as it is entered. However, the form can be saved manually at any time by -clicking the :icon:`fa-cloud-upload` :guilabel:`(cloud upload)` icon. +automatically saved as it is entered. .. image:: allocations/allocation-request.png :alt: An allocation request form filled out for an employee requesting an additional week of diff --git a/content/applications/hr/time_off/allocations/multiple-requests.png b/content/applications/hr/time_off/allocations/multiple-requests.png index 3b34f88ec3..2eb10e9030 100644 Binary files a/content/applications/hr/time_off/allocations/multiple-requests.png and b/content/applications/hr/time_off/allocations/multiple-requests.png differ diff --git a/content/applications/hr/time_off/allocations/new-allocation.png b/content/applications/hr/time_off/allocations/new-allocation.png index ac38c86faa..359ca91723 100644 Binary files a/content/applications/hr/time_off/allocations/new-allocation.png and b/content/applications/hr/time_off/allocations/new-allocation.png differ diff --git a/content/applications/hr/time_off/management.rst b/content/applications/hr/time_off/management.rst index a53cd24deb..070ab07345 100644 --- a/content/applications/hr/time_off/management.rst +++ b/content/applications/hr/time_off/management.rst @@ -6,10 +6,10 @@ Management Time off and allocation requests undergo an approval process before being granted. Requests either need one or two approvals, if any, depending on how the specific type of time off is configured. All -these configurations can be found under the *Management* section of the *Time Off* application. +these configurations can be found under the *Management* section of the **Time Off** application. -Only people who can approve allocation and time off requests have the :guilabel:`Management` section -visible in the *Time Off* application. +Only users who can :ref:`approve allocation and time off requests ` see the +:guilabel:`Management` section in the **Time Off** application. .. _time_off/manage-time-off: @@ -20,13 +20,12 @@ To view time off requests that need approval, navigate to :menuselection:`Time O Management --> Time Off`. Doing so reveals the :guilabel:`All Time Off` page. The only time off requests that are visible on this page belong to employees the user either has -:guilabel:`Time Off Officer` or :guilabel:`Administrator` access rights for in the *Time Off* +:guilabel:`Time Off Officer` or :guilabel:`Administrator` access rights for in the **Time Off** application. -The default filter on the :guilabel:`All Time Off` page is `Waiting For Me`. - -This filter only presents time off requests that need to be approved for current employees on the -user's team, with a status of either :guilabel:`To Approve` or :guilabel:`Second Approval`. +The default filter on the :guilabel:`All Time Off` page is :icon:`fa-filter` :guilabel:`Waiting For +Me`. This filter only presents time off requests that need to be approved for current employees on +the user's team, with a status of either :guilabel:`To Approve` or :guilabel:`Second Approval`. On the left side of the :guilabel:`All Time Off` page, there are various grouping options that can be used to narrow down the presented time off requests, located beneath the :guilabel:`Status` and @@ -39,8 +38,8 @@ The various departments the user is a member of, and manages employees under, al left side of the page, under :guilabel:`Departments`. .. note:: - If there are no requests that fall under one of the status options or departments, that status - or department is **not** visible on the left-side menu. + If no requests fall under one of the status options or departments, that status or department is + **not** visible on the left-side menu. To only display time off requests for specific departments, click on the :guilabel:`Department` on the left-hand side of the page. Only requests within the selected department are then presented. @@ -51,7 +50,7 @@ color. The :guilabel:`To Approve` and :guilabel:`Second Approval` requests are highlighted in yellow, and are the only ones that appear in the list by default. -If the `Waiting For Me` filter is removed, all statuses appear. +If the :icon:`fa-filter` :guilabel:`Waiting For Me` filter is removed, all statuses appear. :guilabel:`Approved` requests are highlighted in green, :guilabel:`To Submit` (drafts) requests are highlighted in blue, and the :guilabel:`Refused` requests are highlighted in gray. @@ -66,7 +65,6 @@ To refuse a request, click the :icon:`fa-times` :guilabel:`Refuse` button at the line. .. image:: management/time-off-requests.png - :align: center :alt: Time off requests with the filter, groupings, and status sections highlighted. For more details, click anywhere on the time off request line (except for the :icon:`fa-thumbs-up` @@ -89,11 +87,11 @@ To view allocations that need approval, navigate to :menuselection:`Time Off app Allocations`. Doing so reveals the :guilabel:`Allocations` page. The user is only presented with allocations for employees they have either :guilabel:`Time Off -Officer` or :guilabel:`Administrator` access rights for in the *Time Off* application. +Officer` or :guilabel:`Administrator` access rights for in the **Time Off** application. -The default filters configured on the :guilabel:`Allocations` page are :guilabel:`My Team` and -:guilabel:`Active Employee`. These default filters *only* present employees on the user's team (who -they manage) and active employees. Inactive records are not shown. +The default filters configured on the :guilabel:`Allocations` page are :guilabel:`First Approval` +and :guilabel:`My Team`. These default filters only present employees that the user manages and are +awaiting their first approval. Approved and refused allocation requests are not shown. The left side of the :guilabel:`Allocations` page has various grouping options to narrow down the presented allocation requests. @@ -125,25 +123,23 @@ allocations for that specific department. :icon:`fa-times` :guilabel:`(remove)` icon on the specific filter to remove it. The status column displays the status of each request, with the status highlighted in a specific -color. - -The :guilabel:`To Approve` requests are highlighted in yellow, :guilabel:`Approved` requests are -highlighted in green, and the :guilabel:`Refused` requests are highlighted in gray. +color. The :guilabel:`To Approve` requests are highlighted in yellow, and if the default +:guilabel:`First Approval` filter is removed, the :guilabel:`Approved` requests are highlighted in +green, and the :guilabel:`Refused` requests are highlighted in gray. -To approve an allocation request, click the :icon:`fa-check` :guilabel:`Validate` button at the end -of the line. To refuse a request, click the :icon:`fa-times` :guilabel:`Refuse` button. +To approve an allocation request, click the :icon:`fa-thumbs-up` :guilabel:`Approve` button at the +end of the line. To refuse a request, click the :icon:`fa-times` :guilabel:`Refuse` button. .. image:: management/allocations.png - :align: center :alt: Allocations with the filter, groupings, and status sections highlighted. If more details are needed, click anywhere on the allocation request line (except for the -:icon:`fa-check` :guilabel:`Validate` or :icon:`fa-times` :guilabel:`Refuse` buttons) to view the +:icon:`fa-thumbs-up` :guilabel:`Approve` or :icon:`fa-times` :guilabel:`Refuse` buttons) to view the specific request in detail, via the allocation request form. Depending on the rights of the user, changes can be made to the allocation request form that appears. To modify the request, make any desired changes to the form. All changes are automatically saved. -It is also possible to approve or refuse the request from this form. Click the :guilabel:`Validate` +It is also possible to approve or refuse the request from this form. Click the :guilabel:`Approve` button to approve, or the :guilabel:`Refuse` button to refuse the request. diff --git a/content/applications/hr/time_off/management/allocations.png b/content/applications/hr/time_off/management/allocations.png index d4df92adad..30465bfa46 100644 Binary files a/content/applications/hr/time_off/management/allocations.png and b/content/applications/hr/time_off/management/allocations.png differ diff --git a/content/applications/hr/time_off/management/time-off-requests.png b/content/applications/hr/time_off/management/time-off-requests.png index b2a24767a5..70467200d9 100644 Binary files a/content/applications/hr/time_off/management/time-off-requests.png and b/content/applications/hr/time_off/management/time-off-requests.png differ diff --git a/content/applications/hr/time_off/mandatory.png b/content/applications/hr/time_off/mandatory.png index 2220be9592..6226b49eec 100644 Binary files a/content/applications/hr/time_off/mandatory.png and b/content/applications/hr/time_off/mandatory.png differ diff --git a/content/applications/hr/time_off/milestone.png b/content/applications/hr/time_off/milestone.png index 8470176eae..c2666c022b 100644 Binary files a/content/applications/hr/time_off/milestone.png and b/content/applications/hr/time_off/milestone.png differ diff --git a/content/applications/hr/time_off/my_time.rst b/content/applications/hr/time_off/my_time.rst index 86e9a73efb..62afc00f8f 100644 --- a/content/applications/hr/time_off/my_time.rst +++ b/content/applications/hr/time_off/my_time.rst @@ -2,22 +2,24 @@ My time ======= -The *My Time* menu of the *Time Off* application houses all the various time off information for -the signed-in user. +The *My Time* menu of the **Time Off** app houses all the various time off information for the +signed-in user. -This includes the main *Time Off* dashboard, which displays an overview of the various time off -balances, as well as time-off requests and allocations. +This includes the main **Time Off** :ref:`dashboard `, which displays an +overview of the various time off balances, as well as :ref:`time-off requests +` and :ref:`allocations `. .. _time_off/dashboard: Dashboard ---------- +========= -All users have access to the *Time Off* :guilabel:`Dashboard`, which is the first page that appears -when the *Time Off* application is opened. The :guilabel:`Dashboard` can also be accessed at any +All users have access to the **Time Off** :guilabel:`Dashboard`, which is the first page that +appears when the **Time Off** app is opened. The :guilabel:`Dashboard` can also be accessed at any point in the application, by navigating to :menuselection:`Time Off app --> My Time --> Dashboard`. -The current year is displayed, and the current day is highlighted in a red circle. +The dashboard shows a summary of the user's time off, and the entire current year, with the current +day highlighted in a red circle. To change the view, click on the :guilabel:`Year` button to reveal a drop-down menu. Then, select either :guilabel:`Day`, :guilabel:`Week`, or :guilabel:`Month` to present the calendar in that @@ -44,7 +46,6 @@ off summary. The complete details are presented in a popover window, including t scheduled, :guilabel:`Planned` time off, and the currently :guilabel:`Available` time off. .. image:: my_time/balance-details.png - :align: center :alt: A view of the complete time off balance details in the popover window. A user can also select a future date to see an estimate of how much time they should accrue by that @@ -79,16 +80,16 @@ Allocation Request` button to request more time off, and a :ref:`New Allocation ` pop-up window appears. .. image:: my_time/dashboard.png - :align: center :alt: Time off dashboard view with the legend, time off summaries, and view buttons highlighted. .. _time_off/my-time-off: My time off ------------ +=========== -To view a list of all the time off requests, navigate to :menuselection:`Time Off app --> My Time ---> My Time Off`. Here, all time off requests, both past and present, appear in a list view. +To view a list of all the signed-in user's time off requests, navigate to :menuselection:`Time Off +app --> My Time --> My Time Off`. Here, all time off requests, both past and present, appear in a +list view, grouped by month. The list includes the following information for each request: the :guilabel:`Time Off Type`, :guilabel:`Description`, :guilabel:`Start Date`, :guilabel:`End Date`, :guilabel:`Duration`, and @@ -97,17 +98,24 @@ The list includes the following information for each request: the :guilabel:`Tim A new time off request can be made from this view. Click the :guilabel:`New` button to :doc:`request_time_off`. +.. image:: my_time/my-time.png + :alt: My Time list view with all requests. + .. _time_off/my-allocations: My allocations --------------- +============== To view a list of all allocations, navigate to :menuselection:`Time Off app --> My Time --> My Allocations`. All allocations and requested allocations appear in a list view. The information presented on the :guilabel:`My Allocations` page includes: :guilabel:`Time Off -Type`, :guilabel:`Description`, :guilabel:`Amount`, :guilabel:`Allocation Type`, and -:guilabel:`Status`. +Type`, :guilabel:`Amount`, :guilabel:`Allocation Type`, :guilabel:`Accrual Plan`, and +:guilabel:`Status`. If the signed-in user has the appropriate access rights, they may also see an +option to :guilabel:`Approve` requests, if applicable. A new allocation request can be made from this view, as well. Click the :guilabel:`New` button to :ref:`request an allocation `. + +.. image:: my_time/my-allocations.png + :alt: My Allocations list view with all requests. diff --git a/content/applications/hr/time_off/my_time/balance-details.png b/content/applications/hr/time_off/my_time/balance-details.png index b4b29a9bc4..9c9d8602c8 100644 Binary files a/content/applications/hr/time_off/my_time/balance-details.png and b/content/applications/hr/time_off/my_time/balance-details.png differ diff --git a/content/applications/hr/time_off/my_time/dashboard.png b/content/applications/hr/time_off/my_time/dashboard.png index 0e0f124588..fece1bf242 100644 Binary files a/content/applications/hr/time_off/my_time/dashboard.png and b/content/applications/hr/time_off/my_time/dashboard.png differ diff --git a/content/applications/hr/time_off/my_time/my-allocations.png b/content/applications/hr/time_off/my_time/my-allocations.png new file mode 100644 index 0000000000..74a2e73e66 Binary files /dev/null and b/content/applications/hr/time_off/my_time/my-allocations.png differ diff --git a/content/applications/hr/time_off/my_time/my-time.png b/content/applications/hr/time_off/my_time/my-time.png new file mode 100644 index 0000000000..12ecefb7f4 Binary files /dev/null and b/content/applications/hr/time_off/my_time/my-time.png differ diff --git a/content/applications/hr/time_off/overview.png b/content/applications/hr/time_off/overview.png index 33cbd78c26..11c1923db1 100644 Binary files a/content/applications/hr/time_off/overview.png and b/content/applications/hr/time_off/overview.png differ diff --git a/content/applications/hr/time_off/reporting.rst b/content/applications/hr/time_off/reporting.rst new file mode 100644 index 0000000000..6e734327cd --- /dev/null +++ b/content/applications/hr/time_off/reporting.rst @@ -0,0 +1,101 @@ +========= +Reporting +========= + +The **Time Off** app's reporting feature lets managers view team time off by employee, type, or +remaining balances. This allows managers to see :ref:`who is taking time off, how much they have +used `, :ref:`which types are more commonly used `, and +:ref:`how much each employee still has available `. + +Any report can be added to a spreadsheet, when in either the :icon:`fa-area-chart` +:guilabel:`(Graph)` or :icon:`oi-view-pivot` :guilabel:`(Pivot)` view, through the *Insert in +Spreadsheet* button that appears in the top-left of a report. + +.. note:: + If the **Documents** app is installed, an option to add the report to a spreadsheet appears. If + not, the report can be added to a *Dashboard*. + +.. _time_off/by-employee: + +By employee +=========== + +Viewing time off by employee helps managers track usage patterns, monitor remaining balances, ensure +policy compliance, and plan coverage for upcoming absences. To view a list of employee time off +requests, navigate to :menuselection:`Time Off app --> Reporting --> by Employee`. + +The default report presents the current year's data in a list view, displaying all the employees in +alphabetical order. Each employee's line is collapsed by default. To expand a line, click anywhere +on the line. + +The view expands, and has the time off requests organized by time off type. Click anywhere on a time +off type line to expand it, and view all the individual time off requests that fall under that type. + +The information shown in the list includes: the :guilabel:`Employee` name, :guilabel:`Number of +Days` off requested, the :guilabel:`Start Date`, :guilabel:`End Date`, :guilabel:`Status`, and +:guilabel:`Description`. + +.. image:: reporting/employee-report.png + :alt: Report of time off, shown by each employee in a list view. + +The report can be displayed in other ways, as well. Click the corresponding button option in the +top-right corner of the page to view the data in that specific way. The various options are a +:icon:`oi-view-list` :guilabel:`(List)`, or default view, :icon:`fa-area-chart` :guilabel:`(Graph)`, +:icon:`oi-view-pivot` :guilabel:`(Pivot)` table, or :icon:`fa-calendar` :guilabel:`(Calendar)` view. + +When a selection has been made, additional options appear for that particular selection. For more +detailed information on the reports and their various options, refer to the :doc:`reporting +<../../essentials/reporting>` documentation. + +.. _time_off/by_type: + +By type +======= + +Viewing company-wide time off by type can help managers determine if employees are using their time +off, which types are used more than others, and can spot any trends. High totals in certain time off +types, like sick time off, can indicate health or morale concerns. + +To view a graph of all time off, organized by time off type, navigate to :menuselection:`Time Off +app --> Reporting --> by Type`. This shows all time off requests in a default bar chart. + +Hover over a bar to view the :guilabel:`Duration (Days)` of that specific time off type. + +.. image:: reporting/bar-chart.png + :alt: The various time off types, and how many days requested, in a bar chart. Details are + highlighted in a red box. + +Click on a bar to go to a detailed list view of all the time off requests for that time off type. + +Each request is listed, with the following information displayed: the :guilabel:`Employee`, +:guilabel:`Number of Days`, :guilabel:`Request Type`, :guilabel:`Start Date`, :guilabel:`End Date`, +:guilabel:`Status`, and the :guilabel:`Description`. + +The report can be displayed in other ways, as well. Click the corresponding button option in the +top-right corner of the page to view the data in that way. The various options are a +:icon:`fa-area-chart` :guilabel:`(Graph)` (the default view), :icon:`oi-view-list` +:guilabel:`(List)`, or :icon:`oi-view-pivot` :guilabel:`(Pivot)` table. + +When a selection has been made, additional options appear for that particular selection. For more +detailed information on the reports, and their various options, refer to the :doc:`reporting +<../../essentials/reporting>` documentation. + +.. _time_off/balance: + +Balance +======= + +When some time off types have restrictions, such as rollover rules and balance limits, viewing time +off balances can help managers see a high-level overview of time off. If certain employees have a +lot of time that will expire soon, they can inform their employees and adjust scheduled accordingly +to be prepared for their absences. + +To view a pivot table of all time off balances, organized by time off type, then further organized +by how many days and hours are :guilabel:`Left` and :guilabel:`Planned`, navigate to +:menuselection:`Time Off app --> Reporting --> Balance`. + +This shows all time off balances in a default pivot table. The employees populate the rows, while +the various time off types and balances populate the columns. + +.. image:: reporting/balance.png + :alt: The various time off balances, in a pivot table. diff --git a/content/applications/hr/time_off/reporting/balance.png b/content/applications/hr/time_off/reporting/balance.png new file mode 100644 index 0000000000..235849247d Binary files /dev/null and b/content/applications/hr/time_off/reporting/balance.png differ diff --git a/content/applications/hr/time_off/bar-chart.png b/content/applications/hr/time_off/reporting/bar-chart.png similarity index 100% rename from content/applications/hr/time_off/bar-chart.png rename to content/applications/hr/time_off/reporting/bar-chart.png diff --git a/content/applications/hr/time_off/employee-report.png b/content/applications/hr/time_off/reporting/employee-report.png similarity index 100% rename from content/applications/hr/time_off/employee-report.png rename to content/applications/hr/time_off/reporting/employee-report.png diff --git a/content/applications/hr/time_off/request_time_off.rst b/content/applications/hr/time_off/request_time_off.rst index 6ab9b63c0f..cf0070b35a 100644 --- a/content/applications/hr/time_off/request_time_off.rst +++ b/content/applications/hr/time_off/request_time_off.rst @@ -2,25 +2,41 @@ Request time off ================ -Once time off has been allocated to an employee, a request to use it can be submitted. +When employees wish to take time off, they first submit a time off request through the **Time Off** +application. Once their request has been submitted, it is then reviewed by either the employee's +manager or their time off officer (depending on who the employee's :ref:`time off approver is +`). -Time off can be requested in one of two ways: either from the main *Time Off* application -:guilabel:`Dashboard` (:menuselection:`Time Off app --> My Time --> Dashboard`), or from the -:guilabel:`My Time Off` dashboard view (:menuselection:`Time Off app --> My Time --> My Time Off`). +.. note:: + If the time off type the employee is requesting :ref:`does not require approval + `, the time off is automatically approved, and does not need to be + reviewed. -To create a new request for time off, click the :guilabel:`New` button on either the main *Time Off* -:guilabel:`Dashboard` or the :guilabel:`My Time Off` dashboard, in the default list view. +Submit time off request +======================= -.. note:: - Both :guilabel:`New` buttons allow the user to request time off, but when requested from the - :guilabel:`Dashboard`, a :guilabel:`New Time Off` request form appears in a pop-up window. When - requested from the :guilabel:`My Time Off` list view, the screen navigates to a new time off - request page, instead. +To request time off, click the :guilabel:`New` button in the top-left corner of the **Time Off** app +dashboard, and a :guilabel:`New Time Off` pop-up form loads. + +Fill out the :ref:`fields on the form `, and then click :guilabel:`Save & Close` to +submit the request. + +.. tip:: + Requesting time off can be done either form the main **Time Off** app dashboard, or by navigating + to :menuselection:`Time Off --> My Time --> My Time Off`, and clicking :guilabel:`New`. + +.. image:: request_time_off/new-time-off.png + :alt: A time off request for three hours of vacation time off. + +.. _time_off/fields: + +Time off fields +--------------- Enter the following information on the :guilabel:`New Time Off` request form: -- :guilabel:`Time Off Type`: select the type of time off being requested from the drop-down menu. -- :guilabel:`Dates`: enter the dates that the time off falls under. There are two fields to +- :guilabel:`Time Off Type`: Using the drop-down menu, select the type of time off being requested. +- :guilabel:`Dates`: Enter the dates that the time off falls under. There are two fields to populate: the start and end dates. Click on either date field and a popover calendar appears. Click on the start date, then click on the end date. The selected start and end dates are circled, @@ -36,35 +52,27 @@ Enter the following information on the :guilabel:`New Time Off` request form: If the selected :guilabel:`Time Off Type` is configured to have the time off taken in hours, the following two fields also appear: - - :guilabel:`Half Day`: if the time off request is for a half day, tick this checkbox. When this + - :guilabel:`Half Day`: If the time off request is for a half day, tick this checkbox. When this is selected, the second date field disappears, and is replaced with a drop-down menu. From that drop-down menu, select either :guilabel:`Morning` or :guilabel:`Afternoon` to indicate which - half of the day is being requested. - - :guilabel:`Custom Hours`: if the time off requested is not a whole or half day, tick this + half of the day is being requested off. + - :guilabel:`Custom Hours`: If the time off requested is not a whole or half day, tick this checkbox. If selected, a :guilabel:`From` and :guilabel:`To` field appears beneath this option. Using the drop-down menu, select the start and end time for the time off request. -- :guilabel:`Duration`: this field updates automatically once the :guilabel:`Date` section is - completed. If the :guilabel:`Date` section is modified, this section automatically updates to - reflect the total time off requested. This field is in either hours or days, depending on how the - selected :guilabel:`Time Off Type` is configured. -- :guilabel:`Description`: enter a description for the time off request. This should include any +- :guilabel:`Requested (Days/Hours)`: This field updates automatically once the :guilabel:`Date` + section is completed. If the :guilabel:`Date` section is modified, this section automatically + updates to reflect the total time off requested. This field is in either hours or days, depending + on how the selected :ref:`Time Off Type ` is configured. +- :guilabel:`Description`: Enter a description for the time off request. This should include any details that managers and approvers may need to approve the request. -- :guilabel:`Supporting Document`: this field only appears if the :guilabel:`Time Off Type` selected - allows for the attachment of documents. Click the :guilabel:`Attach File` button, and a file - explorer window appears. +- :guilabel:`Supporting Document`: This field **only** appears if the :ref:`Time Off Type + ` selected allows for the attachment of documents. Click the + :icon:`fa-paperclip` :guilabel:`Attach File` button, and a file explorer window appears. Navigate to the desired files that should be attached, select them, then click The :guilabel:`Open` button. The files then appear on the time off request form. Multiple documents can be attached, if necessary. -If the request was created from the :guilabel:`Dashboard`, click the :guilabel:`Save & Close` button -to save the information, and submit the request. - -If the form was completed from the :guilabel:`My Time Off` list view, the information is -automatically saved as it is entered. However, the form can be saved manually at any time by -clicking the :icon:`fa-cloud-upload` :guilabel:`(cloud upload)` icon. - .. image:: request_time_off/time-off-request.png - :align: center - :alt: A time off request form filled out for an employee home sick for two days with the flu. + :alt: A time off request form filled out for an employee home sick with the flu. diff --git a/content/applications/hr/time_off/request_time_off/new-time-off.png b/content/applications/hr/time_off/request_time_off/new-time-off.png new file mode 100644 index 0000000000..226607dd02 Binary files /dev/null and b/content/applications/hr/time_off/request_time_off/new-time-off.png differ diff --git a/content/applications/hr/time_off/request_time_off/time-off-request.png b/content/applications/hr/time_off/request_time_off/time-off-request.png index 5c13230a01..3fd2cec5a8 100644 Binary files a/content/applications/hr/time_off/request_time_off/time-off-request.png and b/content/applications/hr/time_off/request_time_off/time-off-request.png differ diff --git a/content/applications/hr/time_off/time-off-type-form-bottom.png b/content/applications/hr/time_off/time-off-type-form-bottom.png index 2843929d94..d8c4da8e8c 100644 Binary files a/content/applications/hr/time_off/time-off-type-form-bottom.png and b/content/applications/hr/time_off/time-off-type-form-bottom.png differ diff --git a/content/applications/hr/time_off/time-off-type-form-top.png b/content/applications/hr/time_off/time-off-type-form-top.png index 329ebe12f7..f80a48d83e 100644 Binary files a/content/applications/hr/time_off/time-off-type-form-top.png and b/content/applications/hr/time_off/time-off-type-form-top.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup.rst b/content/applications/inventory_and_mrp/barcode/setup.rst index d29fdfae5d..7654f27cd9 100644 --- a/content/applications/inventory_and_mrp/barcode/setup.rst +++ b/content/applications/inventory_and_mrp/barcode/setup.rst @@ -11,3 +11,5 @@ Setup setup/device_troubleshooting setup/hardware setup/software + setup/serial_numbers_lots + setup/operation_types diff --git a/content/applications/inventory_and_mrp/barcode/setup/operation_types.rst b/content/applications/inventory_and_mrp/barcode/setup/operation_types.rst new file mode 100644 index 0000000000..da99121665 --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode/setup/operation_types.rst @@ -0,0 +1,216 @@ +============================ +Operation types and commands +============================ + +Inventory operations, like :doc:`receipts and delivery orders +<../../inventory/shipping_receiving/daily_operations/receipts_delivery_one_step>`, as well as +commands, like validating a transfer or putting products in packages, can be performed by scanning +barcodes through the **Barcode** app. This allows employees to handle tasks and access menus without +the need to touch a screen or use the **Inventory** app on a computer, and allows workflow +streamlining by putting operation barcodes in the appropriate physical location. + +.. image:: operation_types/barcode-default-operations.png + :alt: Printable barcodes for Receipts, Delivery Orders, and Manufacturing. + +.. _inventory/barcode/configure_operations: + +Configuring operations +====================== + +*Operation types* in the **Inventory** and **Barcode** apps define actions that will change the +state of products in inventory. Which operation types are available to print will depend on the +settings of the database. By default, barcodes can be printed for *Receipts (WHIN)*, *Delivery +Orders (WHOUT)*, and *Manufacturing (WHMANUF)*. The *Internal Transfers (WHINT)* and *Pick (WHPICK)* +operations can also be enabled. + +.. note:: + Both *Internal Transfers (WHINT)* and *Pick (WHPICK)* operations require :doc:`location barcodes + ` to scan. + +Internal transfers +------------------ + +The *Internal Transfers (WHINT)* operation barcode is available if the database is using the +*Storage Locations* feature to designate where products are located in the inventory. To enable this +setting, go to :menuselection:`Inventory app --> Configuration --> Settings`, then, in the +:guilabel:`Warehouse` section, tick the :guilabel:`Storage Locations` option. + +Picking +------- + +The *Pick (WHPICK)* operation barcode is available if the database is using the *Multi-Step Routes* +feature configured with a picking step. To enable this setting, go to :menuselection:`Inventory app +--> Configuration --> Settings`, then, in the :guilabel:`Warehouse` section, tick the +:guilabel:`Multi-Step Routes` option and save. From there, click :icon:`fa-arrow-right` +:guilabel:`Set Warehouse Routes` to open warehouse settings and select the warehouse. In the +:guilabel:`Outgoing Shipments` section, select either :guilabel:`Pick then Deliver (2 steps)` or +:guilabel:`Pick, Pack, then Deliver (3 steps)`. + +.. seealso:: + - :doc:`Two-step receipt and delivery + <../../inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps>` + - :doc:`Three-step delivery + <../../inventory/shipping_receiving/daily_operations/delivery_three_steps>` + +Print barcodes for inventory commands and operations +==================================================== + +Barcodes for operations and commands can be printed at any time. These documents will include all +the available inventory commands, regardless of whether they are enabled, but only the operations +that are currently enabled in the database. See :ref:`configuring operations +` to enable any missing operations. + +.. example:: + The `print_inventory_commands_and_operation_types` document will always show the + :guilabel:`PUT IN PACK` command, regardless of whether the *Packages* feature is enabled, but the + *Pick (WHPICK)* operation will only be added if *Multi-Step Routes* are configured to have a + picking step. + +.. important:: + Printing barcodes, by default, will either directly download a PDF file of the selected barcodes + or open a new tab with a downloadable or printable PDF. To turn this into a direct printing + operation, :doc:`connect a printer <../../../general/iot/devices/printer>`. + +When first opening Barcode +-------------------------- + +When first opening the **Barcode** app, there is a prompt with options to print barcodes for +commands and operations, as well as some sample barcodes to print and use for testing. Clicking +these links is the easiest way to print command and operation barcodes, but will no longer be +displayed after the first time it is clicked. + +.. image:: operation_types/barcode-initial-print-prompt.png + :alt: A prompt to print demo data or barcodes for operations. + +From Inventory settings +----------------------- + +If the barcode print prompt is not available, inventory commands and operation types barcodes can +always be printed from the *Settings* page. Go to :menuselection:`Inventory app --> Configuration +--> Settings` and in the :guilabel:`Barcode` section under the :guilabel:`Barcode Scanner` setting, +click :icon:`fa-print` :guilabel:`Print barcode commands and operation types`. + +.. image:: operation_types/print-operations-and-commands.png + :alt: Link to print inventory operations and commands. + +Individual operations +--------------------- + +Barcodes for individual operations, like receipts and manufacturing orders, can also be printed from +the *Operations Types* configuration menu. To select operations to print, go to +:menuselection:`Inventory app --> Configuration --> Operations Types` and tick the box by each +operation type required. + +.. image:: operation_types/barcode-print-operations.png + :alt: Available operations selected making a 'Print' button appear. + +Next, click the :icon:`fa-print` :guilabel:`Print` button and select either :guilabel:`Operation +type (PDF)` to download a PDF with the operation barcodes, or :guilabel:`Operation type (ZPL)` to +send the print job to a :ref:`ZPL-enabled printer `. + +.. note:: + The :icon:`fa-print` :guilabel:`Print` button does not appear until at least one operation type + is selected. + +.. _inventory/barcode/print_order: + +Print picking operations for specific orders +============================================ + +Receipts, manufacturing orders, transfers, and delivery orders can all be printed in advance and are +referred to in the print options menu as *picking operations* or *picking*. + +In Barcode +---------- + +From the **Barcode** app, tap the :guilabel:`Operations` button, select the operation type, and then +the specific order to print. From there, either scan the `PRINT PICKING OPERATION` barcode if there +is one available, or tap the :icon:`fa-cog` :guilabel:`(gear)` icon to open the **Barcode** actions +menu and tap the :guilabel:`Print Picking Operation` button. + +.. image:: operation_types/print-picking-barcode-cog.png + :alt: Menu from a receipt with the 'Print Picking Operation' button. + +In Inventory +------------ + +To print a picking from the **Inventory** app, click the appropriate operation type (*Receipt*, +*Delivery Order*, etc.) and select the individual order or the operation. + +From the order, click the :icon:`fa-cog` :guilabel:`(Actions)` icon, hover over :icon:`fa-print` +:guilabel:`Print`, and click :guilabel:`Picking Operations`. + +.. note:: + The type of operation can be inferred from the operation reference to help distinguish picking + operations. For example, the "IN" in `WH/IN/00012` indicates that it is a receipt operation. + These references are similar to, but do not exactly match the operation type barcodes. + +Use barcodes for inventory operations and commands +================================================== + +Operations +---------- + +- **Receipts** `WHIN` creates a new order to receive products into inventory. + + .. warning:: + Scanning a barcode for a receipt will always create a *new* instance of that operation, and + will not match an already scheduled order. To scan or a specific scheduled receipt, first + :ref:`print a picking for the individual receipt `. + + For example, scanning **Receipts** `WHIN` will create a brand new receipt, even if the + contents match an existing receipt exactly. + +- **Delivery Orders** `WHOUT` opens the currently scheduled delivery orders. +- **Manufacturing** `WHMANUF` creates a new manufacturing order. Scanning a product barcode from + here will add it to the *Producing* list. +- **Internal Transfers** `WHINT` creates a new transfer order. :doc:`Location barcodes ` + can be scanned to designate the source and destination, or scanned direction to initiate a + transfer in **Barcode**. +- **Pick** `WHPICK` creates a new picking operation. This will *require* a :doc:`location barcode + ` for the source location. + +Commands +-------- + +- `MAIN MENU`: Scan to return to the main menu from an inventory adjustment. +- `VALIDATE`: Scan to confirm that an operation is correct and ready to be completed. +- `CANCEL`: Scan from an operation to prevent that operation from being validated and set its status + to *Cancelled*. +- `PRINT PICKING OPERATION`: Scan from an existing delivery order, transfer, or receipt to generate + a PDF with the name and barcode for that operation's reference number. This can be scanned later + to go directly to the operation. +- `PRINT DELIVERY SLIP`: Scan from an existing receipt or delivery order to generate a PDF of the + purchase order or delivery order. This will not include a barcode. +- `PUT IN PACK`: After scanning products, this command will designate them as all being in one + :doc:`package <../../inventory/product_management/configure/package>`. Products scanned *after* + this command are placed in a new package if the `PUT IN PACK` command is scanned again. +- `SCRAP`: Scan this to mark a scanned product as defective, and move it to a virtual location for + :doc:`scrap inventory <../../inventory/warehouses_storage/inventory_management/scrap_inventory>` + +Print barcodes for manufacturing commands +========================================= + +By default, the :guilabel:`Manufacturing` operation type can scan products and components and tap a +*Produce* button to produce them. To print barcodes for basic manufacturing operations, go to +:menuselection:`Manufacturing app --> Configuration --> Settings`, then, in the +:guilabel:`Operations` section, make sure the :guilabel:`Barcode Scanner` box is ticked and click +:icon:`fa-print` :guilabel:`Print barcode commands and operation types`. + +Work order commands +------------------- + +To enable more granular control of the manufacturing process through **Barcode**, enable the +:doc:`Work Orders <../../manufacturing/basic_setup/bill_configuration>` feature. To print barcodes +for work orders, go to :menuselection:`Manufacturing app --> Configuration --> Settings`, then, in +the :guilabel:`Operations` section, make sure the :guilabel:`Work Orders` box is ticked and click +:icon:`fa-print` :guilabel:`Print barcode commands`. + +.. image:: operation_types/print-work-order-commands.png + :alt: 'Print barcode commands' like in the Work Orders section of Manufacturing settings. + +.. seealso:: + - `Odoo Tutorials: Process and Cancel MOs Using Barcodes + `_ + - `Odoo Tutorials: Consuming Components Using Barcodes + `_ diff --git a/content/applications/inventory_and_mrp/barcode/setup/operation_types/barcode-default-operations.png b/content/applications/inventory_and_mrp/barcode/setup/operation_types/barcode-default-operations.png new file mode 100644 index 0000000000..dbb910e471 Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/operation_types/barcode-default-operations.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/operation_types/barcode-initial-print-prompt.png b/content/applications/inventory_and_mrp/barcode/setup/operation_types/barcode-initial-print-prompt.png new file mode 100644 index 0000000000..56c71392fd Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/operation_types/barcode-initial-print-prompt.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/operation_types/barcode-print-operations.png b/content/applications/inventory_and_mrp/barcode/setup/operation_types/barcode-print-operations.png new file mode 100644 index 0000000000..9546fa5e3e Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/operation_types/barcode-print-operations.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/operation_types/print-operations-and-commands.png b/content/applications/inventory_and_mrp/barcode/setup/operation_types/print-operations-and-commands.png new file mode 100644 index 0000000000..81d6849ed7 Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/operation_types/print-operations-and-commands.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/operation_types/print-picking-barcode-cog.png b/content/applications/inventory_and_mrp/barcode/setup/operation_types/print-picking-barcode-cog.png new file mode 100644 index 0000000000..2c644d36c1 Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/operation_types/print-picking-barcode-cog.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/operation_types/print-work-order-commands.png b/content/applications/inventory_and_mrp/barcode/setup/operation_types/print-work-order-commands.png new file mode 100644 index 0000000000..c498e41c43 Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/operation_types/print-work-order-commands.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots.rst b/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots.rst new file mode 100644 index 0000000000..74f222084a --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots.rst @@ -0,0 +1,135 @@ +=================================== +Barcodes for lot and serial numbers +=================================== + +The **Barcode** app saves time and prevents user errors while handling :doc:`lot +<../../inventory/product_management/product_tracking/lots>` and :doc:`serial numbers +<../../inventory/product_management/product_tracking/serial_numbers>`. Instead of typing long +sequences of characters, print and scan barcodes instead. + +Configuration +============= + +To use lot or serial numbers: + +#. They must be enabled in the database. +#. Tracking by lot or serial number must be selected for each product. + +See the :doc:`serial numbers documentation +<../../inventory/product_management/product_tracking/serial_numbers>` and :doc:`lots documentation +<../../inventory/product_management/product_tracking/lots>` to learn how to start using this +feature. + +GS1-compatible QR codes +----------------------- + +:doc:`GS1 <../operations/gs1_nomenclature>` nomenclature can be used for serial numbers and lots. + +To enable GS1 barcodes for lots and serial numbers, go to :menuselection:`Inventory app --> +Configuration --> Settings` and in the :guilabel:`Traceability` section under :guilabel:`Lots & +Serial Numbers`, tick the box for :guilabel:`Print GS1 Barcodes for Lots & Serial Numbers`. + +.. image:: serial_numbers_lots/enable-gs1-barcodes.png + :alt: Inventory settings with 'Print GS1 Barcodes for Lots & Serial Numbers' ticked. + +.. warning:: + GS1 lot and serial number barcodes require a 2D-capable scanner to be scanned. See :doc:`hardware + configuration ` to ensure that the feature is compatible with available equipment. + +.. _inventory/barcode/mandatory-scan: + +Mandatory and optional scanning +------------------------------- + +Operation types, like receipts and delivery orders, :ref:`can be configured individually +` to determine whether they require a serial or +lot number to process the operation. Additionally, the *Barcode* tab of each operation type +configures whether scanning the lot or serial number is mandatory. *Mandatory scan* specifies that +the only way to input a required serial number or lot number is by scanning a barcode, while +*optional scan* allows users to manually type in a barcode if necessary. + +To make it mandatory to scan a barcode for serial numbers and lots, go to :menuselection:`Inventory +app --> Configuration --> Operations Types` and select the operation type where barcodes should be +required for serial numbers. Then, click the :guilabel:`Barcode App` tab, and in the +:guilabel:`MANDATORY SCAN` section set :guilabel:`Lot/Serial` to :guilabel:`Mandatory Scan`. + +.. image:: serial_numbers_lots/optional-scan.png + :alt: Selecting 'Optional Scan' in the Receipts operation type. + +Barcodes for products and lots +============================== + +To print a barcode for one or multiple product lot and serial numbers, go to +:menuselection:`Inventory app --> Products --> Lots / Serial Numbers`. In the list view, tick the +checkbox for each the product to print, click the :icon:`fa-print` :guilabel:`Print` button, and +select either PDF or ZPL depending on printer setup. + +.. image:: serial_numbers_lots/select-products-to-print.png + :alt: Three selected products and a Print button showing 'Lot/Serial Number (PDF)' highlighted. + +Operations +========== + +For any product that is tracked by lot or serial number, performing an operation with barcode can be +from the main **Barcode** page by tapping :guilabel:`Operations` and tapping the desired operation +in the interface or scanning the barcode for specific picking order. Once the order is scanned, +select the product by tapping or scanning a barcode and scan the lot or serial number for each +quantity. + +.. tip:: + Because vendor lot and serial number barcodes could be damaged in transit and arrive in a state + that cannot be scanned, it is a good practice to :ref:`set serial number or lot scanning to + optional `. Otherwise, a broken barcode would block validation + of the receipt. + +For products that are starting out without a serial number, there are three options to manage them: +manually typing in the number, generating them ahead of time, or disabling serial numbers for that +operation. + +Manually input serial and lot numbers +------------------------------------- + +For instances where there are few products or rare shipments, it may be easiest to type lot or +serial numbers in at the time of receipt. After opening an existing receipt or creating a new one +and scanning the product bar code, tap the :icon:`fa-pencil` :guilabel:`(pencil)` icon. Tap the +:guilabel:`Serial/Lot Number` field and enter the serial number and tap :guilabel:`Confirm`. + +.. image:: serial_numbers_lots/manual-sn-input.png + :alt: Typing in a serial number. + +Generate serial numbers before a receipt +---------------------------------------- + +Lot and serial numbers can be generated from a scheduled receipt before the products arrive. This +has the advantage of making it possible to print all the serial numbers with the picking order for +the receipt. + +To generate lot and serial numbers, in the **Inventory** app click :guilabel:`Receipts` and select +the receipt that requires generated lot or serial numbers. In the :guilabel:`Operations` tab, find +the line for the product, and click the :icon:`fa-list` :guilabel:`(list)` icon. In the +:guilabel:`Open: Stock move` pop-up menu, click :guilabel:`Generate Serials/Lots`. + +.. image:: serial_numbers_lots/serial-number-generate.png + :alt: Generate serial numbers for an incoming shipment. + +.. seealso:: + :ref:`Assign serial numbers ` + +Disable lot and serial numbers for a receipt +-------------------------------------------- + +With lot and serial numbers disabled for an operation, products that are tracked by these methods +can be received without supplying a serial number or lot number. It is still possible to scan a +serial number at the receipt stage, but the missing numbers will need to be :ref:`created in the +Inventory app `. + +To disable the use of serial numbers for a particular operation type, go to +:menuselection:`Inventory app --> Configuration --> Operations Types` and select the operation type. +In the :guilabel:`LOTS/SERIAL NUMBERS` section, untick :guilabel:`Create New` and :guilabel:`Use +Existing ones`. + +.. note:: + The *Create New* option will require the user to supply a serial number or lot number, either by + scanning or type (if :ref:`optional scan ` is enabled), and + will not :ref:`automatically generate serial numbers + ` the way the **Inventory** app can. diff --git a/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/disable-serials-lots-for-op.png b/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/disable-serials-lots-for-op.png new file mode 100644 index 0000000000..a3f11c57a5 Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/disable-serials-lots-for-op.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/enable-gs1-barcodes.png b/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/enable-gs1-barcodes.png new file mode 100644 index 0000000000..fa67eb7535 Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/enable-gs1-barcodes.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/manual-sn-input.png b/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/manual-sn-input.png new file mode 100644 index 0000000000..7767b970aa Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/manual-sn-input.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/optional-scan.png b/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/optional-scan.png new file mode 100644 index 0000000000..84359c0714 Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/optional-scan.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/select-products-to-print.png b/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/select-products-to-print.png new file mode 100644 index 0000000000..7dd94bbc48 Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/select-products-to-print.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/serial-number-generate.png b/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/serial-number-generate.png new file mode 100644 index 0000000000..81f1d36012 Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/serial_numbers_lots/serial-number-generate.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/software.rst b/content/applications/inventory_and_mrp/barcode/setup/software.rst index 2ad959272c..a33bb0068a 100644 --- a/content/applications/inventory_and_mrp/barcode/setup/software.rst +++ b/content/applications/inventory_and_mrp/barcode/setup/software.rst @@ -1,101 +1,145 @@ ============================= -Activate the Barcodes in Odoo +Product and location barcodes ============================= -.. _inventory/barcode/software: +.. |GTIN| replace:: :abbr:`GTIN (Global Trade Item Number)` -The barcode scanning features can save you a lot of time usually lost -switching between the keyboard, the mouse and the scanner. Properly -attributing barcodes to products, pickings locations, etc. allows you to -work more efficiently by controlling the software almost exclusively -with the barcode scanner. +Inventory operations like product configuration can be streamlined by taking advantage of barcode +scanning features. Assigning barcodes to products and locations is a key step in using the +**Barcode** app, and users can conveniently populate fields with a barcode scanner. This reduces +manual entry, minimizes errors, and speeds up common tasks like product selection, location +assignment, and inventory adjustments. Configuration ============= -To use this feature, you first need to activate the *Barcode* -functionality via :menuselection:`Inventory --> Settings --> Barcode Scanner`. Once you -have ticked the feature, you can hit save. +Barcode nomenclature +-------------------- -.. image:: software/software_01.png - :align: center +Most retail products use EAN-13 barcodes, also known as Global Trade Identification Numbers (GTIN). +To create a new |GTIN| for a product, a company must have a GS1 Company Prefix. See :doc:`GS1 +nomenclature <../operations/gs1_nomenclature>` for more information about using this system. + +Odoo supports using any string as a barcode, so users can also create custom internal references to +use with barcode scanners. See :doc:`Default nomenclature <../operations/barcode_nomenclature>` to +learn about optional conventions around barcodes and default values in Odoo + +To change the barcode nomenclature, go to :menuselection:`Inventory app --> Configuration --> +Settings` and scroll down to the :guilabel:`Barcode` section to select the nomenclature under +:guilabel:`Barcode Scanner`. + +.. image:: software/barcodes-setup-change-nomenclature.png + :alt: Changing barcode nomenclature in Inventory app settings. + +.. _barcode/setup/barcodelookup: + +Barcode lookup +-------------- + +Odoo can automatically add product information using the :guilabel:`Stock Barcode Database` setting +for any :abbr:`UPC (Universal Product Code)`, :abbr:`EAN (European Article Number)`, or :abbr:`ISBN +(International Standard Book Number)` barcode. + +To enable automatic barcode look up, go to :menuselection:`Inventory app --> Configuration --> +Settings` and scroll down to the :guilabel:`Barcode` section to tick the box for :guilabel:`Stock +Barcode Database`. + +.. note:: + Databases hosted on **Odoo.sh** or **on-premise**, require :ref:`configuring an API key + `. .. _inventory/barcode/set-barcodes: -Set Product Barcodes +Set product barcodes ==================== -You can easily assign barcodes to your different products via the -*Inventory* app. To do so, go to :menuselection:`Settings --> Configure Products Barcodes`. +Barcodes can be assigned to existing products from the *Product Barcodes* configuration page or from +any product form in the **Inventory**, **Manufacturing** or **Purchase** apps. The barcode field can +be populated either by typing or using scanner input. -.. image:: software/software_02.png - :align: center +When adding a new product, the :ref:`barcode lookup feature ` can be +used to automatically find information about a product based on its barcode, and new products can be +added to the database directly from the **Barcode** app by scanning a barcode. -Then, you have the possibility to assign barcodes to your products -directly at creation on the product form. +From Barcode app +---------------- -.. image:: software/software_03.png - :align: center +New products definitions can be added to the database product lists as well as having their on-hand +inventory tracked from the **Barcode** app, if the :ref:`Barcode Lookup feature +` is enabled. To create a new receipt for scanning new products, choose +one of two methods: -.. image:: software/software_04.png - :align: center +#. From the **Barcode** front page, tap :guilabel:`Operations`, tap :guilabel:`Receipts`, and then + tap the :guilabel:`New` button. +#. Scan a printed :guilabel:`Receipts (WHIN)` inventory command barcode. -.. note:: - Be careful to add barcodes directly on the product variants and not on - the template product. Otherwise, you won’t be able to differentiate - them. +.. image:: software/barcode-new-receipt.png + :alt: Empty new receipt form. -.. _barcode/setup/location: +Scanning a product that is not currently in inventory prompts a message that the product does not +exist, with a button option to :guilabel:`Create New Product`. Pressing this button will search the +`Barcode Lookup `_ database for a product matching the code and +format, create a new product definition in the Odoo database with the available information, and add +that product to the receipt to track the quantity on hand in inventory. + +.. image:: software/barcode-scan-for-new-product.png + :alt: New product confirmation dialog. + +.. note:: + Even if a transfer order with a product created through **Barcode** is cancelled, the product + remains available in the products list in the **Inventory** app unless it is deleted. -Set Locations Barcodes -====================== +From a product form +------------------- -If you manage multiple locations, you will find useful to attribute a -barcode to each location and stick it on the location. You can configure -the locations barcodes in :menuselection:`Inventory --> Configuration --> Locations`. +Barcodes can be added to both existing products and new products as they are created through the +products configuration form. To access a product's form, go to :menuselection:`Inventory app --> +Products --> Products` and select the product to add a barcode to. -.. image:: software/software_05.png - :align: center +In the :guilabel:`General Information` tab, click the :guilabel:`Barcode` field to either type in +the barcode or use a scanner to input the barcode value. -.. image:: software/software_06.png - :align: center +.. image:: software/barcode-add-to-product-form.png + :alt: The 'Barcode' field on a product form with an active cursor. .. note:: - You can easily print the barcode you allocate to the locations via the - *Print* menu. + If using :doc:`product variants <../../../sales/sales/products_prices/products/variants>`, + configure barcodes on individual variants and not the product template to allow scanning to + retrieve the variants. -Barcode Formats -=============== +From Inventory settings +----------------------- -Most retail products use EAN-13 barcodes, also known as GTIN (Global Trade Identification Numbers). -GTIN are used by companies to uniquely identify their products and services. While GTIN and UPC are -often used synonymously, GTIN refers to the number a barcode represents, while UPC refers to the -barcode itself. More information about GTIN can be found on the GS1 website. +To access the *Product Barcodes* configuration page, go to :menuselection:`Inventory app --> +Configuration --> Settings`. In the :guilabel:`Barcode` section, under the :guilabel:`Barcode +Scanner` feature, click :icon:`fa-arrow-right` :guilabel:`Configure Product Barcodes`. From this +list view, click the :guilabel:`Barcodes` column for any product to enter its barcode. Barcode +scanners will populate this field when the product is scanned. -In order to create GTIN for items, a company must have a GS1 Company Prefix. This prefix is the -number that will appear at the beginning of each GTIN, and will identify the company as the owner of -the barcode any the products it appears on. To learn more about GS1 Company Prefixes, or purchase a -license for a prefix, visit the GS1 Company Prefix page. +.. image:: software/product-barcodes-configure.png + :alt: Selecting the Barcode field in the Product Configuration form. -Odoo users are able to use GTIN barcodes to identify their products. However, since Odoo supports -any numeric string as a barcode, it is also possible to define a custom barcode for internal use. +.. tip:: + To filter for the products that do not have barcodes yet, click the :icon:`fa-sort-desc` + :guilabel:`(Toggle Search Panel)` icon to add a custom filter where the :guilabel:`Barcode` + property is :guilabel:`is not set`. -.. _barcode/setup/barcodelookup: + .. image:: software/barcode-filter-for-no-barcode.png + :alt: 'Add Custom Filter' pop-up with 'Barcode is not set' configured. + +.. _barcode/setup/location: -Barcode Lookup -============== +Print location barcodes +======================= -`Barcode Lookup `_ allows you to scan (or enter) products' barcodes -(:abbr:`UPC (Universal Product Code)`, :abbr:`EAN (European Article Number)`, or :abbr:`ISBN -(International Standard Book Number)`) to automatically create them in your Odoo database, complete -with product names, descriptions, images, categories, etc. +Barcodes can be assigned to locations to track of where products are stored and manage transfers, +and are automatically available if the :doc:`Storage Locations +<../../inventory/warehouses_storage/inventory_management/use_locations>` feature is enabled. -To use Barcode Lookup to scan and create products in Barcode, go to :menuselection:`Inventory --> -Configuration --> Settings`, scroll down to the :guilabel:`Barcode` section, and enable -:guilabel:`Stock Barcode Database`. +To print barcodes for locations, go to :menuselection:`Inventory app --> Configuration --> +Settings`, scroll down to the :guilabel:`Warehouse` section and click :icon:`fa-arrow-right` +:guilabel:`Locations`. Tick the boxes for locations and the :guilabel:`Print` button will appear, +downloading a PDF with barcodes for all selected locations. -.. note:: - If your database is hosted on **Odoo.sh** or **on-premise**, you must also :ref:`configure - an API key `. - If your database is hosted on **Odoo Online**, you can use Barcode Lookup without further - configuration. +.. image:: software/print-storage-location-barcodes.png + :alt: Multiple storage locations selected with 'Print' button at the top of the view. diff --git a/content/applications/inventory_and_mrp/barcode/setup/software/barcode-add-to-product-form.png b/content/applications/inventory_and_mrp/barcode/setup/software/barcode-add-to-product-form.png new file mode 100644 index 0000000000..a447246eb4 Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/software/barcode-add-to-product-form.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/software/barcode-filter-for-no-barcode.png b/content/applications/inventory_and_mrp/barcode/setup/software/barcode-filter-for-no-barcode.png new file mode 100644 index 0000000000..015ec8dc86 Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/software/barcode-filter-for-no-barcode.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/software/barcode-new-receipt.png b/content/applications/inventory_and_mrp/barcode/setup/software/barcode-new-receipt.png new file mode 100644 index 0000000000..f8a8270686 Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/software/barcode-new-receipt.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/software/barcode-scan-for-new-product.png b/content/applications/inventory_and_mrp/barcode/setup/software/barcode-scan-for-new-product.png new file mode 100644 index 0000000000..fd7b3e91ce Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/software/barcode-scan-for-new-product.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/software/barcodes-setup-change-nomenclature.png b/content/applications/inventory_and_mrp/barcode/setup/software/barcodes-setup-change-nomenclature.png new file mode 100644 index 0000000000..1f4ac6a85d Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/software/barcodes-setup-change-nomenclature.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/software/print-storage-location-barcodes.png b/content/applications/inventory_and_mrp/barcode/setup/software/print-storage-location-barcodes.png new file mode 100644 index 0000000000..8e1c798554 Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/software/print-storage-location-barcodes.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/software/product-barcodes-configure.png b/content/applications/inventory_and_mrp/barcode/setup/software/product-barcodes-configure.png new file mode 100644 index 0000000000..48872c11c4 Binary files /dev/null and b/content/applications/inventory_and_mrp/barcode/setup/software/product-barcodes-configure.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/software/software_01.png b/content/applications/inventory_and_mrp/barcode/setup/software/software_01.png deleted file mode 100644 index a477f49339..0000000000 Binary files a/content/applications/inventory_and_mrp/barcode/setup/software/software_01.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/software/software_02.png b/content/applications/inventory_and_mrp/barcode/setup/software/software_02.png deleted file mode 100644 index 68eb9aab66..0000000000 Binary files a/content/applications/inventory_and_mrp/barcode/setup/software/software_02.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/software/software_03.png b/content/applications/inventory_and_mrp/barcode/setup/software/software_03.png deleted file mode 100644 index 3116b558bc..0000000000 Binary files a/content/applications/inventory_and_mrp/barcode/setup/software/software_03.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/software/software_04.png b/content/applications/inventory_and_mrp/barcode/setup/software/software_04.png deleted file mode 100644 index 6cca59b1c5..0000000000 Binary files a/content/applications/inventory_and_mrp/barcode/setup/software/software_04.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/software/software_05.png b/content/applications/inventory_and_mrp/barcode/setup/software/software_05.png deleted file mode 100644 index 7320ae080d..0000000000 Binary files a/content/applications/inventory_and_mrp/barcode/setup/software/software_05.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/software/software_06.png b/content/applications/inventory_and_mrp/barcode/setup/software/software_06.png deleted file mode 100644 index 271244ee6e..0000000000 Binary files a/content/applications/inventory_and_mrp/barcode/setup/software/software_06.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/configure/packaging.rst b/content/applications/inventory_and_mrp/inventory/product_management/configure/packaging.rst index fe60f904ee..e92186f7e9 100644 --- a/content/applications/inventory_and_mrp/inventory/product_management/configure/packaging.rst +++ b/content/applications/inventory_and_mrp/inventory/product_management/configure/packaging.rst @@ -12,9 +12,9 @@ For example, different packages for cans of soda, such as a 6-pack, a 12-pack, o specific, not generic. .. tip:: - Packaging can be used in conjunction with Odoo :ref:`Barcode `. When - receiving products from suppliers, scanning the packaging barcode automatically adds the number - of units in the packaging to the internal count of the product. + Packaging can be used in conjunction with Odoo :doc:`Barcode <../../../barcode/setup/software>`. + When receiving products from suppliers, scanning the packaging barcode automatically adds the + number of units in the packaging to the internal count of the product. Configuration ============= @@ -172,8 +172,8 @@ warehouse. Next, in the :guilabel:`Applicable on` section, tick the :guilabel:`P Apply route on packaging ------------------------ -Then, to apply the route, go to :menuselection:`Inventory app --> Products --> Products`, and -select the product that uses packaging. +Then, to apply the route, go to :menuselection:`Inventory app --> Products --> Products`, and select +the product that uses packaging. In the product form, switch to the :guilabel:`Inventory` tab. In the :guilabel:`Packaging` section that contains :ref:`configured packagings `, click the diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots.rst b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots.rst index 69f540cfa7..bcdfa486e7 100644 --- a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots.rst +++ b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots.rst @@ -33,7 +33,6 @@ Then, click :guilabel:`Save`. - :ref:`Print GS1 barcodes for lots and serial numbers ` .. image:: lots/enabled-lots-setting.png - :align: center :alt: Enabled lots and serial numbers feature in inventory settings. .. _inventory/management/track_products_by_lots: @@ -45,9 +44,10 @@ Once the :guilabel:`Lots & Serial Numbers` feature is activated, configure indiv tracked using lots. To do this, go to :menuselection:`Inventory app --> Products --> Products`, and choose a product to configure. -On the product form, go to the :guilabel:`Inventory` tab. In the :guilabel:`Traceability` section, -select the :guilabel:`By Lots` option in the :guilabel:`Tracking` field. Now, new or existing lot -numbers can be assigned to newly-received or manufactured batches of this product. +On the product form, click into the :guilabel:`General Information` tab. In the :guilabel:`Track +Inventory` field, tick the checkbox, then select :guilabel:`By Lots` from the drop-down menu. Now, +new or existing lot numbers can be assigned to newly-received or manufactured batches of this +product. .. seealso:: :doc:`expiration_dates` @@ -58,7 +58,6 @@ numbers can be assigned to newly-received or manufactured batches of this produc products in stock. .. image:: lots/tracking-product-form.png - :align: center :alt: Enabled tracking by lots feature on product form. Assign lots for shipping and receiving @@ -90,14 +89,12 @@ warehouse receipt form. lot number **must** be assigned before validating the receipt. .. image:: lots/user-error.png - :align: center :alt: Add lot/serial number user error popup. On the receipt form, on the product line in the :guilabel:`Operations` tab, select the |list| icon to the right of the product that is tracked by lot numbers. .. image:: lots/list-icon.png - :align: center :alt: Show the bulleted list icon on the product line. Doing so opens the :guilabel:`Open: Stock move` pop-up window, where the :guilabel:`Lot/Serial @@ -118,7 +115,6 @@ Package`, if any. :guilabel:`Quantity` column matches the :guilabel:`Demand` at the top. .. image:: lots/assign-lots-popup.png - :align: center :alt: Assign lot number detailed operations popup. Import lots @@ -127,14 +123,7 @@ Import lots In the :guilabel:`Open: Stock move` pop-up window, click :guilabel:`Import Serials/Lots`, then paste the bulk lot numbers, in the :guilabel:`Lots/Serial numbers` field. -.. figure:: lots/lots-excel-spreadsheet.png - :align: center - :alt: List of lot numbers copied on excel spreadsheet. - - List of lot numbers copied on *Google* spreadsheets. - .. figure:: lots/bulk-sn.png - :align: center :alt: Lot numbers copied to the lot number line. Lot numbers pasted to the "Lots/Serial numbers" field, in the **Import Lots** pop-up window. @@ -193,7 +182,6 @@ Repeat the above steps to select enough lots to fulfill the :guilabel:`Demand`, |DO| to deliver the products. .. image:: lots/pick-from-lots.png - :align: center :alt: Popup for source lot number on sales order. .. seealso:: @@ -212,7 +200,6 @@ displays the existing lot numbers. Select a lot number to :ref:`modify or add de button. .. figure:: lots/lot-dashboard.png - :align: center :alt: Show the "Lot/Serial Number" dashboard. Display lot numbers, grouped by products, on the **Lot/Serial Number** dashboard. @@ -243,7 +230,6 @@ On the lot number form, the following fields can be modified: modified, as the lot numbers are linked with existing stock moves. .. image:: lots/lot-number.png - :align: center :alt: Show the lot number form. .. seealso:: @@ -259,18 +245,17 @@ on a lot number form: :icon:`fa-cogs` :guilabel:`Add Properties` from the drop-down menu. #. Click the :icon:`fa-plus` :guilabel:`Add a Property` button, located below the existing fields. -Name and :doc:`configure the new field <../../../../productivity/knowledge/properties>`. Once -finished, enter the property value in the new field. +Name and :doc:`configure the new field `. Once finished, +enter the property value in the new field. .. example:: The new property, `Wood type`, is added. The value is recorded as `Cherry wood`. .. image:: lots/add-properties.png - :align: center :alt: Show the "Add Properties" button on a lot number form. .. seealso:: - :doc:`Configuring custom properties <../../../../productivity/knowledge/properties>` + :doc:`Configuring custom properties ` .. _inventory/product_management/create-new-lot: @@ -298,21 +283,11 @@ number will be assigned. The lot number, `000001`, is created for the product, `Drawer Black`. .. image:: lots/new-lot-number.png - :align: center :alt: New lot number creation form with assigned product. After a new lot number has been created, saved, and assigned to the desired product, the lot number is saved as an existing lot number linked to the product, and can be selected when :ref:`assigning -lot numbers to products on a receipt `, or when making an -inventory adjustment. - -.. example:: - After creating the lot number, `000001` appears as an option for `Drawer Black` when assigning - lot numbers on the :guilabel:`Inventory Adjustment` page. - - .. image:: lots/inventory-adjustment.png - :align: center - :alt: Show how to assign lot numbers on the Inventory Adjustment page. +lot numbers to products on a receipt `. Manage lots for different operations types ========================================== @@ -330,7 +305,6 @@ On the operation type form, under the :guilabel:`Lots/Serial Numbers` section, t Choose :guilabel:`Use Existing ones` if only existing lot numbers can be selected. .. image:: lots/operation-type-form.png - :align: center :alt: Enabled traceability setting on operations type form. .. tip:: @@ -398,7 +372,6 @@ Doing so reorganizes all the records on the page to display all existing lots an and can be expanded to show all quantities of products with that assigned number. .. image:: lots/group-by-number.png - :align: center :alt: Lots and serial numbers traceability report. Traceability report @@ -409,7 +382,6 @@ To view a full stock moves report for a lot number, select the lot number line f smart button. .. image:: lots/traceability-report.png - :align: center :alt: Show the Traceability Report for a lot, that displays the stock moves. .. seealso:: diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/add-properties.png b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/add-properties.png index 79bc45bb82..fef22f9deb 100644 Binary files a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/add-properties.png and b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/add-properties.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/enabled-lots-setting.png b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/enabled-lots-setting.png index 43bb06ddbe..3fc3796c85 100644 Binary files a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/enabled-lots-setting.png and b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/enabled-lots-setting.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/inventory-adjustment.png b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/inventory-adjustment.png deleted file mode 100644 index 93730a798f..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/inventory-adjustment.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/list-icon.png b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/list-icon.png index 611c485df3..de2e8362f3 100644 Binary files a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/list-icon.png and b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/list-icon.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/lots-excel-spreadsheet.png b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/lots-excel-spreadsheet.png deleted file mode 100644 index 1a61585d5d..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/lots-excel-spreadsheet.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/new-lot-number.png b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/new-lot-number.png index 08c88d4ae1..e6374ce881 100644 Binary files a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/new-lot-number.png and b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/new-lot-number.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/operation-type-form.png b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/operation-type-form.png index fada50022d..4b396d85a2 100644 Binary files a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/operation-type-form.png and b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/operation-type-form.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/tracking-product-form.png b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/tracking-product-form.png index 586dfb84fb..880e4d35b4 100644 Binary files a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/tracking-product-form.png and b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/tracking-product-form.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers.rst b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers.rst index 7daaa6a2c1..24f9cb28c9 100644 --- a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers.rst +++ b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers.rst @@ -13,7 +13,7 @@ serial numbers can help manufacturers locate products to provide after-sales ser event of a recall. .. seealso:: - `Odoo Tutorials: Serial Numbers `_ + `Odoo Tutorials: Serial Numbers `_ .. _inventory/product_management/enable-lots: diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials.rst b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials.rst index 40b9419a23..1d6b7ead64 100644 --- a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials.rst +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials.rst @@ -16,14 +16,14 @@ least one *shipping method*, the process of :doc:`calculating shipping rates Enable DHL shipping connector ============================= -Before creating a DHL shipping method, it is necessary to enable the carrier's shipping connector. -To do so, navigate to :menuselection:`Inventory app --> Configuration --> Settings`. +Before creating a DHL shipping method, enable the carrier's shipping connector. To do so, navigate +to :menuselection:`Inventory app --> Configuration --> Settings`. Scroll down to the :guilabel:`Shipping Connectors` section, and tick the checkbox next to :guilabel:`DHL Express Connector`. Finally, click :guilabel:`Save` to apply the changes. -Once the connector has been enabled, a :icon:`oi-arrow-right` :guilabel:`DHL Shipping Methods` link -appears below. Click the link to open a page showing all shipping methods configured for DHL. +Then, click the :icon:`fa-arrow-right` :guilabel:`DHL Shipping Methods` link to open a page showing +all shipping methods with the *Provider* set to DHL. Configure DHL shipping method ============================= @@ -44,7 +44,6 @@ Click :guilabel:`New` to open a blank shipping method form. If a shipping method created, it can be selected from this screen. .. image:: dhl_credentials/dhl-form.png - :align: center :alt: The form for a DHL shipping method. General information @@ -66,42 +65,48 @@ DHL Configuration The :guilabel:`DHL Configuration` tab on the shipping method form is used to connect the user's DHL account to Odoo, and configure the shipping method's details. -DHL SiteID, password, and account number -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +DHL developer credentials +~~~~~~~~~~~~~~~~~~~~~~~~~ -A DHL SiteID, password, and account number are used to link a DHL account with third-party services, -like Odoo's **Inventory** app. The SiteID and password are different credentials than the ones used -to log in to a DHL account. +To integrate DHL with Odoo, developer credentials must be retrieved from DHL's Developer Portal. +These credentials are used to link the user's DHL account to Odoo's **Inventory** app. -To obtain a DHL SiteID, password, and account number, it is necessary to register on the `DHL API -Developer Portal `_, by filling out the following -information: +.. important:: + The *SiteID* and *Password* are different credentials than the ones used to log in to a DHL + account. + +With DHL Express Account +************************ -- :guilabel:`First name` -- :guilabel:`Last name` -- :guilabel:`Email address` -- :guilabel:`Username` -- :guilabel:`Company Name` -- :guilabel:`Country` +If a DHL Express account is available, log into the `DHL Developer portal +`_ and `request a DHL API account number `_. -After filling out all of the fields, tick the :guilabel:`I have read and accept the terms of use and -the privacy policy` checkbox, and click :guilabel:`Send` to register. +Then, in Odoo, on the shipping method form, enter the *DHL API Key* in the :guilabel:`DHL SiteID` +field, and the *API Secret* in the :guilabel:`DHL Password` field. -After registering, a confirmation email is sent to verify the application. Click the link inside the -email to activate the developer portal account, and set a password. +Without DHL Express Account +*************************** -This email also includes the account number for the developer portal account. Enter the number in -the :guilabel:`DHL Account Number` field on the shipping method form. +If a DHL Express account is **not** available: -Once the developer portal account has been confirmed, log in to the portal using the username and -password. Click on the user avatar in the top-right corner of the screen to open the user dashboard. +#. Begin by opening a `DHL Express account + `_. +#. Once the developer portal account has been confirmed, log in to the portal using the username and + password. Click the user avatar in the top-right corner of the screen to open the user dashboard. +#. On the dashboard, open the :guilabel:`Apps` tab, and create an app. Follow the four steps in the + app creation flow (app name, needed apps, app status, confirmation) to complete the setup. -On the dashboard, click on the :guilabel:`Apps` tab, and select an app. In the -:guilabel:`Credentials` section, click the :guilabel:`Show key` button below the :guilabel:`API Key` -and :guilabel:`API Secret` fields. + .. image:: dhl_credentials/create-dhl-app.png + :alt: Setup to create DHL account. -Return to the shipping method form in the Odoo database. Enter the *DHL API Key* in the -:guilabel:`DHL SiteID` field, and the *API Secret* in the :guilabel:`DHL Password` field. +#. After setting up the DHL Express account, go `here + `_ to get the *DHL + API Key* and *API Secret* credentials. + +Then, in Odoo, on the shipping method form, enter the *DHL API Key* in the :guilabel:`DHL SiteID` +field, and the *API Secret* in the :guilabel:`DHL Password` field. Shipping details ~~~~~~~~~~~~~~~~ @@ -131,3 +136,19 @@ Additional settings are available in the :guilabel:`Options` section at the bott after validating a delivery order. - :guilabel:`Dutiable Material`: Enable this option if the shipping method is liable to customs or other duties. + +Turn on the DHL Connection +========================== + +Once the DHL connection is set up, use the smart buttons at the top of the form to publish, turn on +production mode or activate debug logging. + +- :guilabel:`Unpublished`/:guilabel:`Published`: determines if this shipping method is available + on the user's **eCommerce** website. + +- :guilabel:`Test Environment`/:guilabel:`Production Environment`: determines whether label creation + is for testing and cancelled immediately (Test) or generate real shipping label that is charged + to DHL account (Production). +- :guilabel:`No Debug`/:guilabel:`Debug Requests`: determines whether API requests and responses are + logged in Odoo (turn on :ref:`developer mode ` and go to :menuselection:`Settings + app --> Technical --> Logging`). diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials/create-dhl-app.png b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials/create-dhl-app.png new file mode 100644 index 0000000000..7e450bc29b Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials/create-dhl-app.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex.rst b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex.rst index be7e108fb7..5785ea7ec6 100644 --- a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex.rst +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex.rst @@ -3,7 +3,7 @@ FedEx integration ================= Integrating a FedEx account with Odoo's **Inventory** app makes it possible to :doc:`calculate -shipping rates <../setup_configuration>`, and :doc:`generate shipping labels ` within Odoo. +delivery rates <../setup_configuration>`, and :doc:`generate delivery labels ` within Odoo. This is accomplished by enabling the FedEx *shipping connector*, then configuring at least one *shipping method*. @@ -23,90 +23,106 @@ Finally, click :guilabel:`Save` to save the changes. After doing so, a :icon:`oi :guilabel:`FedEx Shipping Methods` button appears below :guilabel:`FedEx Connector`. .. image:: fedex/fsm-button.png - :align: center :alt: The FedEx Shipping Methods button below the FedEx Connector. -Configure shipping method +Configure delivery method ========================= -Once the FedEx shipping connector is enabled, it is necessary to configure at least one shipping -method. After doing so, the shipping method can be included in sales orders (SOs), and used to -compute shipping costs, and print shipping labels. +Once the FedEx shipping connector is enabled, it is necessary to configure at least one delivery +method. After doing so, the delivery method can be included in sales orders (SOs), and used to +compute delivery costs, and print delivery labels. -To enable a shipping method, navigate to :menuselection:`Inventory app --> Configuration --> +To enable a delivery method, navigate to :menuselection:`Inventory app --> Configuration --> Settings`, and click the :guilabel:`FedEx Shipping Methods` button below the :guilabel:`FedEx -Connector` checkbox. Doing so opens a page that shows all existing FedEx shipping methods. +Connector` checkbox. Doing so opens a page that shows all existing FedEx delivery methods. .. note:: - To see all shipping methods for every shipper with a connector enabled, navigate to - :menuselection:`Inventory app --> Configuration --> Shipping Methods`. + To see all delivery methods for every shipper with a connector enabled, navigate to + :menuselection:`Inventory app --> Configuration --> Delivery Methods`. -Select a shipping method to open its form. Alternatively, click :guilabel:`New` to open a blank -form, and configure a new shipping method. +Select a delivery method to open its form. Alternatively, click :guilabel:`New` to open a blank +form, and configure a new delivery method. .. image:: fedex/fedex-form.png - :align: center - :alt: The form for a FedEx shipping method. + :alt: The form for a FedEx delivery method. .. important:: Enabling the FedEx shipping connector automatically creates two default shipping methods: :guilabel:`FedEx US` and :guilabel:`FedEx International`. Each of these methods are pre-configured with test credentials, allowing them to be used for testing purposes. - Before the shipping method can be used to create actual shipments, the test credentials must be + Before the delivery method can be used to create actual shipments, the test credentials must be replaced with credentials from a valid FedEx account. General information ------------------- -At the very top of a shipping method form are fields used to configure the way the method operates +At the very top of a delivery method form are fields used to configure the way the method operates in Odoo. In the :guilabel:`Provider` field, select :guilabel:`FedEx` from the drop-down menu, if it is not already selected. -The rest of the fields in this section are general to all shipping providers. For details on how to +The rest of the fields in this section are general to all delivery providers. For details on how to fill them out, see the documentation on :doc:`third-party shippers `. Fedex Configuration tab ----------------------- -The options in the :guilabel:`Fedex Configuration` tab of a FedEx shipping method form are used to -connect the method to a FedEx account, and configure the shipping details associated with the method +The options in the :guilabel:`Fedex Configuration` tab of a FedEx delivery method form are used to +connect the method to a FedEx account, and configure the delivery details associated with the method (drop-off type, package type, etc.). -A FedEx business account is required to obtain the information needed to fill out the fields in this -tab. To create a new account, navigate to FedEx's `Open Account +A FedEx developer account is required to obtain the information needed to fill out the fields in +this tab. To create a new account, navigate to FedEx's `Open Account `_ page, click on :guilabel:`Create Account`, and follow the instructions. -Developer Key and Meter Number fields -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Create API Project +~~~~~~~~~~~~~~~~~~ -A *developer key* is used to integrate a FedEx account with an external service, like the Odoo -**Inventory** app. A *meter number* is a unique ID number used by FedEx to identify negotiated -shipping rates for each account. +After creating a `developer account `_, navigate to +the :guilabel:`My Projects` tab, and click :guilabel:`CREATE API PROJECT`. -To get a developer key and meter number, begin by navigating to FedEx's `Developer Resource Center -`_. Then, click on the :guilabel:`FedEx Web -Services` drop-down menu. +On the :guilabel:`Tell us about your API needs` popup, select `Ships with FedEX and needs to +integrate FedEx APIs into their system` in the :guilabel:`I work for a company that:` drop-down. -Click :guilabel:`Get Test Key` to start the process of getting a developer key and meter number -which can be used to configure a shipping method for testing purposes. +.. image:: fedex/fed-ex-api-needs.png + :alt: Pop-up on FedEx website to select API needs. -Click :guilabel:`Get Production Key` to start the process of getting a developer key and meter -number, which can be used to configure a shipping method that generates real shipments with FedEx. +Next, when prompted to `Select API(s) for your project`, make sure to enable the following APIs: -After clicking either option, follow the instructions until the :guilabel:`Confirmation` screen is -reached. This screen displays the developer key and meter number. + - :guilabel:`Ship, Rate & Other APIs` + - :guilabel:`Address Validation API` + - :guilabel:`Rates and Transit Times API` + - :guilabel:`Ship API` + - :guilabel:`Trade Documents Upload API` -Once the developer key and meter number are determined, enter them in the :guilabel:`Developer Key` -and :guilabel:`Meter Number` fields on the :guilabel:`Fedex Configuration` tab of the shipping -method form. +.. image:: fedex/select-apis.png + :alt: Page on FedEx website where users select the APIs needed for project. -Password and Account Number fields -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Enter a :guilabel:`Project name`, then select any countries where packages will be shipped to, or +delivered from. -A *password* is used, along with a username, to log into a FedEx account. An *account number* is the -unique number assigned to each FedEx account. +.. image:: fedex/country-selector.png + :alt: Page on FedEx website where users select the countries they ship to and from. + +To move the project to production, click the :guilabel:`Production key` tab. From there, link a +:guilabel:`Shipping Account`. Copy the `API Key`, `Secret Key`, and `Account` number, then paste +them into the appropriate fields on the :guilabel:`Delivery Methods` form. + +Certification process +~~~~~~~~~~~~~~~~~~~~~ + +To enable the creation of FedEx shipping labels, the API must be certified. On the sidebar menu in +the FedEx `developer portal `_, click +:guilabel:`API Certification`, and follow the required instructions. + +.. note:: + These certification often require reaching out to the FedEx support team via email. + +Account Number fields +~~~~~~~~~~~~~~~~~~~~~ + +An *account number* is the unique number assigned to each FedEx account. To find a FedEx account number, log in to a FedEx account at https://www.fedex.com. Click on the account holder's name in the top-right corner of the screen, and select :menuselection:`My Profile` @@ -116,27 +132,27 @@ On the profile page, click :guilabel:`Account Management` on the left side of th account number is displayed on this screen. Once the password and account number are determined, enter them in the :guilabel:`Password` and -:guilabel:`Account Number` fields on the :guilabel:`Fedex Configuration` tab of the shipping method +:guilabel:`Account Number` fields on the :guilabel:`Fedex Configuration` tab of the delivery method form. -Shipping details +Delivery details ~~~~~~~~~~~~~~~~ The main section of the :guilabel:`Fedex Configuration` tab includes a number of additional fields -used provide information about the shipping method: +used provide information about the delivery method: - :guilabel:`Fedex Service Type`: The FedEx service used to ship a package. - :guilabel:`Fedex Drop-Off Type`: The method for getting a package into FedEx's possession. -- :guilabel:`Fedex Package Type`: The type of package used for the shipping method. +- :guilabel:`Fedex Package Type`: The type of package used for the delivery method. - :guilabel:`Package Weight Unit`: The unit of measure used to weigh packages. - :guilabel:`Package Length Unit`: The unit of measure used to determine the dimensions of packages. -- :guilabel:`Label Type`: The type of shipping label used for packages. -- :guilabel:`Label Format`: The file format used by Odoo to generate shipping labels. +- :guilabel:`Label Type`: The type of delivery label used for packages. +- :guilabel:`Label Format`: The file format used by Odoo to generate delivery labels. - :guilabel:`Commercial Invoice Type`: The dimensions and type of the paper used to print invoices. .. important:: - The options that should be selected on the :guilabel:`Fedex Configuration` tab of a shipping - method depend on the negotiated shipping services of the associated FedEx account. To confirm the + The options that should be selected on the :guilabel:`Fedex Configuration` tab of a delivery + method depend on the negotiated delivery services of the associated FedEx account. To confirm the available services for a FedEx account, visit the *Account Management* page after logging in to the FedEx website, or speak with a customer service representative. @@ -144,7 +160,7 @@ Options section ~~~~~~~~~~~~~~~ The :guilabel:`Options` section of the :guilabel:`Fedex Configuration` tab provides a few additional -options to further configure the shipping method: +options to further configure the delivery method: - :guilabel:`Saturday Delivery`: Tick the checkbox to allow packages shipped with the delivery method to be delivered on Saturdays. @@ -153,22 +169,22 @@ options to further configure the shipping method: - :guilabel:`Duties paid by`: Use the drop-down menu to select whether duty charges should be paid by the :guilabel:`Sender` or :guilabel:`Recipient`. -Activate shipping method +Activate delivery method ======================== -By default, shipping methods in Odoo are created within a *test environment*. This means they can -only be used for testing purposes, and are unable to generate actual shipping orders. +By default, delivery methods in Odoo are created within a *test environment*. This means they can +only be used for testing purposes, and are unable to generate actual delivery orders. -To activate a shipping method in a *production environment*, click the :icon:`fa-stop` -:guilabel:`Test Environment` smart button at the top of the shipping method form. After doing so, +To activate a delivery method in a *production environment*, click the :icon:`fa-stop` +:guilabel:`Test Environment` smart button at the top of the delivery method form. After doing so, the smart buttons changes to read :icon:`fa-play` :guilabel:`Production Environment`. -With the production environment enabled, validating a delivery order using the shipping method -generates an actual shipping label with FedEx. +With the production environment enabled, validating a delivery order using the delivery method +generates an actual delivery label with FedEx. -Click the :icon:`fa-play` :guilabel:`Production Environment` smart button to return the shipping +Click the :icon:`fa-play` :guilabel:`Production Environment` smart button to return the delivery method to a test environment. .. warning:: - **Do not** enable the production environment for a shipping method before it is ready to be used - for actual shipping orders. Doing so may lead to the creation of unwanted charges with FedEx. + **Do not** enable the production environment for a delivery method before it is ready to be used + for actual delivery orders. Doing so may lead to the creation of unwanted charges with FedEx. diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/country-selector.png b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/country-selector.png new file mode 100644 index 0000000000..ac0ffe09b9 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/country-selector.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/fed-ex-api-needs.png b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/fed-ex-api-needs.png new file mode 100644 index 0000000000..22850ed974 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/fed-ex-api-needs.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/fedex-form.png b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/fedex-form.png index 9b7139c943..7082e079c4 100644 Binary files a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/fedex-form.png and b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/fedex-form.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/select-apis.png b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/select-apis.png new file mode 100644 index 0000000000..3bb91eb1af Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/select-apis.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping.rst b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping.rst index e01a360022..f74b16983f 100644 --- a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping.rst +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping.rst @@ -91,6 +91,9 @@ Sendcloud account. Then, :ref:`configure Odoo fields `, so Sendcloud can accurately pull shipping data to generate labels. +.. seealso:: + :ref:`Enable pickup points on websites ` + .. _inventory/shipping_receiving/sendcloud-module: Install Sendcloud shipping module @@ -115,7 +118,7 @@ Configuration --> Settings`. The :guilabel:`Sendcloud Connector` setting is foun After activating the :guilabel:`Sendcloud Connector`, click on the :guilabel:`Sendcloud Shipping Methods` link below the listed connector. Once on the :guilabel:`Shipping Methods` page, click -:guilabel:`Create`. +:guilabel:`New`. .. tip:: :guilabel:`Shipping Methods` can also be accessed by going to :menuselection:`Inventory --> @@ -129,8 +132,32 @@ Fill out the following fields in the :guilabel:`New Shipping Method` form: create a new product. - In the :guilabel:`SendCloud Configuration` tab, enter the :guilabel:`Sendcloud Public Key`. - In the :guilabel:`SendCloud Configuration` tab, enter the :guilabel:`Sendcloud Secret Key`. -- Manually :guilabel:`Save` the form by clicking the cloud icon next to the :guilabel:`Shipping - Methods / New` breadcrumbs. + +.. _inventory/shipping_receiving/sendcloud-pickups: + +Pickup points +~~~~~~~~~~~~~ + +Sendcloud's `service point delivery +`_ lets customers +choose a pickup location (such as a nearby shop or locker) instead of entering a private delivery +address. + +To enable the feature, go to the shipping method form, and in the :guilabel:`SendCloud +Configuration` tab, under the :guilabel:`Options` section, enable :guilabel:`Use Sendcloud +Locations` feature. + +.. important:: + Pickup point selection is only available through the **Website** app (the online checkout view). + It is not currently possible to select a pickup point manually through the **Sales** app (the + internal database view). + + For example, if the customer selects a shipping method like *Sendcloud Mondial Relay*, they must + choose a pickup point during the checkout process on the website. If no pickup point is selected, + the delivery order cannot be validated in Odoo. + +Load shipping products +~~~~~~~~~~~~~~~~~~~~~~ After configuring and saving the form, follow these steps to load the shipping products: diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses.rst b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses.rst index 42bdb5daf2..527f42746a 100644 --- a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses.rst +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses.rst @@ -23,7 +23,7 @@ the warehouse form, which contains the following fields: characters). The short name for the default warehouse in Odoo is `WH`. .. important:: - The :guilabel:`Short Name` appears on warehouse documents, so it is recommended to use an + The :guilabel:`Short Name` appears on warehouse documents, so it is recommended to use a memorable one, like "WH[first letters of location]" (e.g. `WHA`, `WHB`, etc.). - :guilabel:`Address` (*required field*): the address of the warehouse. To change the warehouse diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times.rst b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times.rst index fd28e5ac8a..d5cd5d35e7 100644 --- a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times.rst +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times.rst @@ -2,15 +2,16 @@ Lead times ========== -.. |MO| replace:: :abbr:`MO (Manufacturing Order)` -.. |MOs| replace:: :abbr:`MOs (Manufacturing Orders)` +.. |MO| replace:: :abbr:`MO (manufacturing order)` +.. |MOs| replace:: :abbr:`MOs (manufacturing orders)` .. |BoM| replace:: :abbr:`BoM (Bill of Materials)` .. |BoMs| replace:: :abbr:`BoMs (Bills of Materials)` -.. |RFQ| replace:: :abbr:`RFQ (Request for Quotation)` +.. |RFQ| replace:: :abbr:`RFQ (request for quotation)` +.. |PO| replace:: :abbr:`PO (purchase order)` Accurately forecasting delivery dates is vital for fulfilling customer expectations. In Odoo, the -**Inventory** app allows for comprehensive lead time configuration, allowing coordination and planning -of manufacturing orders, deliveries, and receipts. +**Inventory** app allows for comprehensive lead time configuration, allowing coordination and +planning of manufacturing orders, deliveries, and receipts. Lead time types =============== @@ -75,7 +76,7 @@ Odoo issues a warning message if the set delivery date is earlier than the expec not be feasible to fulfill the order by that time, which would impact other warehouse operations. .. example:: - A :abbr:`SO (Sales Order)` containing a `Coconut-scented candle` is confirmed on July 11th. The + A :abbr:`SO (sales order)` containing a `Coconut-scented candle` is confirmed on July 11th. The product has a customer lead time of 14 days, and the business uses a sales security lead time of 1 day. Based on the lead time inputs, Odoo suggests a delivery date in 15 days, on July 26th. @@ -149,28 +150,80 @@ and set the :guilabel:`Shipping Policy` to: delivery date is 5 days from today: April 7th. On the other hand, selecting :guilabel:`When all products are ready` configures the scheduled date to be 8 days from today: April 10th. -.. _inventory/warehouses_storage/purchase-lt: - Purchase lead times =================== -Automatically determining the dates on which to place orders from suppliers can help simplify the -procurement process. +Automatically scheduling supplier orders streamlines procurement by showing users exactly when to +confirm a request for quotation (RFQ) and when to expect the goods. -Odoo calculates the supplier shipment *receipt date*, and :abbr:`PO (Purchase Order)` deadline, -based on the required date the product is needed in the warehouse. By working backwards from the -receipt date, vendor lead times and purchase security lead times are taken into account, in order to -determine the :abbr:`PO (Purchase Order)` deadline. +.. list-table:: Key dates on an RFQ / PO + :header-rows: 1 + :stub-columns: 1 -This deadline is the date by which the order should be confirmed, in order to ensure timely arrival -by the expected receipt date. + * - Field + - Description + * - Order Deadline + - Last calendar day to confirm the |RFQ| and convert it to a |PO| + * - Expected Arrival + - Arrival date of the products. Calculated by *Order Deadline* + *Vendor Lead Time* -.. image:: lead_times/vendor-lead-times.png - :alt: Visualization of PO deadline and receipt date used with vendor lead times. +In addition, Odoo has global security lead times, which are buffers that widen the +:ref:`just-in-time ` (JIT) forecast window. The security +lead times affect **only** replenishment methods that use :doc:`pull rules +<../../shipping_receiving/daily_operations/use_routes>`—for example :doc:`reordering rules +` or :doc:`make to order (MTO) `. They do not change the interval between +*Order Deadline* and *Expected Arrival*. .. seealso:: :doc:`PO scheduling with reordering rules ` +.. list-table:: Global security lead time buffers + :header-rows: 1 + :stub-columns: 1 + + * - Buffer + - Purpose + - Impact on dates + * - :ref:`Purchase Security Lead Time ` + - Extra calendar days to account for delays. Typically used to account for weekends or + holidays. + - None on the |RFQ|/|PO|; adds buffer days in the :ref:`JIT forecast window + `. + * - :ref:`Days to Purchase ` + - Days the vendor needs to review an |RFQ| after it is sent. + - None on the |RFQ|/|PO|; adds buffer days in the :ref:`JIT forecast window + `. + +.. image:: lead_times/vendor-lead-times.png + :alt: Visualization of PO deadline and receipt date used with vendor lead times. + +.. example:: + To tie all the purchase lead times together, consider this: + + - Today: April 21 + - :guilabel:`Vendor Lead Time`: 1 day + - :guilabel:`Purchase Security Lead Time`: 4 days + - :guilabel:`Days to Purchase`: 2 days + + Days from today = 1 + 4 + 2 = 7 + + Forecasted date = April 28 + + .. figure:: lead_times/forecasted-date-purchase.png + :alt: Forecasted date calculation on the lead times pop-up. + + Example of the :abbr:`JIT (just-in-time)` forecast window, which is April 21-28. + + If an |RFQ| is created today, the following fields show: + + - :guilabel:`Order Deadline`: April 23 (:math:`\text{Today} + 2`) + - :guilabel:`Expected Arrival`: April 24 (:math:`\text{Order Deadline} + 1`) + + .. image:: lead_times/order-deadline.png + :alt: Order deadline displaying Apr 23 and Expected Arrival Apr 24. + +.. _inventory/warehouses_storage/purchase-lt: + Vendor lead time ---------------- @@ -184,7 +237,11 @@ pricelist, click the :guilabel:`Add a line` button to add vendor details, such a .. note:: Multiple vendors and lead times can be added to the vendor pricelist. The default vendor and lead - time selected will be the entry at the top of the list. + time selected is the entry at the top of the list. + +.. tip:: + A |PO| is marked late if the *Expected Arrival* date has passed, and appears in the *Late* box on + the **Purchase** app's dashboard. .. example:: On the vendor pricelist of the product form, the :guilabel:`Delivery Lead Time` for the selected @@ -193,46 +250,20 @@ pricelist, click the :guilabel:`Add a line` button to add vendor details, such a .. image:: lead_times/set-vendor.png :alt: Add delivery lead times to vendor pricelist on a product. -By setting the vendor lead time, the expected arrival date of the item is automatically determined -as the date of the :abbr:`PO (Purchase Order)` confirmation, plus the vendor lead time. This ensures -that warehouse employees are notified, if the products do **not** arrive within the expected -timeframe. - -.. example:: - On a :abbr:`PO (Purchase Order)` confirmed on July 11th, for a product configured with a 10-day - vendor lead time, Odoo automatically sets the :guilabel:`Receipt Date` to July 21st. The receipt - date also appears as the :guilabel:`Scheduled Date` on the warehouse receipt form, accessible - from the :guilabel:`Receipt` smart button, located on the :guilabel:`PO (Purchase Order)`. - - .. image:: lead_times/receipt-date.png - :alt: Show expected *Receipt Date* of the product from the vendor. - - .. image:: lead_times/scheduled-date-receipt.png - :alt: Show expected *Scheduled Date* of arrival of the product from the vendor. - .. _inventory/warehouses_storage/purchase-security-lt: Purchase security lead time --------------------------- -*Purchase security lead time* is set globally for the business in :menuselection:`Inventory app --> -Configuration --> Settings`. +*Purchase security lead time* is a global buffer to account for delays, applied to **all** vendors. +To set it, go to :menuselection:`Inventory app --> Configuration --> Settings`. -On the :guilabel:`Settings` page, under the :guilabel:`Advanced Scheduling` heading, tick the -checkbox for :guilabel:`Security Lead Time for Purchase`. +Under :guilabel:`Advanced Scheduling`, tick the :guilabel:`Security Lead Time for Purchase` +checkbox. Next, enter the desired number of calendar days. By configuring the security lead time, a buffer is set to account for potential delays in supplier deliveries. Then, click :guilabel:`Save`. -.. example:: - Setting the :guilabel:`Security Lead Time for Purchase` to `2.00` days, pushes the - :guilabel:`Scheduled Date` of receipt back by two days. In that case, if a product is initially - scheduled to arrive on April 6th, with a two-day security lead time, the new scheduled date for - the receipt would be April 8th. - - .. image:: lead_times/vendor-security.png - :alt: Set security lead time for purchase from the Inventory > Configuration > Settings. - .. _inventory/warehouses_storage/days-to-purchase: Days to purchase lead time diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/forecasted-date-purchase.png b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/forecasted-date-purchase.png new file mode 100644 index 0000000000..cd89589c27 Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/forecasted-date-purchase.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/order-deadline.png b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/order-deadline.png new file mode 100644 index 0000000000..cde527ca8c Binary files /dev/null and b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/order-deadline.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/receipt-date.png b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/receipt-date.png deleted file mode 100644 index 60b738b42f..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/receipt-date.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/scheduled-date-receipt.png b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/scheduled-date-receipt.png deleted file mode 100644 index 74a377f24b..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/scheduled-date-receipt.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/vendor-security.png b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/vendor-security.png deleted file mode 100644 index 4d995384c7..0000000000 Binary files a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/vendor-security.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto.rst b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto.rst index d33e3a9707..34b3275298 100644 --- a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto.rst +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto.rst @@ -11,18 +11,27 @@ Replenish on order (MTO) .. |BOM| replace:: :abbr:`BOM (bill of materials)` *Replenish on order*, also known as *MTO* (make to order), is a replenishment strategy that creates -a draft order for a product every time it is required to fulfill a sales order (SO), or when it is -needed as a component in a manufacturing order (MO). +a draft order every time a product is needed to fulfill a sales order (SO) or as a component in a +manufacturing order (MO). -For products that are purchased from a vendor, a request for quotation (RFQ) is created to replenish -the product, while an |MO| is created for products that are manufactured. The creation of an |RFQ| -or |MO| occurs every time an |SO| or |MO| that requires the product is confirmed, regardless of the -current stock level of the product being ordered. +- For :doc:`purchased products <../../../purchase/manage_deals/rfq>`, Odoo creates a |RFQ| +- For :doc:`manufactured products + <../../../manufacturing/basic_setup/configure_manufacturing_product>`, it creates a |MO| + +If stock is available, no |RFQ| or |MO| is generated and the sale proceeds normally. Otherwise, the +|RFQ| or |MO| is generated and directly linked to the originating |SO| through a smart button. + +This approach offers clear traceability, since each |RFQ| or |MO| is tied back to its demand. .. important:: - In order to use the |MTO| route, the :guilabel:`Multi-Step Routes` feature must be enabled. To do - so, navigate to :menuselection:`Inventory app --> Configuration --> Settings`, and tick the - checkbox next to :guilabel:`Multi-Step Routes`, under the :guilabel:`Warehouse` heading. + The |RFQ| or |MO| generated by |MTO| is designed to fulfill the originating |SO|. These documents + should normally be confirmed or adjusted rather than cancelled. If the demand changes, update the + document instead of cancelling it. + +.. note:: + If an |RFQ| or |MO| is cancelled, Odoo does not automatically generate a replacement. A new + replenishment document must be created manually, but it **cannot** be linked back to the original + |SO| through the smart button. Finally, click :guilabel:`Save` to save the change. @@ -31,6 +40,10 @@ current stock level of the product being ordered. Unarchive MTO route =================== +In order to use the |MTO| route, the :guilabel:`Multi-Step Routes` feature must be enabled. To do +so, navigate to :menuselection:`Inventory app --> Configuration --> Settings`, and tick the checkbox +next to :guilabel:`Multi-Step Routes`, under the :guilabel:`Warehouse` heading. + By default, Odoo sets the |MTO| route as *archived*. This is because |MTO| is a somewhat niche workflow that is only used by certain companies. However, it is easy to unarchive the route in just a few simple steps. @@ -121,10 +134,11 @@ Click :guilabel:`Confirm`, and the quotation is turned into an |SO|. A :guilabel:`Purchase` smart button now appears at the top of the page. Clicking it opens the |RFQ| associated with the |SO|. -Click :guilabel:`Confirm Order` to confirm the |RFQ|, and turn it into a |PO|. A purple -:guilabel:`Receive Products` button now appears above the |PO|. Once the products are received, -click :guilabel:`Receive Products` to open the receipt order, and click :guilabel:`Validate` to -enter the products into inventory. +After receiving approval from the vendor that they can meet the demand by the :guilabel:`Expected +Arrival` date, click :guilabel:`Confirm Order` to turn it into a |PO|. A purple :guilabel:`Receive +Products` button now appears above the |PO|. Once the products are received, click +:guilabel:`Receive Products` to open the receipt order, and click :guilabel:`Validate` to enter the +products into inventory. Return to the |SO| by clicking the :guilabel:`SO` breadcrumb, or by navigating to :menuselection:`Sales app --> Orders --> Orders`, and selecting the|SO|. @@ -133,6 +147,14 @@ Finally, click the :guilabel:`Delivery` smart button at the top of the order to order. Once the products have been shipped to the customer, click :guilabel:`Validate` to confirm the delivery. +Cancelling an SO with an MTO product +------------------------------------ + +When a |SO| is cancelled, and it had created an |RFQ| or |MO|, the related delivery order is +cancelled automatically. However, the |RFQ| or |MO| themselves are **not** cancelled. Instead, a +warning appears in their chatter noting the |SO| cancellation. These documents remain active, so the +user can either cancel them manually or repurpose the replenishment for another order. + .. seealso:: For information on workflows that include the |MTO| route, see the following documentation: diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging.rst b/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging.rst index 316419ad17..07f35adafb 100644 --- a/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging.rst +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging.rst @@ -36,7 +36,7 @@ the supply chain, such as sunken purchase costs or delays in profitability. To a go to :menuselection:`Inventory app --> Reporting --> Valuation`. .. important:: - The :menuselection:`Reporting`` menu in **Inventory** is only accessible to users with + The :menuselection:`Reporting` menu in **Inventory** is only accessible to users with :doc:`admin access <../../../../general/users/access_rights>`. This dashboard has three different views, or inventory reports — :ref:`list view @@ -104,8 +104,7 @@ the desired fields: the value of said stock. .. tip:: - Some of these settings may not appear unless first enabled in Odoo's **:doc:`Settings - <../../../general>`** application. + Some of these settings may not appear unless first enabled in **Settings** application. .. image:: aging/stock-valuation-report.png :alt: Stock valuation report. @@ -181,9 +180,9 @@ will show the :guilabel:`Quantity` and :guilabel:`Total Value` of each stock mov .. example:: A business has 100 sofas in stock on January 1st and sells 20 of those sofas on February 1st. The :guilabel:`Remaining Quantity` of the :abbr:`SVL (stock move layer)` will drop from `100.00` to - `70.00` on February 1st. If no other stock moves take place, and on February 1st, the + `80.00` on February 1st. If no other stock moves take place, and on February 1st, the :guilabel:`Valuation at Date` is selected as January 1st, the :guilabel:`Remaining Quantity` - will still show as `70.00`. + will still show as `80.00`. .. _inventory/warehouses_storage/aging-report: diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants.rst b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants.rst index 07a5604543..111fbfdfeb 100644 --- a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants.rst +++ b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants.rst @@ -54,6 +54,8 @@ drop-down menu. Then, select the desired options next to the :guilabel:`Display Once all desired :guilabel:`Values` have been added, click :guilabel:`Save` to save the new attribute. +.. _product-variants/add-product-variants: + Add product variants on the product form ======================================== diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers.rst b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers.rst index 71b744b9e3..c5d6a1e462 100644 --- a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers.rst +++ b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers.rst @@ -1,81 +1,130 @@ -===================================== -Manage work orders using work centers -===================================== - -Odoo Manufacturing allows for work orders to be carried out at specific work centers. When a -manufacturing order is created for a product, any work orders listed in the :guilabel:`Operations` -tab of the product bill of materials (BoM) will be automatically created as well and assigned to the -specified work center. Work orders can be managed in the :guilabel:`Manufacturing` module by -selecting :menuselection:`Operations --> Work Orders`. - -In order to use work centers, the :guilabel:`Work Orders` feature must first be enabled. To do so, -go to the :guilabel:`Manufacturing` module, select :menuselection:`Configuration --> Settings`, and -activate the checkbox next to :guilabel:`Work Orders`. Work centers can then be created and managed -by selecting :menuselection:`Configuration --> Work Centers`. - -Create a work center -==================== +============ +Work centers +============ + +*Work centers* are where **Manufacturing** work orders are processed, and can be used to track +costs, make schedules, plan capacity, organize equipment, and track efficiency. Specifying a work +center is required when a work order is defined in the *Operations* tab of a bill of materials (BoM) +for a product. + +.. important:: + Work centers only appear if the :guilabel:`Work Orders` setting is enabled. To do so, navigate to + :menuselection:`Manufacturing app --> Configuration --> Settings`, then tick the :guilabel:`Work + Orders` checkbox. Work orders can be managed in the :guilabel:`Manufacturing` app by selecting + :menuselection:`Operations --> Work Orders`. + +.. seealso:: + :doc:`../basic_setup/bill_configuration` + +Work center configuration +========================= + +.. _manufacturing/management/using_work_centers/wc-setup: -Within the :guilabel:`Manufacturing` module, select :menuselection:`Configuration --> Work Centers ---> Create`. The work center form can then be filled out as follows: +Create a new work center +------------------------ -- :guilabel:`Work Center Name`: give the work center a concise name that describes the type of - operations it will be used for -- :guilabel:`Alternative Workcenters`: specify an alternative work center for operations to be - carried out at if the main work center is not available -- :guilabel:`Code`: assign the work center a reference code -- :guilabel:`Working Hours`: define the number of hours that the work center can be in use each week -- :guilabel:`Company`: select the company that the work center belongs to +In the **Manufacturing** app, select :menuselection:`Configuration --> Work Centers` and click the +:guilabel:`New` button to open a new work center form. .. image:: using_work_centers/work-center-form.png - :align: center :alt: An example of a fully configured work center form. -.. _manufacturing/management/using_work_centers/wc-setup: +- :guilabel:`Work Center Name`: the label for the work center used to select it on a work order or + on the reporting dashboards +- :guilabel:`Tag`: reusable labels that can be used to sort work centers in list view +- :guilabel:`Alternative Workcenters`: where a work order should be carried out if this work center + is not available +- :guilabel:`Code`: reference id for the work center that is displayed in the list view +- :guilabel:`Working Hours`: the hours that work center can be used during the week + +.. _manufacturing/management/using_work_centers/working-hours: -Set standards for work center productivity ------------------------------------------- +Working hours +~~~~~~~~~~~~~ + +*Working hours* define when a work center should operate, based on a one- or two-week schedule. +These hours also form the basis for calculating *overall equipment efficiency* (OEE). + +.. note:: + By default, Odoo uses the `Standard 40 hours/week` working hours, which expects work centers to + operate between 8:00 AM and 5:00 PM on Monday through Friday. + +To change the working hours, hover over the current :guilabel:`Working Hours` value and click the +:icon:`fa-arrow-right` (:guilabel:`Internal link`) icon to open the working hours form. + +.. image:: using_work_centers/working-hours-form.png + :alt: The working hours form for Standard 40 hours/week. + +To create a new set of working hours, click the :guilabel:`New` button and give it a name. From +here, edit any :guilabel:`Work from` or :guilabel:`Work to` value to adjust the time range. Remove a +line by clicking click the :icon:`fa-trash-o` :guilabel:`(trash)` icon. To create a new time range, +click :guilabel:`Add a line` at the bottom of the list. + +.. seealso:: + - :doc:`../reporting/oee` + - :doc:`../workflows/work_center_time_off` + +Set productivity standards and allowed employees +------------------------------------------------ The :guilabel:`General Information` tab on the work center form allows for productivity goals to be -assigned to a work center: +assigned to a work center. These are used as the basis for calculating how much of the potential +time the work center is being used and its operating costs. + +.. image:: using_work_centers/work-center-general-information.png + :alt: The general information tab of the work center form. + +- :guilabel:`Time Efficiency`: a multiplier for how using this work center affects the normal speed + of execution of a work order + + .. example:: + If a work center has older equipment and work orders take twice as long to produce, the `Time + Efficiency` would be `50.00%`. -- :guilabel:`Time Efficiency`: used to calculate the expected duration of a work order at the work - center; for example, if a work order normally takes one hour and the efficiency is set to 200%, - the work order will take 30 minutes - :guilabel:`Capacity`: the number of products that can be processed at the work center simultaneously + - :guilabel:`OEE Target`: the target for efficiency at the work center -- :guilabel:`Time before prod.`: setup time required before work can commence -- :guilabel:`Time after prod.`: breakdown or cleanup time required after work is finished -- :guilabel:`Cost per hour`: the cost of operating the work center for one hour -- :guilabel:`Analytic Account`: the account where the cost of the work center should be recorded -.. image:: using_work_centers/work-center-general-information.png - :align: center - :alt: The general information tab of the work center form. + .. example:: + If a work center is available for `8 hours per day` but is only expected to be used for `7 + hours per day`, the OEE would be `87.50%`. :math:`7/8*100=87.5` -Assign equipment to a work center ---------------------------------- + .. seealso:: + :doc:`../reporting/oee` -Using the :guilabel:`Equipment` tab, it is possible for specific pieces of equipment to be assigned -to a work center. The following information will be displayed for each piece of equipment added: +- :guilabel:`Setup Time`: the time required before work can commence on a work order +- :guilabel:`Cleanup Time`: breakdown or cleanup time required after a work order is finished +- :guilabel:`Cost per hour`: the operating expense of that workstation. The :guilabel:`per employee` + value is for estimating the average cost per employee. -- :guilabel:`Equipment Name`: the name of the piece of equipment -- :guilabel:`Technician`: the technician responsible for servicing the equipment -- :guilabel:`Equipment Category`: the category the equipment belongs to -- :guilabel:`MTBF`: mean time between failures; the average time that the piece of equipment will - operate before failing -- :guilabel:`MTTR`: mean time to recovery; the average time it takes for the equipment to become - fully operational again -- :guilabel:`Est. Next Failure`: an estimate of when the next equipment failure will occur + .. seealso:: + :doc:`../basic_setup/mo_costs` -.. image:: using_work_centers/work-center-equipment.png - :align: center - :alt: The equipment tab of the work center form. +- :guilabel:`Allowed Employees`: the employees who can perform work at the work center. If blank, + all employees are allowed. -.. note:: - :guilabel:`MTBF`, :guilabel:`MTTR`, and :guilabel:`Est. Next Failure` are all calculated - automatically based on past failure data, if any exists. + .. example:: + If equipment at a work center requires a certification to operate, :guilabel:`Allowed + Employees` could list only those employees who have the certification. + +Set production capacities +------------------------- + +The :guilabel:`Capacity` setting on a work center creates a default value for how many units can be +produced at one time in a work center. To specify that a work center can produce different +quantities of different products, select the :guilabel:`Specific Capacities` tab. + +.. image:: using_work_centers/work-center-specific-capacities.png + :alt: A work center form with different capacities specified for different products. + +.. tip:: + To specify production capacities in different measurements from a count of units, enable the + *Units of Measure* feature in the **Inventory** app. + +.. seealso:: + :doc:`../../maintenance/add_new_equipment` .. _workcenter_iot: @@ -90,47 +139,155 @@ with a work center: - :guilabel:`Action`: the IoT device action triggered .. image:: using_work_centers/work-center-iot.png - :align: center :alt: The IoT Triggers tab of the work center form. -Use case: configure an alternative work center -============================================== +Assigning equipment to work centers +=================================== -When a work center is at capacity, it cannot accept any new work orders. Instead of waiting for the -work center to become available, it is possible to specify an alternative work center where surplus -work orders should be carried out. +The **Maintenance** app makes it possible to add specific equipment to a work center and +individually track its costs and productivity. It also adds the :guilabel:`Equipment` and +:guilabel:`Maintenance` tabs to the work center form, used to list equipment and schedule +maintenance activities. -Begin by creating a new work center. Configure the :guilabel:`Equipment` tab so that it has all of -the same equipment as the main work center. This will ensure that the same tasks can be carried out -at both work centers. Navigate to the main work center and include the new work center in the -:guilabel:`Alternative Workcenters` selection field. +.. seealso:: + :doc:`../../maintenance/add_new_equipment` -Now, create a new manufacturing order that uses the main work center for one of its operations. The -main work center will automatically be selected for the operation in the :guilabel:`Work Orders` -tab. After confirming the manufacturing order, click the :guilabel:`Plan` button that appears at the -top left of the form. +Configure equipment +------------------- -.. image:: using_work_centers/manufacturing-order-plan-button.png - :align: center - :alt: Click the plan button to automatically select an available work center. +Using the :guilabel:`Equipment` tab, it is possible for specific pieces of equipment to be assigned +to a work center. The following information is displayed for each piece of equipment added: -If the main work center is at capacity, the work center selected for the operation will be -automatically changed to the alternative work center. +- :guilabel:`Equipment Name`: the name of the piece of equipment +- :guilabel:`Technician`: the technician responsible for servicing the equipment +- :guilabel:`Equipment Category`: the category the equipment belongs to +- :guilabel:`MTBF`: mean time between failures; the average time that the piece of equipment will + operate before failing +- :guilabel:`MTTR`: mean time to recovery; the average time it takes for the equipment to become + fully operational again +- :guilabel:`Est. Next Failure`: an estimate of when the next equipment failure will occur -.. image:: using_work_centers/automatic-work-center-selection.png - :align: center - :alt: The alternative work center is automatically selected. +.. image:: using_work_centers/work-center-equipment.png + :alt: The equipment tab of the work center form. -Monitor work center performance -=============================== +.. note:: + :guilabel:`MTBF`, :guilabel:`MTTR`, and :guilabel:`Est. Next Failure` are all calculated + automatically based on past failure data, if any exists. + +Work center planning +==================== + +The currently scheduled work orders can be viewed by accessing :menuselection:`Manufacturing app --> +Planning --> Planning by Workcenter`. + +.. image:: using_work_centers/work-center-planning.png + :alt: The Gantt view of planning showing two assembly work centers. + +Different views show how many individual work orders are scheduled, how many minutes of each hour +the work center is in production, and the dates and times that are currently scheduled for work +orders. Times and planned work centers can be changed by clicking to access the individual work +order. -Performance for an individual work center can be viewed by selecting -:menuselection:`Configuration --> Work Centers`, and clicking on a work center. A variety of metrics -showing work center performance can be viewed at the top right of the form: +Work center performance +======================= + +Performance for an individual work center can be viewed by selecting :menuselection:`Configuration +--> Work Centers`, and clicking on a work center. Metrics are displayed in smart buttons at the top +of the form. + +.. image:: using_work_centers/work-center-smart-buttons.png + :alt: A work center form with smart buttons showing performance metrics. + +- :guilabel:`OEE`: overall equipment effectiveness, the percentage of time that the work center has + been productive out of its available work hours. + + .. seealso:: + - :doc:`../reporting/oee` -- :guilabel:`OEE`: overall effective efficiency, the percentage of time that the work center has - been fully productive - :guilabel:`Lost`: the amount of time lost due to work stoppages - :guilabel:`Load`: the amount of time it will take to complete the current workload - :guilabel:`Performance`: the real duration of work time, shown as a percentage of the expected duration + +Use case: measuring performance by shift using work centers +=========================================================== + +Work centers support defined working hours, enabling the tracking of production efficiency by shift. +To configure shift-based tracking, create working hours for each of the shifts, then duplicate +versions of each work center for each of the shifts. With this setup, comparing shift productivity +can be done with any of the available :doc:`reporting <../../../essentials/reporting>` tools. + +Working hours for multiple shifts +--------------------------------- + +To create working hours for multiple shifts, open a work center form and in the :guilabel:`Working +Hours` field click the :icon:`fa-arrow-right` (:guilabel:`Internal link`), and then click the +:guilabel:`New` button to create a new set of hours for the second shift. + +.. example:: + A manufacturer has two shifts: a day shift from 5 AM to 1 PM and a night shift from 1 PM to 9 PM. + Starting from any existing work center, edit the existing working hours to match the day shift. + + .. image:: using_work_centers/example-shift-day.png + :alt: The working hours for a day shift + + Once the day shift is saved, click the :icon:`fa-cog` :guilabel:`(cog)` icon and select + :guilabel:`Duplicate`. Rename this new schedule `Night Shift` and change each :guilabel:`Work + from` to 1 PM and :guilabel:`Work from` to 9 PM. + + .. image:: using_work_centers/example-shift-night.png + :alt: The working hours for a night shift + +Work centers for multiple shifts +-------------------------------- + +To create the duplicate work centers, return to the work center view by navigating to +:menuselection:`Configuration --> Work Centers` and duplicating each of the work centers that are +used by both shifts, either on the individual work center forms, or directly from the list view. + +.. tip:: + To duplicate work centers directly from the list view, click the :icon:`fa-check-square-o` + :guilabel:`(checkbox)` that appears above the list items to select all. Then, click the + :icon:`fa-cog` :guilabel:`Actions` button at the top of the list and select + :guilabel:`Duplicate`. + +.. example:: + A manufacturer has two work centers, `Assembly Line 1` and `Assembly Line 2`, and two working + hours, `Day Shift` and `Night Shift`. + + .. image:: using_work_centers/work-centers-with-shifts.png + :alt: Work centers copied for day and night shifts. + + To create versions of `Assembly Line 1` and `Assembly Line 2` for each shift, duplicate each of + the work centers. Select the first work center and add the shift name in that work center's name + and assign it the appropriate working hours. Optionally, configure each work center to use its + opposite shift counterpart as an alternate work center to make sure that manufacturing orders get + assigned to both. Tags can also help make a visual distinction between each shift. + + .. tip:: + Use the :icon:`oi-chevron-left` + :guilabel:`(left arrow)` and :icon:`oi-chevron-right` :guilabel:`(right arrow)` buttons in the + top left corner to move on to the next form in the list without returning to the list view. + +Reports comparing different shifts +---------------------------------- + +With multiple work centers created to represent shifts, reports that sort by work center will now +compare shifts. This can be used to compare the number of work orders that are being assigned each +shift, the OEE, or actual time that each shift is taking to produce a product. + +.. example:: + A report has been created to compare the time efficiency of two shifts producing the same product + in the same work center. + + .. image:: using_work_centers/work-order-duration-deviation.png + :alt: A bar graph of two work centers with duration deviations of -6.50 and 15.00 + + To create this report, go to :menuselection:`Reporting --> Work Orders` and click to remove the + :icon:`fa-filter` **Ready** *or* **Waiting** *or* **Pending** *or* **In Progress** filter by + clicking the :icon:`fa-x` :guilabel:`Remove` icon on its right side. Next, click the + :guilabel:`Measures` button and select :guilabel:`Duration Deviation (%)` + + In this case, the day shift has on average taken more than the expected time to produce products + (-6.50%) while the night shift took less than the expected time (15.00%). + diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/automatic-work-center-selection.png b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/automatic-work-center-selection.png deleted file mode 100644 index c4f2d2807c..0000000000 Binary files a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/automatic-work-center-selection.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/example-shift-day.png b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/example-shift-day.png new file mode 100644 index 0000000000..8cc9b38d34 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/example-shift-day.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/example-shift-night.png b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/example-shift-night.png new file mode 100644 index 0000000000..56ea1248d0 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/example-shift-night.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/manufacturing-order-plan-button.png b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/manufacturing-order-plan-button.png deleted file mode 100644 index e849e2dedc..0000000000 Binary files a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/manufacturing-order-plan-button.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-form.png b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-form.png index 2c1b478791..fd979d6340 100644 Binary files a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-form.png and b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-form.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-general-information.png b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-general-information.png index 2d8b425983..96d9bb33a1 100644 Binary files a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-general-information.png and b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-general-information.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-planning.png b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-planning.png new file mode 100644 index 0000000000..98d2728f20 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-planning.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-smart-buttons.png b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-smart-buttons.png new file mode 100644 index 0000000000..ea7b5cffe0 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-smart-buttons.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-specific-capacities.png b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-specific-capacities.png new file mode 100644 index 0000000000..0c86b35d58 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-specific-capacities.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-centers-with-shifts.png b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-centers-with-shifts.png new file mode 100644 index 0000000000..4f72cd3487 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-centers-with-shifts.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-order-duration-deviation.png b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-order-duration-deviation.png new file mode 100644 index 0000000000..0198202bfa Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-order-duration-deviation.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/working-hours-form.png b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/working-hours-form.png new file mode 100644 index 0000000000..6c1542553b Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/working-hours-form.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration.rst b/content/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration.rst index 96cac3549a..bcc930e970 100644 --- a/content/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration.rst +++ b/content/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration.rst @@ -7,8 +7,8 @@ Bill of materials .. |MO| replace:: :abbr:`MO (Manufacturing Order)` A *bill of materials* (or *BoM* for short) documents specific components, along with their -respective quantities, that are needed to produce or repair a product. In Odoo, |BoMs| as blueprints -for manufactured goods and kits, and often include production operations and step-by-step +respective quantities, that are needed to produce or repair a product. In Odoo, |BoMs| serve as +blueprints for manufactured goods and kits, and often include production operations and step-by-step guidelines, as well. BoM setup @@ -225,8 +225,7 @@ calculate costs, and define how components are consumed. .. seealso:: - :doc:`Analytic distribution <../../../finance/accounting/reporting/analytic_accounting>` - - :doc:`Lead times - <../../inventory/warehouses_storage/replenishment/lead_times>` + - :doc:`Lead times <../../inventory/warehouses_storage/replenishment/lead_times>` .. image:: bill_configuration/misc-tab.png :align: center diff --git a/content/applications/inventory_and_mrp/manufacturing/reporting.rst b/content/applications/inventory_and_mrp/manufacturing/reporting.rst index aba1a819fa..a944f922e7 100644 --- a/content/applications/inventory_and_mrp/manufacturing/reporting.rst +++ b/content/applications/inventory_and_mrp/manufacturing/reporting.rst @@ -5,6 +5,7 @@ Reporting .. toctree:: :titlesonly: + reporting/delayed reporting/allocation reporting/oee reporting/production_analysis diff --git a/content/applications/inventory_and_mrp/manufacturing/reporting/delayed.rst b/content/applications/inventory_and_mrp/manufacturing/reporting/delayed.rst new file mode 100644 index 0000000000..2916fc6b2e --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/reporting/delayed.rst @@ -0,0 +1,65 @@ +====== +Delays +====== + +.. |SO| replace:: :abbr:`SO (sales order)` +.. |SOs| replace:: :abbr:`SOs (sales orders)` +.. |MO| replace:: :abbr:`MO (manufacturing order)` +.. |MOs| replace:: :abbr:`MOs (manufacturing orders)` +.. |RfQ| replace:: :abbr:`RfQ (request for quotation)` + +Odoo's *Manufacturing* app displays *delays* in manufacturing orders through the :guilabel:`Delayed +Productions` filter. If the |MO|'s end date exceeds its deadline, the deadline is highlighted in red +to draw attention to the delay. + +.. image:: delayed/delayed-filter.png + :alt: The delayed production filter in Odoo. + +Deadline calculation +==================== + +The |MO| deadline depends on how the |MO| was created, and is calculated as follows: + +- **Make To Order**: the |MO| deadline is the *Sales Order Delivery Date*. +- **Replenishment**: the |MO| deadline is *today + Manufacturing Lead Time*. +- **Manually created MO**: the deadline field remains empty. + +.. important:: + The |MO| *deadline* is not the same as the |MO| *end date*. + + The end date is computed as: + + .. math:: + \text{End date} = + \text{Scheduled start date} + +\text{Total duration of all operations} + +Filters +======= + +Several additional filters are available to help track delays: + +- :guilabel:`Delayed Productions`: the |MO|'s *scheduled start date* is later than the deadline. +- :guilabel:`Late`: the |MO|'s *scheduled end date* exceeds the deadline, highlighted in red. +- :guilabel:`Late Availability`: one or more required components are not available before the + deadline. For example, a confirmed purchase order or manufacturing order for components is + scheduled to end *after* the |MO| deadline. +- :guilabel:`Components Available`: all components are available to begin production. + +Use case +======== + +Consider an |MO| with a deadline of **September 17th**: + +- If production on the |MO| starts after September 17th, it appears in the :guilabel:`Delayed + Productions` filter. +- If required components are scheduled to arrive after September 17th, the |MO| appears in the + :guilabel:`Late Availability` filter. +- If the |MO| has a scheduled end date after September 17th, it appears in the :guilabel:`Late` + filter. + +.. image:: delayed/deadline.png + :alt: An MO with the deadline emphasized. + +By combining these indicators, planners can quickly identify where production is at risk of missing +delivery commitments. diff --git a/content/applications/inventory_and_mrp/manufacturing/reporting/delayed/deadline.png b/content/applications/inventory_and_mrp/manufacturing/reporting/delayed/deadline.png new file mode 100644 index 0000000000..f9e7991a09 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/reporting/delayed/deadline.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/reporting/delayed/delayed-filter.png b/content/applications/inventory_and_mrp/manufacturing/reporting/delayed/delayed-filter.png new file mode 100644 index 0000000000..3464c540f1 Binary files /dev/null and b/content/applications/inventory_and_mrp/manufacturing/reporting/delayed/delayed-filter.png differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/eco_type.rst b/content/applications/inventory_and_mrp/plm/manage_changes/eco_type.rst index d9c3b2eb68..25bf72c0bb 100644 --- a/content/applications/inventory_and_mrp/plm/manage_changes/eco_type.rst +++ b/content/applications/inventory_and_mrp/plm/manage_changes/eco_type.rst @@ -5,22 +5,32 @@ .. |ECO| replace:: :abbr:`ECO (Engineering Change Order)` .. |ECOs| replace:: :abbr:`ECOs (Engineering Change Orders)` -======== -ECO type -======== +==================== +ECO types and stages +==================== -An *ECO type* is assigned to *engineering change orders* (ECOs) to organize and track changes to -products and bills of materials (BoMs). Each |ECO| type separates |ECOs| into a project in Gantt -view, ensuring collaborators and stakeholders **only** view and assist with relevant |BOM| -improvements. +Engineering change orders (ECOs) are categorized by the type of change they represent and their +statuses are tracked via stages. Both |ECO| types and stages are defined by the user and can be +customized to the specific needs of a business or industry. -For example, an electronic chip manufacturer might use 'New Product Introduction', 'Product -Improvement', 'Component Change', and 'Firmware Update' |ECO| types. Then, designers and engineers -can focus on |ECOs| in the 'New Product Introduction' and 'Product Improvement' projects, avoiding -unrelated supplier change or firmware update |ECOs|. +ECO types +========= -Create ECO type -=============== +Each |ECO| type separates |ECOs| into different projects in the :guilabel:`PLM Overview`, ensuring +collaborators and stakeholders only view and assist with relevant |BOM| improvements. + +.. example:: + An electronic chip manufacturer uses five |ECO| types: `New Product Introduction`, `BOM Updates`, + `Component Change`, `Product Improvement`, and `Firmware Update`. In their configuration, + engineers can spend time exclusively on |ECOs| in the `Component Change` and `Firmware Update` + types, while designers see |ECOs| in the `New Product Introduction` type, allowing each + discipline to focus only on those changes that require their domain expertise. + + .. image:: eco_type/eco-type-example.png + :alt: Example of several custom ECO types. + +Create an ECO type +------------------ To access and manage ECO types, navigate to :menuselection:`PLM app --> Configuration --> ECO Types`. @@ -39,105 +49,86 @@ the following information: change` project sent to the email address, `pawlish-change@pawlished-glam.odoo.com`. .. image:: eco_type/create-eco-type.png - :align: center :alt: Example of an ECO type. -Edit ECO type -============= +Edit ECO types +-------------- Modify existing |ECO| type names and email aliases by navigating to the :menuselection:`PLM app --> Configuration --> ECO Types` page. There, click on the desired |ECO| type from the list. -On the form for each |ECO| type, proceed to edit the :guilabel:`Name` and :guilabel:`Email Alias` -fields. +On the form for each |ECO| type, edit the :guilabel:`Name` or :guilabel:`Email Alias` fields. .. _plm/eco/stage-config: Stages ====== -Within an |ECO| type project, *stages* are like milestones and are used to identify the progress of -the |ECO| before the changes are ready to be applied. (e.g. 'Feedback', 'In Progress', 'Approved', -'Complete') - -Additionally, required approvers can be added to each stage, ensuring that changes to the production -|BOM| cannot proceed until the approver reviews and approves the |ECO|. Doing so prevents errors on -the production |BOM| by enforcing at least one review of suggested changes before they're applied on -a production |BOM|. +Within the :guilabel:`Engineering Change Orders` Kanban view for a specific |ECO| type, *stages* are +milestones used to identify the progress of the |ECO| before the changes are ready to be applied. By +default, Odoo uses `New`, `In Progress`, `Validated`, and `Effective`, but these are fully +customizable to the specific life cycle of an |ECO| type. -For best practice, there should be at least one *verification* stage, which is a stage with a -required approver, and one *closing* stage, which stores |ECOs| that have been either cancelled or -approved for use as the next production |BOM|. +.. image:: eco_type/eco-stage-defaults.png + :alt: Default stages for an ECO type. -Create stage ------------- +.. note:: + The `Effective` stage is folded by default to avoid listing every single |ECO| that has gone into + effect. See :ref:`Closing stage ` for more on this configuration. -To add a stage, go to the :menuselection:`PLM` app and select the intended project for an |ECO| type -from the :guilabel:`PLM Overview` dashboard. +:ref:`Verification stages ` require a designated user to approve, +ensuring that changes do not proceed until the |ECO| changes have been reviewed by the appropriate +stake holders. :ref:`Closing stages` that can apply changes put |BOM| and +operations changes into immediate effect, changing all pending and future :abbr:`MO (Manufacturing +orders)` to the latest |BOM| version. -Then, on the :guilabel:`Engineering Change Orders` project pipeline for the |ECO| type, click the -:guilabel:`+ Stage` button. Doing so reveals a text box to fill in the name of the stage. After -filling it in, click the :guilabel:`Add` button to finish adding the stage. +.. tip:: + The most common practice is to have at least one *verification* stage, which is a stage with a + required approver, and one *closing* stage, which stores |ECOs| that have been either cancelled + or approved for use as the next production |BOM|. -.. example:: - A new `Assigned` stage separates assigned |ECOs| from the unassigned ones in the `New` stage. - Adding another stage helps the product manager track unassigned tasks. +.. seealso:: + :doc:`Approvals<../management/approvals>` - .. image:: eco_type/create-stage.png - :align: center - :alt: Create a new stage in a project for an ECO type. +.. _plm/eco/verification-stage: -Verification stage ------------------- +Verification stages +------------------- -Click an ECO type from :menuselection:`PLM app --> Overview` to open a kanban view of |ECOs| of this -type. - -To configure a verification stage, hover over the intended stage, and select the :guilabel:`⚙️ -(gear)` icon. Then, click :guilabel:`Edit` to open a pop-up window. - -Configure the verification stage in the edit stage pop-up window, by checking the box for +To configure a verification stage, hover over the intended stage, and select the :icon:`fa-gear` +:guilabel:`(Actions)`. Then, click :guilabel:`Edit` to open a pop-up window and check the box for :guilabel:`Allow to apply changes`. -Then, add an approver in the :guilabel:`Approvers` section, by clicking :guilabel:`Add a line`, and -specifying the :guilabel:`Role` of the reviewer, their :guilabel:`User`, and :guilabel:`Approval -Type`. - -Make sure at least one approver is configured with the :guilabel:`Approval Type`: :guilabel:`Is -required to approve`. +Next, add an approver in the :guilabel:`Approvers` section, by clicking :guilabel:`Add a line`, and +specifying the :guilabel:`Role` of the reviewer, the :guilabel:`User`, and an :guilabel:`Approval +Type` of :guilabel:`Is required to approve`. See :ref:`more about approval types. +` The approver listed is automatically notified when |ECOs| are dropped in the stage specified in the pop-up window. Once finished, click :guilabel:`Save & Close`. -.. example:: - In the |ECO| type `New Product Introduction`, the verification stage `Validated` is configured by - clicking the :guilabel:`⚙️ (gear)` icon, and selecting :guilabel:`Edit`. Doing so opens the - :guilabel:`Edit: Validated` pop-up window. +.. seealso:: + :doc:`../management/approvals` - By adding the `Engineering manager` as an approver, only |ECOs| approved by this user can proceed - to the next stage, and have the changes applied on the production |BOM|. +.. _plm/eco/closing-stage: - Additionally, check the :guilabel:`Allow to apply changes` option to ensure proper behavior. +Closing stages +-------------- - .. image:: eco_type/verification-stage.png - :align: center - :alt: Show "Allow to apply changes" option is checked. +Click an |ECO| type from :menuselection:`PLM app --> Overview` to open the Kanban view of |ECOs| of +this type. -Closing stage -------------- - -Configure a closing stage by opening the :guilabel:`Edit: [stage]` pop-up window. To do so, hover -over the intended stage and click the :guilabel:`⚙️ (gear)` icon that appears in the top-right -corner. Then, click :guilabel:`Edit` from the drop-down menu. - -On the :guilabel:`Edit: [stage]` pop-up window, select the check boxes for :guilabel:`Folded in -kanban view`, :guilabel:`Allow to apply changes` and :guilabel:`Final Stage`. +To configure a closing stage that applies |BOM|, edit the stage and tick the boxes for +:guilabel:`Folded in kanban view`, :guilabel:`Allow to apply changes`, and :guilabel:`Final Stage`. +When ECO cards are placed in a stage that will *Allow to apply changes*, then any |BOM| and +operations changes validated in the |ECOs| will immediately be put into effect. To create a +cancelled stage, create or edit a stage and tick the boxes for :guilabel:`Folded in kanban view` and +:guilabel:`Final Stage`. |ECOs| in this stage are removed from the pipeline, but will not make +changes. .. example:: The closing stage, `Effective` is configured by checking the :guilabel:`Folded in kanban view`, :guilabel:`Allow to apply changes`, and :guilabel:`Final Stage` options -.. image:: eco_type/closing-stage.png - :align: center - :alt: Show configurations of the closing stage. - + .. image:: eco_type/closing-stage.png + :alt: Configuration of the closing stage. diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/closing-stage.png b/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/closing-stage.png index c9c8fe4230..5e9aaafd75 100644 Binary files a/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/closing-stage.png and b/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/closing-stage.png differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/create-stage.png b/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/create-stage.png deleted file mode 100644 index c48b94a1f7..0000000000 Binary files a/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/create-stage.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/eco-stage-defaults.png b/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/eco-stage-defaults.png new file mode 100644 index 0000000000..9f5204c7a8 Binary files /dev/null and b/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/eco-stage-defaults.png differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/eco-type-example.png b/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/eco-type-example.png new file mode 100644 index 0000000000..a05ca3a95b Binary files /dev/null and b/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/eco-type-example.png differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/verification-stage.png b/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/verification-stage.png deleted file mode 100644 index 61440340c3..0000000000 Binary files a/content/applications/inventory_and_mrp/plm/manage_changes/eco_type/verification-stage.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders.rst b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders.rst index c357405b4b..99ff0e0571 100644 --- a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders.rst +++ b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders.rst @@ -15,7 +15,6 @@ products, and :doc:`bills of materials <../../manufacturing/basic_setup/bill_con Engineering change orders can be created: #. :ref:`directly in the ECO type `. -#. by an operator in the :ref:`tablet view ` of an operation. #. automatically from feedback submitted to the :ref:`ECO type's email alias `. .. _plm/eco/create-eco: @@ -23,15 +22,14 @@ Engineering change orders can be created: Create ECO ========== -To create a new |ECO|, begin by navigating to the *PLM* app. Then, select the |ECO| type card that -will be used to track the progress of the change. On the :guilabel:`Engineering Change Orders` page, -click the :guilabel:`New` button in the top-left corner. +To create a new |ECO|, begin by navigating to the **PLM** app. Then, select the |ECO| type that +should be used to track the progress of the change. On the :guilabel:`Engineering Change Orders` +page, click the :guilabel:`New` button in the top-left corner. .. note:: - Learn how to create new :ref:`ECO types ` to categorize and organize change - orders. Doing so ensures employees only view the |ECOs| related to their responsibilities, - whether it involves new product introductions, targeted product line updates, or regulatory - compliance fulfillment. + :doc:`ECO types ` categorize and organize change orders. Doing so can ensure that + employees only view the |ECOs| related to their responsibilities, whether it involves new product + introductions, targeted product line updates, or regulatory compliance fulfillment. On the |ECO| form, fill in the following fields accordingly: @@ -43,16 +41,24 @@ On the |ECO| form, fill in the following fields accordingly: - :guilabel:`Bill of Materials` specifies the changed |BOM|. It auto-populates if the product in :guilabel:`Product` field has an existing |BOM|. If multiple |BOMs| exist, select the intended radio options from the drop-down menu. + + .. important:: + A :guilabel:`Product` must be selected before :guilabel:`Bill of Materials` options is + available. + - :guilabel:`Company` field is used in multi-company databases. Specify if the change applies to products in a specific company, or leave blank if the change applies to all companies. + + .. note:: + :guilabel:`Company` is only available to specify with multiple companies enabled. See + :doc:`../../../general/companies/multi_company`. + - :guilabel:`Responsible` represents the assignee in charge of this |ECO|. (Optional) - :guilabel:`Effective` specifies when the |ECO| becomes live. Choosing :guilabel:`As soon as possible` means the |ECO| applies to the production |BOM| as soon as an authorized user - :ref:`applies the changes `. - - On the other hand, choosing :guilabel:`At Date`, and setting a specific date, leaves a date that - makes it easier to track the version history of the |BOM|, and the specific date |BOMs|, used for - production. + :ref:`applies the changes `. :guilabel:`At Date` with a specific date + selected will only apply the |BOM| at that date, making it easier to track the version history of + the |BOM| in production. - :guilabel:`Tags` are assigned to |ECOs| for prioritization and organization. Create a new tag by typing the name in the field and selecting :guilabel:`Create` from the drop-down menu. (Optional) @@ -61,7 +67,7 @@ the changes. By pressing :guilabel:`Start Revision`, three actions occur: -#. The :guilabel:`Documents` smart button appears, storing relevant files of the |BOM|. +#. The :guilabel:`Documents` smart button appears, storing the relevant files of the |BOM|. #. A copy of the production |BOM| is stored in the newly-appeared :guilabel:`Revision` smart button of the |ECO|. The next available version number (e.g., `V2`, `V3`, ...) is also assigned to keep track of all |BOM| versions. @@ -73,8 +79,7 @@ By pressing :guilabel:`Start Revision`, three actions occur: Revision` button has been pressed. .. image:: engineering_change_orders/eco-form.png - :align: center - :alt: ECO with overview of stages in the top-right corner, and *Revision* smart button. + :alt: ECO with overview of stages in the top-right corner, and Revision smart button. Change components ================= @@ -89,7 +94,6 @@ the current version, by flagging the test |BOM| with a large :guilabel:`Archived Doing so opens the archived |BOM|, marked with a large red :guilabel:`Archived` flag. .. image:: engineering_change_orders/archived-bom.png - :align: center :alt: Show the archived Bill of Materials. On the new |BOM|, in the :guilabel:`Components` tab, proceed to modify the components list, by @@ -103,15 +107,21 @@ changing the :guilabel:`Quantity` of existing components, adding new components additional component, `Stabilizers`, is added. .. image:: engineering_change_orders/version-2-bom.png - :align: center - :alt: Make changes to components by going to the new BoM with the *Revision* smart button. + :alt: A revised BOM Compare changes --------------- -Once the changes are complete, navigate back to the |ECO|, by clicking `ECO00X` in the breadcrumbs -located in the top-left corner. On the |ECO| form, a new :guilabel:`BoM Changes` tab displays the -differences between the current |BOM| and the new version. +To compare a revised |BOM| to the previous version, navigate to the |ECO| for that |BOM| in either +of these ways: + +#. From the revised |BOM|, click the |ECO| name (for example, `ECO005: Improve...`) in the + breadcrumbs located in the top-left corner. +#. From the :guilabel:`PLM Overview`, click the :guilabel:`Engineering Changes` button on the + :guilabel:`BOM Updates` Kanban card. Click the Kanban card for the appropriate |ECO| to open it. + +On the |ECO| form, a new :guilabel:`BoM Changes` tab displays the differences between the current +|BOM| and the new version. Blue text indicates new components added to the revised |BOM| that are not in the production |BOM|. Black text represents updates shared by both |BOMs|, while red text indicates components removed in @@ -125,8 +135,7 @@ used in production. That is, until the :ref:`changes are applied -Operations --> Manufacturing Orders`. Then, select the desired :abbr:`MO (Manufacturing Order)` and -switch to the :guilabel:`Work Orders` tab. Then, click the :guilabel:`📱 (mobile phone)` icon for -the desired work order to open the *tablet view* of the operation. - -.. important:: - The :guilabel:`📱 (mobile phone)` icon is **only** available for :abbr:`MOs (Manufacturing - Orders)` with a :guilabel:`Confirmed` or :guilabel:`In Progress` status. - -.. image:: engineering_change_orders/tablet-icon.png - :align: center - :alt: Find the tablet icon for each operation, second from the far right. + :alt: View current BOM version in the Miscellaneous tab. -Next, add an instructional step, by clicking the :guilabel:`☰ (three horizontal lines)` icon in the -tablet view of an operation. Doing so opens the :guilabel:`Menu` of action items for a :abbr:`MO -(Manufacturing Order)`. Then, click the :guilabel:`Add a step` button. +View changes +============ -.. image:: engineering_change_orders/additional-options-menu.png - :align: center - :alt: Open the *Add a Step* pop-up by clicking the three horizontal lines icon in tablet view. +To review proposed changes, navigate to the :menuselection:`PLM app --> Overview`. In the `BOM +Updates` |ECO| type card, the :guilabel:`# Engineering Changes` button represents the number of +operational changes created. -Clicking the button reveals an :guilabel:`Add a step` pop-up window, where the proposed changes are -submitted. - -In the :guilabel:`Title` field, enter a short step description. Next, in the :guilabel:`Instruction` -text field, type the instructions of the step in greater detail. Optionally, add an image to the -:guilabel:`Document` field. Once completed, finish by clicking the :guilabel:`Propose Change` -button. - -.. example:: - To propose an additional check for broken components, enter the details in the :guilabel:`Add a - Step` pop-up window. Doing so creates an instructional quality control point that will be - reviewed in the following section. - - .. image:: engineering_change_orders/add-a-step.png - :align: center - :alt: Fill out the *Add a Step* form to suggest an additional quality control point. - -Based on the inputs from the :guilabel:`Add a Step` pop-up window, an |ECO| is created with the -following information: - -#. :guilabel:`Description` is the name of the operation, followed by the :abbr:`MO (Manufacturing - Order)` number for reference. -#. The |ECO| :guilabel:`Type` is automatically assigned to `BOM Changes`. -#. :guilabel:`Product` and :guilabel:`Bill of Materials` fields are automatically populated, based - on the |BOM| used in the :abbr:`MO (Manufacturing Order)`. -#. :guilabel:`Responsible` is the operator who submitted the feedback. - -View ECO --------- - -To review the proposed changes, navigate to the :menuselection:`PLM app --> Overview`. In the `BOM -Updates` |ECO| type card, the :guilabel:`X Engineering Changes` button represents the amount of -operational changes created from the tablet view. - -Click on the :guilabel:`X Engineering Changes` button to open the kanban view of the |ECO| type. To +Click on the :guilabel:`# Engineering Changes` button to open the Kanban view of the |ECO| type. To view the suggestion, select an |ECO| in the `New` stage. On the |ECO|, view a summary of the proposed changes in the :guilabel:`Operation Changes` tab. Click @@ -325,31 +280,35 @@ the :guilabel:`Revision` smart button to navigate to the revised |BOM| and look changes in greater detail. .. example:: - An operator suggested another check for broken components by adding a step from the tablet view, - while performing the `Assemble switches` operation for the :abbr:`MO (Manufacturing Order)` - `WH/MO/00010` for the product, `Keyboard`. + An operator suggested another check for broken components by adding a step while performing the + `Assemble switches` operation for the :abbr:`MO (Manufacturing Order)` `WH/MO/00010` for the + product, `Keyboard`. Then, this created |ECO| can be viewed by navigating to the `BOM Changes` ECO type found in - :menuselection:`PLM app --> Overview`. By default, |ECOs| created from tablet view are set to - spawn in the `New` stage. + :menuselection:`PLM app --> Overview`. The :guilabel:`Responsible` field is assigned to the operator who made the suggestion, allowing the employee revising the |BOM| to seek further clarification from the person who proposed the changes. + .. image:: engineering_change_orders/view-bom-change.png - :align: center - :alt: Find the new ECO in the "BOM Changes" ECO type, in the *New* stage. + :alt: Find the new ECO in the "BOM Changes" ECO type, in the "New" stage. -On the revised |BOM|, switch to the :guilabel:`Operations` tab, and select the :guilabel:`☰ (three -horizontal lines)` icon. Doing so opens a list of :guilabel:`Steps` to perform the operation, with -the newest instruction titled `New Step Suggestion:`, followed by the user-entered title. Click the -line item to view the suggested changes. +On the revised |BOM|, switch to the :guilabel:`Operations` tab, and select the :icon:`fa-list-ul` +:guilabel:`(Show Instructions)` icon. Doing so opens a list of :guilabel:`Steps` to perform the +operation, with the newest instruction titled `New Step Suggestion:`, followed by the user-entered +title. Click the line item to view the suggested changes. .. image:: engineering_change_orders/show-instructions.png - :align: center :alt: "Show Instructions" icon in the *Operations* tab of a BoM. +Quality control points +---------------------- + +.. important:: + The :doc:`Quality <../../quality>` app is required to configure quality control points. + On the :ref:`quality control point ` form, ensure the following form fields are accurately filled out to give detailed instructions for operators: @@ -370,10 +329,9 @@ Once the quality control point is configured, return to the :guilabel:`Steps` li breadcrumbs. Finally, drag the last quality control line item to its intended order of instructions. .. example:: - Drag and reorder the `Check for broken switches` instruction, by clicking and dragging its "6 - dots" icon to move it from the bottom to the second position. + Drag and reorder the `Check for broken switches` instruction, by clicking and dragging its + :icon:`oi-draggable` :guilabel:`(draggable)` icon to move it from the bottom to the second + position. .. image:: engineering_change_orders/reorder.png - :align: center - :alt: Drag and reorder instructions by selecting the "6 dots" icon on the far left. - + :alt: Drag and reorder instructions by selecting the "draggable" icon on the far left. diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/add-a-step.png b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/add-a-step.png deleted file mode 100644 index 1fdf4af690..0000000000 Binary files a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/add-a-step.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/additional-options-menu.png b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/additional-options-menu.png deleted file mode 100644 index 00efc0e544..0000000000 Binary files a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/additional-options-menu.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/bom-changes.png b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/bom-changes.png index 489d20348f..05b7c646eb 100644 Binary files a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/bom-changes.png and b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/bom-changes.png differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/bom-version.png b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/bom-version.png index 626d676854..cb3600abe3 100644 Binary files a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/bom-version.png and b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/bom-version.png differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/eco-form.png b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/eco-form.png index d1dee29081..e12b23e6c1 100644 Binary files a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/eco-form.png and b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/eco-form.png differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/instructions-smart-button.png b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/instructions-smart-button.png index 2e1e47e40d..77630a36cd 100644 Binary files a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/instructions-smart-button.png and b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/instructions-smart-button.png differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/reorder.png b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/reorder.png index 0bcfb1fbef..abdd13f4fa 100644 Binary files a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/reorder.png and b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/reorder.png differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/show-instructions.png b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/show-instructions.png index d9ced1276a..ad323dcd56 100644 Binary files a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/show-instructions.png and b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/show-instructions.png differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/tablet-icon.png b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/tablet-icon.png deleted file mode 100644 index 17694d791f..0000000000 Binary files a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/tablet-icon.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/view-bom-change.png b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/view-bom-change.png index 59045f0b7d..910d12f903 100644 Binary files a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/view-bom-change.png and b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/view-bom-change.png differ diff --git a/content/applications/inventory_and_mrp/plm/management/approvals.rst b/content/applications/inventory_and_mrp/plm/management/approvals.rst index 32f8a61091..6c388c5504 100644 --- a/content/applications/inventory_and_mrp/plm/management/approvals.rst +++ b/content/applications/inventory_and_mrp/plm/management/approvals.rst @@ -15,51 +15,56 @@ premature actions. .. seealso:: :ref:`Stage configuration ` -Add approver -============ +Add approvers +============= To add an approver, first go to the :menuselection:`PLM app`, and click on the project card of an -ECO type to open the Gantt view of the |ECOs|. +|ECO| type to open the Gantt view of the |ECOs|. On the :guilabel:`Engineering Change Orders` page, hover over the intended stage, and select the -:guilabel:`⚙️ (gear)` icon. Then, click :guilabel:`Edit` to open a pop-up window. +:icon:`fa-gear` :guilabel:`(Actions)` icon. Then, click :guilabel:`Edit` to open a pop-up window. .. note:: - Approvers can be added to any stage, but it's strongly recommended to assign them to the - *verification* stage, which comes before the *closing* stage, where |ECOs| are applied, and the - :abbr:`BoM (Bill of Materials)` version is updated. + Approvers can be added to any stage, but they are most essential in the *verification* stage, + before the final *closing* stage which applies the |ECO| and updates the :abbr:`BoM (Bill of + Materials)`. This allows stakeholders to control how and when changes are made. See the documentation about :ref:`stage types ` for more information. +In the :guilabel:`Edit` stage pop-up window, click the :guilabel:`Add a line` button, located under +:guilabel:`Approvals`. Then, type in the position or title of the approver under :guilabel:`Role` +(e.g. `Engineering Manager`, `Quality Team`, etc.), and select the relevant :guilabel:`User` from +the drop-down menu. + .. _plm/approvals/approval-type: -In the :guilabel:`Edit` stage pop-up window, click the :guilabel:`Add a line` button, located under -:guilabel:`Approvals`. Then, type in the approver's position (or title) under :guilabel:`Role` (e.g. -`Engineering Manager`, `Quality Team`, etc.), and select the relevant :guilabel:`User` from the -drop-down menu. +Approval types +-------------- Next, set the :guilabel:`Approval Type` to :guilabel:`Is required to approve`, :guilabel:`Approves, but the approval is optional`, or :guilabel:`Comments only`. .. example:: Assign the `CTO`, "Mitchell Admin," as a required approver for |ECOs| in the `Validated` stage in - the `New Product Introduction` ECO type. + the `New Product Introduction` |ECO| type. Approvals from the quality and marketing teams are **not** required to apply changes to the |ECO| because their :guilabel:`Approval Type` is set to :guilabel:`Approves, but the approval is optional` and :guilabel:`Comments only`, respectively. .. image:: approvals/approvers.png - :align: center :alt: Set an approver that "Is required to approve" ECOs in the "Validated" stage. Manage approvals ================ -Approvers can easily track their to-do approvals by navigating to the :menuselection:`PLM app`, and -looking at the card for an ECO type, which shows the count of open tasks assigned to them. +Approvers can track their to-do approvals by navigating to the :menuselection:`PLM app`, and +selecting the card for an |ECO| type, which shows the count of open tasks assigned to them. -Here's what each button on an ECO project card does: +.. image:: approvals/validation-overview.png + :alt: Display count of validations to-do and buttons to open filtered list of ECOs. + +Here's what each button on an |ECO| project card does: #. The :guilabel:`# Engineering Changes` button displays a count of in-progress |ECOs| of this ECO type. Clicking the button opens the Gantt view of the :guilabel:`Engineering Change Orders` page. @@ -72,13 +77,13 @@ Here's what each button on an ECO project card does: Clicking on the button displays all the |ECOs| to approve, and apply changes to, in the verification stage. - |ECOs| marked with the green :guilabel:`Done` stage have already been approved, and the user just - needs to click on the |ECO| to enter the form view, and click the :guilabel:`Apply Changes` - button. +|ECOs| marked with the green :guilabel:`Done` stage have already been approved, and the user needs +to click on the |ECO| to enter the form view, and click the :guilabel:`Apply Changes` button. -.. image:: approvals/validation-overview.png - :align: center - :alt: Display count of validations to-do and buttons to open filtered list of ECOs. +.. tip:: + |ECO| approvals can be accessed, managed, and follow-up actions scheduled through *Activities*. + See the :doc:`Activities documentation <../../../essentials/activities>` to learn more about + integrating management workflows. Approve ECOs ------------ @@ -93,68 +98,6 @@ Note that the :guilabel:`Apply Changes` button will **not** work unless the :gui button was clicked first. Additionally, the chatter logs the history of the clicked buttons. .. warning:: - When the :guilabel:`Approval Type` is **not** set to :guilabel:`Is required to approve`, approval - from the associated user is not needed before applying changes with the :guilabel:`Apply Changes` - button. Thus, the :guilabel:`Apply Changes` button **will work** without requiring the - :guilabel:`Approve` button to be clicked first. - -Automated activities --------------------- - -When an |ECO| is moved to a verification stage, a planned activity is automatically created for -assigned approvers to review the |ECO|. Approvers receive a notification in their activities inbox, -accessible through the :guilabel:`🕘 (clock)` icon at the top of the page. - -In the to-do task list, the :guilabel:`Engineering Change Order (ECO)` notification displays the -number of activities marked :guilabel:`Late`, :guilabel:`Today`, and :guilabel:`Future`. Clicking on -each of these buttons shows a filtered Gantt view of the respective |ECOs|. - -.. example:: - Scheduled activities are shown as a number on the :guilabel:`🕘 (clock)` icon, with `5` |ECOs| - pending approval :guilabel:`Today`. Currently, there are `0` :guilabel:`Late` or - :guilabel:`Future` |ECOs|. - - .. image:: approvals/todo-list.png - :align: center - :alt: Show scheduled approvals notifications for the user. - -By clicking a pending |ECO|, a *planned activity* for :guilabel:`ECO Approval` is recorded in the -chatter. Click on the :guilabel:`i (Info)` icon to view additional information, including the -approval's :guilabel:`Created` date, the approver :guilabel:`Assigned to` it, and the due date. - -.. image:: approvals/planned-activity.png - :align: center - :alt: Show additional details of the planned ECO approval. - -Follow-up activities -~~~~~~~~~~~~~~~~~~~~ - -When |ECOs| are rejected, tasks need to be assigned to project members for required modifications -before |ECO| approval. To create tasks with deadlines, navigate to the rejected |ECO| form, and go -to the chatter. - -Select the :guilabel:`Mark Done` button in the :guilabel:`Planned Activities` section of the chatter -to close the activity, and open a pop-up window for creating tasks. - -.. image:: approvals/mark-as-done.png - :align: center - :alt: Show *Mark Done* window to show *Done & Schedule Next*, *Done*, and *Discard* buttons to - close the planned activity. - -In the :guilabel:`Mark Done` window, click :guilabel:`Done & Schedule Next` to open a new -:guilabel:`Schedule an Activity` window. Next, set the :guilabel:`Assigned to` team member and the -:guilabel:`Due Date` for completing the changes. Provide task details in the :guilabel:`Summary` -field and the text box. Click the :guilabel:`Schedule` button to close the window. - -After closing the window, on the |ECO| form, move the |ECO| back one stage. Doing so ensures that -when the team member completes the changes, and returns the |ECO| to the verification stage, a new -:guilabel:`ECO Approval` task is created for the approver. - -.. example:: - The approver creates an activity for the :guilabel:`Responsible` of the |ECO|, `Laurie Poiret`, - that details the changes required for the approver to :guilabel:`Accept` the |ECO|. Clicking the - :guilabel:`Schedule` button creates a planned activity for Laurie due on `08/15/2023`. - - .. image:: approvals/schedule-an-activity.png - :align: center - :alt: Create a scheduled activity for follow-up changes to a rejected ECO. + If no approver has the :guilabel:`Is required to approve` approval type, the :guilabel:`Apply + Changes` button **will work** without requiring the :guilabel:`Approve` button to be clicked + first. diff --git a/content/applications/inventory_and_mrp/plm/management/approvals/mark-as-done.png b/content/applications/inventory_and_mrp/plm/management/approvals/mark-as-done.png deleted file mode 100644 index d8b6308e8c..0000000000 Binary files a/content/applications/inventory_and_mrp/plm/management/approvals/mark-as-done.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/plm/management/approvals/planned-activity.png b/content/applications/inventory_and_mrp/plm/management/approvals/planned-activity.png deleted file mode 100644 index 83cd58cb9d..0000000000 Binary files a/content/applications/inventory_and_mrp/plm/management/approvals/planned-activity.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/plm/management/approvals/schedule-an-activity.png b/content/applications/inventory_and_mrp/plm/management/approvals/schedule-an-activity.png deleted file mode 100644 index 6753a67d33..0000000000 Binary files a/content/applications/inventory_and_mrp/plm/management/approvals/schedule-an-activity.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/plm/management/approvals/todo-list.png b/content/applications/inventory_and_mrp/plm/management/approvals/todo-list.png deleted file mode 100644 index 7f000a4309..0000000000 Binary files a/content/applications/inventory_and_mrp/plm/management/approvals/todo-list.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/purchase/advanced/edi.rst b/content/applications/inventory_and_mrp/purchase/advanced/edi.rst index ae6d6d4ba2..446aa89ae5 100644 --- a/content/applications/inventory_and_mrp/purchase/advanced/edi.rst +++ b/content/applications/inventory_and_mrp/purchase/advanced/edi.rst @@ -13,13 +13,19 @@ In Odoo, a *purchase order* (PO) can be exported as an XML file and imported as into another Odoo database, removing the need for manual entry of products, quantities, prices, and other key information. +The workflow in this document describes how buyers and sellers exchange data directly between their +Odoo databases. As an alternative, sellers can receive a PDF version of the request for quotation +(RFQ) by email and :ref:`upload it directly in their Sales dashboard +`. **This method is simpler** but does not use the XML-based exchange +described in the document. + .. note:: - Exported XMLs follow the `Order-X schema `_, a standard - commonly used in European countries. When exchanging data between two Odoo databases, this schema - remains compatible. + Exported XMLs follow the `UBL schema + `_. When exchanging data between two + Odoo databases, this schema remains compatible. - However, implementing custom developments for software that does not support the Order-X schema - may introduce additional complexity. + However, implementing custom developments for software that does not support the UBL schema may + introduce additional complexity. Roles and configuration ======================= @@ -31,9 +37,12 @@ configurations. Buyer database -------------- -The buyer database is responsible for creating and confirming purchase orders. Prerequisites include -:ref:`installing ` the **Purchase** app and adding vendors (the sellers in this -workflow) as :doc:`portal users <../../../general/users/portal>`. +The buyer database is responsible for creating and confirming purchase orders. Prerequisites +include: + +#. (required) :ref:`installing ` the **Purchase** app +#. (optional) adding vendors (the sellers in this workflow) as :doc:`portal users + <../../../general/users/portal>`. Seller database --------------- @@ -48,7 +57,7 @@ Buyer's process --------------- To begin, the buyer (in their database) navigates to the :menuselection:`Purchase` app to create a -request for quotation (RFQ). +:abbr:`RFQ (request for quotation)`. Set the :guilabel:`Vendor` to the portal user representing the seller, and :guilabel:`Confirm` the :abbr:`RFQ (request for quotation)`. Doing so converts it into a :doc:`purchase order @@ -92,6 +101,8 @@ file. .. example:: :download:`XML file ` for PO00017 +.. _purchase/advanced/rfq-upload: + Upload file ~~~~~~~~~~~ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills.rst b/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills.rst index 49ed880b3a..6d127b6830 100644 --- a/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills.rst +++ b/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills.rst @@ -1,53 +1,41 @@ -===================== -Bill control policies -===================== +================ +Control policies +================ .. _purchase/manage_deals/control-bills: .. |PO| replace:: :abbr:`PO (Purchase Order)` .. |POs| replace:: :abbr:`POs (Purchase Orders)` -In Odoo's *Purchase* app, the *bill control* policy determines the quantities billed by vendors on -every purchase order (PO), for either ordered or received quantities. +In Odoo's **Purchase** app, the *Control Policy* determines the quantities billed by vendors on +every purchase order (PO). For example, choosing *On ordered quantities* means the bill is based on +ordered items, even if they have not been received yet. -The policy selected in the *Purchase* app settings acts as the default value, and is applied to any -new product created. +The control policy is selected on the *Product* record. Configuration ============= -To configure the *bill control* policy, navigate to :menuselection:`Purchase app --> Configuration ---> Settings`, and scroll down to the :guilabel:`Invoicing` section. Under :guilabel:`Bill Control`, -select either :guilabel:`Ordered quantities` or :guilabel:`Received quantities`. Then, click -:guilabel:`Save`. +To configure the control policy for a product, navigate to :menuselection:`Purchse app --> Prodcuts +--> Products`, then click on a product record to open it. Click to the :guilabel:`Purchase` tab. +Scroll to the :guilabel:`Vendor Bills` section. Under :guilabel:`Control Policy`, tick the radio +button for either :guilabel:`On ordered quantities` or :guilabel:`On recieved quantities`. -.. image:: control_bills/control-bills-selected-policy.png - :align: center - :alt: Selected bill control policy in Purchase app settings. +- :guilabel:`On ordered quantities`: Creates a vendor bill as soon as a |PO| is confirmed. The + products and quantities in the |PO| are used to generate a draft bill. +- :guilabel:`On received quantities`: A bill is created only *after* part of the total order has + been received. The products and quantities received are used to generate a draft bill. An error + message appears if creation of a vendor bill is attempted without receiving anything. -- :guilabel:`Ordered quantities`: creates a vendor bill as soon as a |PO| is confirmed. The products - and quantities in the |PO| are used to generate a draft bill. -- :guilabel:`Received quantities`: a bill is created only *after* part of the total order has been - received. The products and quantities received are used to generate a draft bill. An error message - appears if creation of a vendor bill is attempted without receiving anything. +The default control policy for a product is determined by the :guilabel:`Product Type`: - .. image:: control_bills/control-bills-error-message-popup.png - :align: center - :alt: Bill control policy draft bill error message. +- **Services**: The default control policy is *On ordered quantities*. +- **Goods**: The default control policy is *On delivered quantities* -.. note:: - If a specific product should use a different control policy than selected in the *Purchase* app - settings, the :guilabel:`Bill Control` policy for that product can be changed from its product - form. - - To do that, navigate to :menuselection:`Purchase app --> Products --> Products`, and select a - product. From the product form, click the :guilabel:`Purchase` tab. Under the :guilabel:`Vendor - Bills` section, modify the selection in the :guilabel:`Control Policy` field. - -3-way matching -============== +Pay vendor bills with 3-way matching +==================================== -The *3-way matching* feature ensures vendor bills are only paid once some (or all) of the products +The *3-way matching* feature ensures vendor bills are only paid once some, or all, of the products included in the |PO| have been received. To activate *3-way matching*, navigate to :menuselection:`Purchase app --> Configuration --> @@ -55,16 +43,8 @@ Settings`, and scroll down to the :guilabel:`Invoicing` section. Then, tick the :guilabel:`3-way matching` to enable the feature, and click :guilabel:`Save`. .. image:: control_bills/control-bills-three-way-matching.png - :align: center :alt: Enabled 3-way matching feature in Purchase app settings. -.. important:: - The :guilabel:`3-way matching` feature **only** works with the :guilabel:`Bill Control` policy - set to :guilabel:`Received quantities`. - -Pay vendor bills with 3-way matching ------------------------------------- - When *3-way matching* is enabled, vendor bills display a :guilabel:`Should Be Paid` field under the :guilabel:`Other Info` tab. When a new vendor bill is created, the field is set to :guilabel:`Yes`, since a bill **cannot** be created until at least some of the products included in a |PO| have been @@ -78,18 +58,15 @@ Paid` field. .. important:: The |PO| selected from the list **must not** be billed yet, or an :guilabel:`Invalid Operation` - pop-up window appears. This occurs for |POs| with a :guilabel:`Received quantities` policy, and a - :guilabel:`Fully Billed` :guilabel:`Billing Status`. + pop-up window appears. .. image:: control_bills/control-bills-invalid-operation.png - :align: center :alt: Invalid Operation pop-up window for billed Purchase Order. Click the drop-down menu next to :guilabel:`Should Be Paid` to view the available options: :guilabel:`Yes`, :guilabel:`No`, and :guilabel:`Exception`. .. image:: control_bills/control-bills-should-be-paid.png - :align: center :alt: Should Be Paid field status on draft vendor bill. .. note:: @@ -131,7 +108,6 @@ Orders --> Purchase Orders`, and select a |PO| to view. Click the :guilabel:`Other Information` tab, and locate the :guilabel:`Billing Status` field. .. image:: control_bills/control-bills-billing-status.png - :align: center :alt: Billing status field on a purchase order form. The table below details the different values the :guilabel:`Billing Status` field could read, and diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-billing-status.png b/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-billing-status.png index a9542b57ab..97772e831f 100644 Binary files a/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-billing-status.png and b/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-billing-status.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-error-message-popup.png b/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-error-message-popup.png deleted file mode 100644 index 9ef0f70aa4..0000000000 Binary files a/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-error-message-popup.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-selected-policy.png b/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-selected-policy.png deleted file mode 100644 index 552e836356..0000000000 Binary files a/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-selected-policy.png and /dev/null differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-should-be-paid.png b/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-should-be-paid.png index 523df59353..4f55cd6690 100644 Binary files a/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-should-be-paid.png and b/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-should-be-paid.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/rfq.rst b/content/applications/inventory_and_mrp/purchase/manage_deals/rfq.rst index d167844104..55b52686f8 100644 --- a/content/applications/inventory_and_mrp/purchase/manage_deals/rfq.rst +++ b/content/applications/inventory_and_mrp/purchase/manage_deals/rfq.rst @@ -20,40 +20,50 @@ Product ------- To auto-populate product information and prices on an |RFQ|, configure products by going to -:menuselection:`Purchase app --> Products --> Products`. Select an existing product, or create a -new one by selecting :guilabel:`New`. Doing so opens the product form, where various sales and -purchasing data can be configured. +:menuselection:`Purchase app --> Products --> Products`. Select an existing product, or create a new +one by selecting :guilabel:`New`. Doing so opens the product form, where sales and purchasing data +can be configured. -To configure purchasable products, tick the :guilabel:`Can be purchased` checkbox, under the product -name. Then, go to the :guilabel:`Inventory` tab, and enable the :guilabel:`Buy` route. +To configure purchasable products, tick the :guilabel:`Purchase` checkbox, under the product name. +Next, go to the :guilabel:`Inventory` tab, and enable the :guilabel:`Buy` route. + +.. important:: + The :guilabel:`Inventory` tab and routes are only visible if using the :doc:`Inventory app + <../../inventory>`. + +.. seealso:: + :doc:`Configure product types and track quantities + <../../../inventory_and_mrp/inventory/product_management/configure>` .. image:: rfq/product-vendor-pricelist-config.png - :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. +In the :guilabel:`Purchase` tab of the product form, click :guilabel:`Add a line` to 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. +Default columns include :guilabel:`Quantity`, :guilabel:`Unit Price`, and :guilabel:`Delivery Lead +Time`, but other columns like, :guilabel:`Vendor Product Code` or :guilabel:`Discount (%)`, can also +be enabled. To enable or disable columns, click the :icon:`oi-settings-adjust` :guilabel:`(additional options)` icon on the right side of the header row to reveal a drop-down menu of additional columns that can be added (or removed) from the :guilabel:`Purchase` tab. .. note:: - Alternatively, prices and delivery lead times for existing products can be added in bulk by - going to :menuselection:`Purchase app --> Configuration --> Vendor Pricelists`. Click - :guilabel:`New` in the top-left corner. In the :guilabel:`Vendor` section of the pricelist form - that appears, add the product information as it pertains to the vendor. + Alternatively, prices and delivery lead times for existing products can be added by going to + :menuselection:`Purchase app --> Configuration --> Vendor Pricelists`. Click :guilabel:`New` in + the top-left corner. In the :guilabel:`Vendor` section of the pricelist form that appears, add + the product information as it pertains to the vendor. Order products ============== @@ -70,8 +80,8 @@ The :guilabel:`Requests for Quotation` dashboard displays an overview of the com |POs|, and their status. The top of the screen breaks down all |RFQs| in the company, as well as individual ones (where the user is the buyer) with a summary of their status. -The top-right corner also provides a quick report of the company's recent purchases by total value, -lead times, and number of |RFQs| sent. +The top-right corner also provides a report of the company's recent purchases by total value, lead +times, and number of |RFQs| sent. Additionally, the dashboard includes buttons for: @@ -80,10 +90,9 @@ Additionally, the dashboard includes buttons for: - :guilabel:`Late`: |RFQs| or |POs| where the :guilabel:`Order Deadline` has passed. .. image:: rfq/rfq-dashboard.png - :align: center :alt: RFQ dashboard with orders and order statuses. -In addition to various view options, the :guilabel:`Requests for Quotation` dashboard provides +In addition to view options, the :guilabel:`Requests for Quotation` dashboard provides :guilabel:`Filters` and :guilabel:`Group By` options, accessible via the search bar drop-down menu. .. seealso:: @@ -91,8 +100,8 @@ In addition to various view options, the :guilabel:`Requests for Quotation` dash .. _purchase/manage_deals/create-new-rfq: -Create new |RFQ| ----------------- +Create a new |RFQ| +------------------ To create a new |RFQ|, click the :guilabel:`New` button on the top-left corner of the :guilabel:`Requests for Quotation` dashboard to reveal a new |PO| form. @@ -103,11 +112,15 @@ The :guilabel:`Vendor Reference` field points to the sales and delivery order nu vendor. This comes in handy once products are received, and the |PO| needs to be matched to the delivery order. -The :guilabel:`Blanket Order` field refers to long-term purchase agreements on recurring orders with -set pricing. To view and configure blanket orders, head to :menuselection:`Purchase app --> Orders ---> Purchase agreements`. +With the :doc:`Purchase Agreements feature ` activated, the :guilabel:`Blanket +Order` field appears, referring to long-term purchase agreements on recurring orders with set +pricing. To view and configure blanket orders, head to :menuselection:`Purchase app --> Orders --> +Purchase agreements`. -The :guilabel:`Currency` can be changed, if purchasing products from a vendor in another country. +.. important:: + The :guilabel:`Purchase agreements` view only appears if the :guilabel:`Blanket Order` setting is + enabled. To do so, navigate to :menuselection:`Purchase app --> Configuration --> Settings`, then + tick the :guilabel:`Blanket Orders` checkbox. Next, configure an :guilabel:`Order Deadline`, which is the date by which the vendor must confirm their agreement to supply the products. @@ -116,19 +129,30 @@ their agreement to supply the products. After the :guilabel:`Order Deadline` is exceeded, the |RFQ| is marked as late, but the products can still be ordered. -:guilabel:`Expected Arrival` is automatically calculated based on the :guilabel:`Order Deadline` -and vendor lead time. Tick the checkbox for :guilabel:`Ask confirmation` to ask for signage at -delivery. +:guilabel:`Expected Arrival` is automatically calculated based on the :guilabel:`Order Deadline` and +vendor lead time. Tick the checkbox for :guilabel:`Ask confirmation` to ask the vendor to confirm +the shipping date by email. With the :doc:`Storage Locations feature -<../../inventory/warehouses_storage/inventory_management/use_locations>` activated, -the :guilabel:`Deliver to` field appears, with options for the order shipment. +<../../inventory/warehouses_storage/inventory_management/use_locations>` activated, the +:guilabel:`Deliver to` field appears, which specifies which warehouse operation (set in the +**Inventory** app) is used to receive the shipment. Select the receiving warehouse address here, or select :guilabel:`Dropship` to indicate that this order is to be shipped directly to the end customer. When :guilabel:`Dropship` is selected, the :guilabel:`Dropship address` field is enabled. Contact names auto-populate here from the **Contacts** app. +.. important:: + The :guilabel:`Dropship` options only appear if the :guilabel:`Dropshipping` setting is enabled + in the **Inventory** app. To do so, navigate to :menuselection:`Inventory app --> Configuration + --> Settings`, then tick the :guilabel:`Dropshipping` checkbox. + +.. tip:: + To create |RFQs| using different currencies, each currency needs to be enabled in the + **Invoicing** app settings. See :doc:`../../../sales/sales/products_prices/prices/currencies` to + learn more. + Products tab ~~~~~~~~~~~~ @@ -136,9 +160,9 @@ In the :guilabel:`Products` tab, add the products to be ordered. Click :guilabel and type in the product name, or select the item from the drop-down menu. To create a new product and add it, type the new product name in the :guilabel:`Product` column, -select :guilabel:`Create [product name]` from the resulting drop-down menu, and manually add the -unit price. Or, select :guilabel:`Create and edit...` to be taken to the product form for that new -item. +select :guilabel:`Create [product name]` from the resulting drop-down menu and manually add the unit +price. Alternatively, select :guilabel:`Create and edit...` to be taken to the product form for that +new item. :guilabel:`Catalog` can also be selected to navigate to a product menu from the chosen vendor. From here, products can be added to the cart. @@ -148,8 +172,8 @@ here, products can be added to the cart. :icon:`oi-arrow-right` :guilabel:`(right arrow)` icon that becomes available upon hovering over the :guilabel:`Product` name. -Send |RFQ| ----------- +Send the |RFQ| +-------------- Clicking :guilabel:`Send by Email` reveals a :guilabel:`Compose Email` pop-up window, with a :guilabel:`Purchase: Request for Quotation` template loaded, ready to send to the vendor's email @@ -160,6 +184,11 @@ After crafting the desired message, click :guilabel:`Send`. Once sent, the |RFQ| Clicking :guilabel:`Print RFQ` downloads a PDF of the |RFQ|. +.. seealso:: + :doc:`../../../essentials/contacts` + +.. _purchase/manage_deals/confirm-order: + Confirm order ------------- @@ -189,4 +218,3 @@ documentation on :doc:`managing vendor bills `. .. seealso:: :doc:`manage` - diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/rfq/product-vendor-pricelist-config.png b/content/applications/inventory_and_mrp/purchase/manage_deals/rfq/product-vendor-pricelist-config.png index ac56dfd354..9fce1cc470 100644 Binary files a/content/applications/inventory_and_mrp/purchase/manage_deals/rfq/product-vendor-pricelist-config.png and b/content/applications/inventory_and_mrp/purchase/manage_deals/rfq/product-vendor-pricelist-config.png differ diff --git a/content/applications/inventory_and_mrp/quality/quality_management/quality_checks.rst b/content/applications/inventory_and_mrp/quality/quality_management/quality_checks.rst index 79089af29d..e9b488068e 100644 --- a/content/applications/inventory_and_mrp/quality/quality_management/quality_checks.rst +++ b/content/applications/inventory_and_mrp/quality/quality_management/quality_checks.rst @@ -50,6 +50,8 @@ Select a quality check type from the :guilabel:`Type` drop-down field: - :guilabel:`Instructions` provides specific instructions for how to conduct the quality check. - :guilabel:`Take a Picture` requires a picture to be attached to the check before the check can be completed. +- :guilabel:`Print label` opens a pop-up from which labels can be printed. This step can be + customized to provide instructions about where to add the labels on a product. - :guilabel:`Pass - Fail` is used when the product being checked must meet a certain criteria to pass the check. - Selecting :guilabel:`Measure` causes a :guilabel:`Measure` input field to appear, in which a diff --git a/content/applications/marketing/email_marketing.rst b/content/applications/marketing/email_marketing.rst index 683f6c03d7..48fef529fe 100644 --- a/content/applications/marketing/email_marketing.rst +++ b/content/applications/marketing/email_marketing.rst @@ -9,8 +9,10 @@ interactive features to create engaging email campaigns. The *Email Marketing* a detailed reporting metrics to track the campaigns' overall effectiveness. .. seealso:: - `Odoo Tutorial: Email Marketing - `_ + - `Odoo Tutorial: Email Marketing + `_ + - `Magic Sheet - Email Marketing strategy [PDF] + `_ .. cards:: diff --git a/content/applications/marketing/events/create_events.rst b/content/applications/marketing/events/create_events.rst index edf36bac50..a19305af5a 100644 --- a/content/applications/marketing/events/create_events.rst +++ b/content/applications/marketing/events/create_events.rst @@ -12,6 +12,8 @@ Events can be manually created from scratch or built off of pre-made templates. registration of the event for attendees, the *Sales* app for the purchasing ability of paid tickets, as well the *CRM* application through customizable lead generation rules. +.. _events/new-event: + New event ========= diff --git a/content/applications/marketing/marketing_automation.rst b/content/applications/marketing/marketing_automation.rst index b6d2198c59..5ffcfc2c20 100644 --- a/content/applications/marketing/marketing_automation.rst +++ b/content/applications/marketing/marketing_automation.rst @@ -16,7 +16,9 @@ Get started by creating a :ref:`new campaign from scratch `. .. seealso:: - `Odoo Tutorials: Marketing `_ + - `Odoo Tutorials: Marketing `_ + - `Magic Sheet - Marketing Automation [PDF] + `_ .. cards:: diff --git a/content/applications/marketing/marketing_automation/campaign_templates/double_optin.rst b/content/applications/marketing/marketing_automation/campaign_templates/double_optin.rst index fe142f3e33..398328d496 100644 --- a/content/applications/marketing/marketing_automation/campaign_templates/double_optin.rst +++ b/content/applications/marketing/marketing_automation/campaign_templates/double_optin.rst @@ -82,7 +82,7 @@ website homepage. Click on the button to edit the button text and URL. .. tip:: To provide a streamlined experience for the contact, consider :doc:`creating a page on the - website <../../../websites/website/pages>` that expresses gratitude to the contact for + website <../../../websites/website/structure/pages>` that expresses gratitude to the contact for confirming their subscription to the mailing list. Add the link to that page in the URL of the confirmation button. diff --git a/content/applications/marketing/sms_marketing.rst b/content/applications/marketing/sms_marketing.rst index d5bb0b7b86..4d5a7d6bcd 100644 --- a/content/applications/marketing/sms_marketing.rst +++ b/content/applications/marketing/sms_marketing.rst @@ -45,6 +45,12 @@ rate)` outcomes. Find out more about Odoo's SMS pricing, and check out some of the most frequently asked questions. + .. card:: Twilio + :target: sms_marketing/twilio + + In some countries with stricter regulations, the out-of-the-box solution proposed by Odoo may + not work. In this case, you can use our Twilio integration to send SMS worldwide. + SMS marketing dashboard ======================= @@ -81,3 +87,4 @@ detailed analysis. sms_marketing/marketing_campaigns sms_marketing/mailing_lists_blacklists sms_marketing/pricing_and_faq + sms_marketing/twilio diff --git a/content/applications/marketing/sms_marketing/twilio.rst b/content/applications/marketing/sms_marketing/twilio.rst new file mode 100644 index 0000000000..9d32e49092 --- /dev/null +++ b/content/applications/marketing/sms_marketing/twilio.rst @@ -0,0 +1,71 @@ + +============== +SMS via Twilio +============== + +What is Twilio +============== + +Twilio is a third-party provider that enables you to send SMS messages to your clients. Odoo +provides an easy way to use this service within your Odoo apps. + +Why would I need it? +-------------------- + +Although Odoo already comes with an out-of-the-box (IAP) solution for SMS messages, it might not +work in some countries with stricter legal requirements. Currently, Odoo registers itself when +possible to avoid extra setup for its customers, however in some countries that is not enough and +the client itself must do it. This can be done through Twilio. + +Setup your Twilio account +========================= + +By creating a Twilio account, you will be able to create a virtual phone number from which you will +be able to send SMS messages. These cost credits that are to be bought on Twilio, not Odoo. + +#. Go to `Twilio `_ +#. Sign up and create a Twilio account +#. Within your Twilio account, you can create multiple accounts (e.g. one for testing, one for each + sub-company, etc.) +#. Create a new account + + #. Enter the name, and select :guilabel:`Twilio` for the type + #. Select your :guilabel:`Billing Country` and click :guilabel:`Create new account` + #. Select the different options that match your needs + + - For the :guilabel:`Twilio product`, select :guilabel:`SMS` + - For :guilabel:`How to build with Twilio`, select :guilabel:`With no code at all` + - For your :guilabel:`goal`, select :guilabel:`3rd party integrations` + #. Click on :guilabel:`Get Started with Twilio` +#. You account is now created, and you should arrive on your :guilabel:`Dashboard` +#. Go to :menuselection:`Phone Numbers --> Manage --> Buy a number` +#. Buy a number (it is a paying service, but you should have received some credits to start with) +#. Go back to bottom of the :guilabel:`Dashboard` page +#. Copy the :guilabel:`Account SID` and :guilabel:`Auth Token` + +.. important:: + In case of a testing account, you will only be able to send SMS to phones that you have verified + within `Twilio's console `_. + +.. note:: + Sending SMS to some countries (such as the US or Canada) might require a registration. This can + only be done by you, and not by Odoo. Please check out `Twilio's Help Center + `_. + + +Setup Odoo to use Twilio +======================== + +#. :ref:`Install ` the :guilabel:`Twilio SMS` module (`sms_twilio`) +#. In Odoo, go to :menuselection:`Settings --> General Settings --> Contacts --> Send SMS`, select + :guilabel:`Send via Twilio` option, and save your change. +#. Go back to that option, and click :guilabel:`Configure Twilio Account` +#. Paste the copied credentials accordingly +#. Click on :guilabel:`Reload numbers` +#. Your newly bought phone number should appear in the list +#. You can use the :guilabel:`Test Number` field to send an SMS + +You can have multiple numbers (for instance once per country, or one per campaign), in that case, +you can reorder the numbers. By default, when sending an SMS to a client, Odoo will select the +number whose country is the same as the client. If none matches, Odoo will use the first number +available from the list respecting the order you have chosen. diff --git a/content/applications/productivity.rst b/content/applications/productivity.rst index c93354bc84..60c9e3d682 100644 --- a/content/applications/productivity.rst +++ b/content/applications/productivity.rst @@ -10,6 +10,7 @@ Productivity productivity/documents productivity/sign productivity/spreadsheet + productivity/dashboards productivity/knowledge productivity/calendar productivity/appointments diff --git a/content/applications/productivity/appointments.rst b/content/applications/productivity/appointments.rst index f84a6854fd..d58fad3d84 100644 --- a/content/applications/productivity/appointments.rst +++ b/content/applications/productivity/appointments.rst @@ -1,3 +1,6 @@ +:show-content: +:hide-toc: + ============ Appointments ============ @@ -147,9 +150,9 @@ If this feature is enabled, the appointment time slot is still considered *reser confirmed or rejected. Leave this checkbox blank to automatically accept meetings created from this appointment. -The :guilabel:`Create Opportunities` feature adds a lead or opportunity to the **CRM** app for each -scheduled appointment, which is assigned to the responsible user. Tick the :guilabel:`Create -Opportunities` checkbox to enable this option. +The :doc:`Create Opportunities ` feature adds an opportunity to the +**CRM** app for each scheduled appointment, which is assigned to the responsible user. Tick the +:guilabel:`Create Opportunities` checkbox to enable this option. .. important:: This field is only visible if the **CRM** app is installed on the database. @@ -161,6 +164,8 @@ and the time frame. Tick the :guilabel:`Allow Guests` checkbox to grant customers the ability to add additional guests when registering for an appointment. +.. _appointments/questions: + Questions tab ------------- @@ -197,3 +202,8 @@ Publishing an appointment When an appointment is ready to publish, click the :guilabel:`Go to Website` smart button at the top of the record. Then, slide the :icon:`fa-toggle-off` :guilabel:`Unpublished` icon to :icon:`fa-toggle-on` :guilabel:`Published`. + +.. toctree:: + :titlesonly: + + appointments/create-opps diff --git a/content/applications/productivity/appointments/create-opps.rst b/content/applications/productivity/appointments/create-opps.rst new file mode 100644 index 0000000000..8ab3827659 --- /dev/null +++ b/content/applications/productivity/appointments/create-opps.rst @@ -0,0 +1,70 @@ +====================================== +Create opportunities from appointments +====================================== + +When creating a new appointment type in the **Appointments** application, users have the option to +create new *opportunities* with information from new bookings. This option captures information from +scheduled appointments and creates opportunities in the **CRM** app. + +.. important:: + This option is only available if the **CRM** application is installed on the database. + +Configuration +============= + +Navigate to the **Appointments** app dashboard. Click :guilabel:`New` to :doc:`create a new +appointment type <../appointments>`. To edit an existing appointment type, click +:icon:`fa-cog` :guilabel:`Action` at the far-right of the appointment line, to open the drop-down +menu, then click :icon:`fa-pencil` :guilabel:`Edit`. + +.. image:: create-opps/edit-appointment.png + :alt: The edit button on an appointment type record. + +On the appointment type record, click the :guilabel:`Options` tab, and tick the :guilabel:`Create +Opportunities` checkbox. + +.. image:: create-opps/options-tab.png + :alt: The options tab on an appointment type form. + +Add questions +------------- + +The :guilabel:`Questions` tab allows users to :ref:`add questions ` to the +appointment booking page. When customers are booking an appointment slot, they are prompted to +answer these questions. The information provided by customers is available in the :ref:`new +opportunity `. Adding questions to the appointment type is optional. However, +the additional information captured by the questions can be useful later in the sales pipeline. + +.. example:: + A furniture company creates a new appointment type for sales demos. Customers reserve time with + salespeople to discuss their furniture and design needs. However, because the time is limited to + only thirty minute increments, salespeople do not have the time to show all of the available + furniture styles in every call. They add questions to the appointment type to prompt customers to + provide additional information about the products and services they are interested in. Not only + does this help when preparing for the demo, it also provides clarity further along in the sales + process. + + .. image:: create-opps/custom-questions.png + :alt: An appointment booking form with custom questions. + +.. _appointments/new-opp: + +Viewing the new opportunity +=========================== + +To view opportunities created from appointments, navigate to the :menuselection:`CRM` app dashboard. +If necessary, remove any filters from the search bar. Then, click the Kanban card for the +appropriate opportunity to open it. + +The contact information from the appointment is added to the opportunity record. The answers the +customer provided to the optional questions are included in the :guilabel:`Internal Notes` tab. The +scheduled appointment is listed in the *Chatter* of the record, and can be edited from there. + +.. image:: create-opps/opp-chatter.png + :alt: The chatter of an opportunity in the CRM with the scheduled appointment information. + +.. note:: + If an opportunity is created from a :ref:`resource based ` appointment + type, the user who created the appointment type is listed as the :guilabel:`Salesperson` for the + opportunity. If it is created from a user based appointment, the user the appointment is + scheduled with is assigned as the :guilabel:`Salesperson`. diff --git a/content/applications/productivity/appointments/create-opps/custom-questions.png b/content/applications/productivity/appointments/create-opps/custom-questions.png new file mode 100644 index 0000000000..cc73eebdc1 Binary files /dev/null and b/content/applications/productivity/appointments/create-opps/custom-questions.png differ diff --git a/content/applications/productivity/appointments/create-opps/edit-appointment.png b/content/applications/productivity/appointments/create-opps/edit-appointment.png new file mode 100644 index 0000000000..36b12c6a67 Binary files /dev/null and b/content/applications/productivity/appointments/create-opps/edit-appointment.png differ diff --git a/content/applications/productivity/appointments/create-opps/opp-chatter.png b/content/applications/productivity/appointments/create-opps/opp-chatter.png new file mode 100644 index 0000000000..988c827ae9 Binary files /dev/null and b/content/applications/productivity/appointments/create-opps/opp-chatter.png differ diff --git a/content/applications/productivity/appointments/create-opps/options-tab.png b/content/applications/productivity/appointments/create-opps/options-tab.png new file mode 100644 index 0000000000..96663b591e Binary files /dev/null and b/content/applications/productivity/appointments/create-opps/options-tab.png differ diff --git a/content/applications/productivity/dashboards.rst b/content/applications/productivity/dashboards.rst new file mode 100644 index 0000000000..873bf5a0fd --- /dev/null +++ b/content/applications/productivity/dashboards.rst @@ -0,0 +1,281 @@ +:show-content: + +========== +Dashboards +========== + +.. toctree:: + :titlesonly: + + dashboards/build_and_customize_dashboards + dashboards/my_dashboard + +**Odoo Dashboards** allows you to consult, customize, and build interactive dashboards that display +real-time data from your Odoo database in an easy-to-understand way. By centralizing data from +various Odoo sources in a single location, dashboards provide an overview of key business metrics +that can help you monitor business performance and make informed decisions. + +:doc:`Odoo spreadsheets <../../applications/productivity/spreadsheet>` serve as the foundation for +dashboards, with tables and charts used to structure and visualize dynamic Odoo data. :ref:`Data +sources ` connect a dashboard's underlying spreadsheet to your +database, ensuring the most recent data is retrieved every time the dashboard is opened or +refreshed. + +With Odoo Dashboards, users can, depending on their :ref:`access rights +`: + +- :ref:`consult dashboards `, including :ref:`standard, + pre-configured dashboards ` +- :ref:`interact with dashboards ` using filters and by + accessing underlying data +- :ref:`share a snapshot of a dashboard ` with internal users who do + not have the appropriate access rights or with external users +- :doc:`build custom dashboards + <../../applications/productivity/dashboards/build_and_customize_dashboards>` using Odoo + Spreadsheet +- :ref:`customize dashboards ` to modify what data is + shown, the layout, or the filters available +- :ref:`manage access rights ` to dashboards +- centralize frequently consulted Odoo views on a personal + :doc:`../../applications/productivity/dashboards/my_dashboard` page + +.. tip:: + - Once a spreadsheet has been converted into a dashboard, it can only be accessed via the + Dashboards app. + - Unlike other Odoo dashboards, :guilabel:`My Dashboard` is not based on Odoo Spreadsheet, but + rather on :doc:`Odoo views <../studio/views>`. + +.. _dashboards/consult-dashboards: + +Consult dashboards +================== + +On the main Dashboards page, the left panel lists all :ref:`dashboards a user has access to +`, grouped by section. Clicking on a dashboard name opens that +dashboard in the main part of the page. + +.. tip:: + Clicking the :icon:`fa-angle-double-left` :guilabel:`(double chevron)` icon at the top of the + left panel collapses the panel, maximizing the space available for dashboards. + +.. _dashboards/consult-dashboards/standard: + +Standard dashboards +------------------- + +Depending on which apps are installed, a series of standard dashboards is available by default. + +These pre-configured dashboards have been designed to provide the most relevant insights +for the topic in question. Data on specific aspects of the topic is presented in tables and charts, +while dashboard-specific filters allow users to tailor the view to their needs. + +.. example:: + Within the :guilabel:`Sales` section in the Dashboards app, the :guilabel:`Sales` dashboard gives + an overview of the number of quotations and orders, the revenue, and the average order value, as + well as a chart showing monthly sales. It also includes tables listing top quotations and sales + orders, top-performing products and salespeople, and top countries served. + + A series of pre-configured global filters at the top of the dashboard allows the entire dashboard + to be filtered by, e.g., product or sales team. A default value of `Last 90 days` in the period + filter means data from the previous 90 days is automatically retrieved every time the dashboard + is opened or refreshed. + + .. image:: dashboards/sales-dashboard.png + :alt: Overview of Sales dashboard + +Standard dashboards can be :ref:`customized ` by a user +with the appropriate :ref:`access rights `. +For example, dashboard elements like tables and charts, or global filters can be added, edited, or +removed. + +.. important:: + When customizing a standard dashboard, it is highly recommended to :ref:`duplicate the dashboard + ` and make any changes on the + duplicated version. Standard dashboards are reinstalled at each Odoo version upgrade, meaning any + customizations on the original version are lost. + +.. _dashboards/use-dashboards/interact: + +Interact with dashboards +------------------------ + +In addition to consulting a dashboard for a high-level overview of key business data, it is also +possible to interact with the dashboard for a more detailed analysis: + +- **Filter data**: Most standard dashboards have one or more :doc:`global filters + `, shown as dropdown menus, at the top of the dashboard. These filters + allow all the data on the dashboard to be filtered at the same time, for example, to show data + only for a specific period of time, or for one or more salespeople or customers. + +- **Open underlying database records**: To access database records referenced by a dashboard, click + on the relevant value in a table or on a data point on a chart. Doing so opens either the + individual record, or, in the case of charts or tables displaying consolidated data, a list of the + referenced records. + +- **Open underlying database views**: To access the view from which the data for a specific chart + or table is retrieved, click on the title of the chart or table. Doing so opens the corresponding + list view, pivot view or graph view. + +.. tip:: + To return to a dashboard after drilling down to underlying records or views, click the + :guilabel:`Dashboards` breadcrumb at the upper left of the page. + +.. _dashboards/configuration: + +Configuration +============= + +.. note:: + Only a user with the appropriate :ref:`access rights ` can configure or + modify settings for dashboards and dashboard sections. + +To manage dashboards and dashboard sections, go to :menuselection:`Configuration --> Dashboards`. +The following actions are possible at the level of dashboard sections: + +- **Change the order of dashboard sections** by using the :icon:`oi-draggable` :guilabel:`(drag + handle)` icon to move a section to a new position. + +- **Duplicate a dashboard section** by selecting the relevant section name, clicking the + :icon:`fa-cog` :guilabel:`Actions` button, and then :icon:`fa-clone` :guilabel:`Duplicate`. The + dashboards within the section are not duplicated. + +- **Delete a dashboard section** by selecting the relevant section name, clicking the :icon:`fa-cog` + :guilabel:`Actions` button then :icon:`fa-trash-o` :guilabel:`Delete`. + + .. tip:: + Standard, pre-installed dashboard sections cannot be deleted; custom dashboard sections, on + the other hand, can be deleted. + +- **Create a new dashboard section** by clicking :guilabel:`New`, then entering the section name. + When creating a new section, it is possible to add a dashboard to the new section + directly by clicking :guilabel:`Add a spreadsheet`. + +Clicking on an individual dashboard section lists all dashboards within that section. The following +actions are possible: + +- **Change the order of a dashboard within its section** by using the :icon:`oi-draggable` + :guilabel:`(drag handle)` icon to move the dashboard to a new position. + +- **Edit the name of a dashboard section or dashboard** by clicking the name and modifying it. + +- **Add or remove user groups** to :ref:`control access to the dashboard + `. + +- **Select a company** if, in a :doc:`multi-company + <../../applications/general/companies/multi_company>` database, the dashboard should only be + visible to users of one company. If this field is left blank, the dashboard is visible to all + users with the appropriate access rights, regardless of which company is currently selected in the + database. + +- **Unpublish a dashboard** by disabling the :guilabel:`Is Published` toggle. + +- **Edit the underlying spreadsheet** of a dashboard by clicking :icon:`fa-pencil` :guilabel:`Edit` + on the line of the relevant dashboard. + + .. important:: + When customizing a standard dashboard, it is highly recommended to :ref:`duplicate the + dashboard ` and make any changes + on the underlying spreadsheet of the duplicated version. Standard dashboards are reinstalled at + each Odoo version upgrade, meaning any customizations on the original version are lost. + +- **Delete a dashboard** by clicking the :icon:`fa-trash` :guilabel:`(trash)` icon. + + .. tip:: + A standard dashboard that is deleted is reinstalled at the next Odoo version upgrade. + +- **Add a new dashboard to the section** by clicking :guilabel:`Add a spreadsheet`. Two options + exist: + + - To convert an existing spreadsheet into a dashboard and add it to the new section, select the + relevant spreadsheet, then click :guilabel:`Confirm`. Back in the section overview, update the + :guilabel:`Group` and :guilabel:`Company` fields if needed. + + - To start creating a dashboard from scratch, select :guilabel:`Blank spreadsheet`. To return to + the section overview, click the name of the section at the top left of the page. Update the + :guilabel:`Group` and :guilabel:`Company` fields if needed. + + .. note:: + After a spreadsheet has been converted into a dashboard, it can only be :ref:`accessed and + edited via the Dashboards app `. + + .. tip:: + - A newly created dashboard is by default accessible to users belonging to the default internal + :ref:`user group `. Edit this if needed via the configuration page of + the relevant dashboard section. + - It is also possible to :ref:`convert a spreadsheet into a dashboard + ` and add it to a dashboard section + starting from the spreadsheet in the Documents app. + +.. _dashboards/access-and-sharing: + +Access rights and sharing +========================= + +.. _dashboards/access-and-sharing/viewing: + +Consulting dashboards +--------------------- + +The *right to view and interact with a dashboard* is based on :ref:`user groups +`, and is managed in the :ref:`Configuration settings +` of the Dashboards app. Only users who are part +of a group that has been granted access to a specific dashboard see that dashboard in the left-hand +panel on the main Dashboards page. Users with `Dashboard / Admin` access rights can view all +dashboards. + +However, the *visibility of dynamic Odoo data within a dashboard* is handled separately. This is +based on a user's :ref:`access rights ` to the model from which the +data has been retrieved, and takes into account any record rules that may restrict access. + +.. important:: + User permissions are taken into account when a user opens a dashboard, with the dashboard only + being populated with data the user is authorized to see. This means that a user could in theory + be able to view a dashboard but, due to a lack of appropriate permissions, not be able to see the + Odoo data the dashboard's creator intended to be displayed. + + Therefore, it is crucial to take user permissions into consideration when granting dashboard + access to groups. + +.. example:: + Granting the user group `Sales / User: Own Documents Only` access to the :guilabel:`Sales` + dashboard would serve little purpose. While users belonging to that group would be able to view + and interact with the dashboard, they would only see data related to their own sales, rendering + the overall dashboard misleading. + +.. _dashboards/access-and-sharing/manage-view-access: + +Manage access rights to view dashboards +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To manage users' rights to view and interact with a dashboard: + +#. In the Dashboards app, go to :menuselection:`Configuration --> Dashboards`. +#. From the list of dashboard sections, open the relevant section. +#. On the line of the relevant dashboard, in the :guilabel:`Group` column: + + - add a user group by clicking the field until a dropdown with user groups appears, then + selecting the appropriate user group. In the dropdown, click :guilabel:`Search More` to access + the full list of user groups; + - remove a user group by clicking the relevant group name, then clicking :icon:`fa-times` + :guilabel:`(Delete)`. + +.. _dashboards/access-and-sharing/customize-configure-build: + +Building, customizing and configuring dashboards +------------------------------------------------ + +Only users with `Dashboards / Admin` access rights can :ref:`customize dashboards +` or :ref:`configure dashboard settings +`. To :ref:`build a dashboard from scratch +`, a user must have both `Dashboards / Admin` and `Documents +/ User` access rights. + +.. _dashboards/access-and-sharing/sharing: + +Share dashboard snapshot +------------------------ + +To share a frozen version of a dashboard with an internal user who does not have the appropriate +access or with an external party, click :icon:`fa-share-alt` :guilabel:`Share` at the top-right of +the page then click the :icon:`fa-clone` :guilabel:`(copy)` icon to copy a shareable link to your +clipboard. diff --git a/content/applications/productivity/dashboards/build_and_customize_dashboards.rst b/content/applications/productivity/dashboards/build_and_customize_dashboards.rst new file mode 100644 index 0000000000..a8fc987be2 --- /dev/null +++ b/content/applications/productivity/dashboards/build_and_customize_dashboards.rst @@ -0,0 +1,223 @@ +============================== +Build and customize dashboards +============================== + +In addition to consulting :ref:`standard dashboards `, users +with the appropriate :ref:`access rights ` +can :ref:`build custom dashboards from scratch ` or +:ref:`customize existing dashboards ` to respond to +specific business needs. + +.. _build_and_customize_dashboards/build: + +Build a dashboard +================= + +In its most simple terms, building a dashboard involves :doc:`inserting Odoo data into a spreadsheet +<../../../applications/productivity/spreadsheet/insert>` then :ref:`converting that spreadsheet into +a dashboard `. + +However, to build a dashboard that delivers relevant and valuable insights, it is important to +consider the process in terms of three key stages: :ref:`preparation +`, :ref:`data insertion and manipulation +`, and :ref:`data visualization +`. + +.. _build_and_customize_dashboards/build-preparation: + +Preparation +----------- + +This stage involves: + +- defining the purpose of the dashboard, in other words, the business questions it needs to answer, + and deciding what data would answer those questions; +- determining where to find the relevant Odoo data and deciding which :doc:`type of view + <../../../applications/studio/views>` (i.e., list, pivot table, or chart) is most suited for the + data analysis needed; +- preparing the Odoo data by refining the views to focus on the most relevant information, e.g., by + using :doc:`search filters <../../../applications/essentials/search>`, by making only certain list + fields visible, or by deciding which dimensions and measures a pivot table should use; +- sourcing any other information needed to support the dashboard. + +.. _build_and_customize_dashboards/build-insertion-manipulation: + +Data insertion and manipulation +------------------------------- + +This stage involves: + +- :doc:`inserting the prepared lists, pivot tables or charts + <../../../applications/productivity/spreadsheet/insert>` into the spreadsheet you will use to + build your dashboard; +- manipulating the data, if needed, to be able to draw the necessary insights. This may involve + performing calculations or creating custom metrics using :doc:`standard or Odoo-specific functions + and formulas <../../../applications/productivity/spreadsheet/functions>`, referencing data from + various sources within the spreadsheet, or :doc:`converting static pivot tables to dynamic pivot + tables <../../../applications/productivity/spreadsheet/dynamic_pivot_tables>`. + +.. _build_and_customize_dashboards/build-visualization: + +Data visualization +------------------ + +This stage involves: + +- presenting the data on at least the first sheet of your spreadsheet (i.e., the sheet that will + serve as the front end of your dashboard) in a clear, visual, and meaningful way so it is easy to + interpret. Concretely, this means deciding on the layout and order of elements such as tables and + charts, as well as using tools and techniques to guide the user, such as clear and descriptive + headings, text formatting and colors, carefully chosen chart types, and conditional formatting to + highlight specific data visually; +- :ref:`inserting clickable links `, if relevant, to provide + access to Odoo menu items, URLs, or other sheets within the same spreadsheet if these should also + be accessible from the front end of your dashboard; +- :doc:`creating global filters <../../../applications/productivity/spreadsheet/global_filters>` to + allow users to tailor the view to their needs; +- :ref:`converting the spreadsheet into a dashboard + `, determining whether to add the dashboard + to an existing or new dashboard section, and :ref:`managing access rights to the dashboard + `. + +.. tip:: + - Use standard dashboards as inspiration for how to best present and visualize data. For example, + for charts, :ref:`open the underlying spreadsheet + ` of a standard dashboard, hover + over a chart and click the :icon:`fa-bars` :guilabel:`(menu)` icon, then + :icon:`fa-pencil-square-o` :guilabel:`Edit` to see the chart properties on the right side of + the screen. + - The possibility to link to other sheets within the same spreadsheet allows the creation of a + multi-page dashboard, with users able to navigate between pages thanks to clickable links. + Global filters apply across all pages of a dashboard. + +.. seealso:: + `Odoo Tutorial: Dashboard from scratch + `_ + +.. _build_and_customize_dashboards/customize: + +Customize a dashboard +===================== + +Dashboards are customized by editing the dashboard's underlying spreadsheet. + +.. important:: + When customizing a :ref:`standard dashboard `, it is + highly recommended to :ref:`duplicate the dashboard + ` and make any changes on + the underlying spreadsheet of the duplicated version. Standard dashboards are reinstalled at + each Odoo version upgrade, meaning any customizations on the original version are lost. + +.. _build_and_customize_dashboards/customize/open-spreadsheet: + +Open the underlying spreadsheet +------------------------------- + +To open a dashboard's underlying spreadsheet: + +#. In the Dashboards app, go to :menuselection:`Configuration --> Dashboards`. +#. Open the relevant dashboard section, then, on the line of the relevant dashboard, click + :icon:`fa-pencil` :guilabel:`Edit`. + +.. tip:: + - Users who do not have the appropriate :ref:`access rights + ` to customize a dashboard can still + access a read-only version of the dashboard's underlying spreadsheet. + - To temporarily unpublish a dashboard while you make changes, disable :guilabel:`Is Published` + *before* editing the dashboard, making note to republish it when the customization has been + finalized. + - With :ref:`developer mode ` activated, click on the :icon:`fa-pencil` + :guilabel:`(Edit)` icon beside the name of a dashboard in the left panel to open its underlying + spreadsheet. + +The spreadsheet that opens typically consists of at least two sheets: + +- **The first sheet** always serves as the front end of your dashboard, and contains the tables + and charts used to structure and visualize the data. + +- **The second and any subsequent sheets** typically contain data used for the calculation of key + metrics shown on the first sheet. + +.. note:: + The :ref:`data sources ` that maintain the connection between + the spreadsheet and the relevant models in your database can be viewed by clicking + :menuselection:`Data` on the spreadsheet's menu bar. These data sources are identified by + their respective :icon:`oi-view-pivot` :guilabel:`(pivot table)`, :icon:`oi-view-list` + :guilabel:`(list)` or :icon:`fa-bar-chart` :guilabel:`(chart)` icon, followed by their ID and + name, e.g., :icon:`oi-view-pivot` *(#1) Sales Analysis by Product*. + + For :ref:`standard dashboards `, while the data sources + are still active and visible in the :menuselection:`Data` menu, the corresponding lists and pivot + tables have been removed from the spreadsheet for better performance and a neater appearance. + +.. _build_and_customize_dashboards/customize/duplicate-dashboard: + +Duplicate a dashboard +~~~~~~~~~~~~~~~~~~~~~ + +To duplicate a dashboard: + +#. In the Dashboards app, go to :menuselection:`Configuration --> Dashboards`. +#. Open the relevant dashboard section, then, on the line of the dashboard you want to duplicate, + click :icon:`fa-pencil` :guilabel:`Edit`. +#. In the spreadsheet that opens, click :menuselection:`File -->` :icon:`os-copy-file` + :menuselection:`Make a copy`. +#. Rename the duplicated dashboard by clicking the name of the spreadsheet at the top left of the + screen and editing as needed. + +.. tip:: + - To return to the overview of the dashboard section, click the name of the original dashboard at + the top left of the page, then the name of the dashboard section. + - After duplicating a dashboard, delete the original dashboard by clicking the :icon:`fa-trash` + :guilabel:`(trash)` icon or rename it by clicking on the name then editing it. + +.. _dashboards/customize-dashboard/edit-spreadsheet: + +Add, edit, or remove dashboard elements +--------------------------------------- + +Dashboards can be customized in various ways, such as by: + +- adding new tables and charts based on previously inserted or :ref:`newly inserted Odoo data + `. This requires a similar approach + to :ref:`building a dashboard from scratch `; +- :doc:`adding new global filters <../../../applications/productivity/spreadsheet/global_filters>` + or editing or deleting existing ones; +- :ref:`adding or editing clickable links ` to Odoo menus, URLs, + or to other sheets within the same spreadsheet. + +.. tip:: + Dashboard elements that are no longer needed can be deleted from the spreadsheet. If, after + deleting a dashboard element, a :ref:`data source ` is no longer + being used in the spreadsheet, this is indicated by a :icon:`fa-exclamation-triangle` + :guilabel:`(warning)` icon in the :guilabel:`Data` menu. + + .. image:: build_and_customize_dashboards/list-deleted.png + :alt: Warning to indicate data source no longer used in spreadsheet + +.. _dashboards/customize-dashboard/edit-spreadsheet-new-odoo-data: + +Insert new Odoo data +-------------------- + +Inserting new Odoo data into a dashboard's underlying spreadsheet requires starting from the +relevant Odoo view. To do so: + +#. With the relevant list view, pivot view or graph view open in your database, proceed as follows: + + - For a list view, click the :icon:`fa-cog` :guilabel:`(Actions)` icon beside the name of the + view, then :guilabel:`Spreadsheet -->` :icon:`oi-view-list` :menuselection:`Insert list in + spreadsheet`. + - For a pivot or graph view, click :guilabel:`Insert in Spreadsheet` at the top left of the view. + +#. In the window that opens, edit the name if needed. For a list, edit the number of records, i.e., + rows to be inserted, if needed. +#. Click the :guilabel:`Dashboards` tab then select in which dashboard the list, pivot table, or + chart should be inserted. + +A list or pivot table is inserted into a new sheet in the dashboard's underlying spreadsheet; a +chart is inserted on the first sheet of the spreadsheet. + +.. seealso:: + :doc:`Inserting Odoo data into a spreadsheet + <../../../applications/productivity/spreadsheet/insert>` diff --git a/content/applications/productivity/dashboards/build_and_customize_dashboards/list-deleted.png b/content/applications/productivity/dashboards/build_and_customize_dashboards/list-deleted.png new file mode 100644 index 0000000000..95799cbf39 Binary files /dev/null and b/content/applications/productivity/dashboards/build_and_customize_dashboards/list-deleted.png differ diff --git a/content/applications/productivity/dashboards/my_dashboard.rst b/content/applications/productivity/dashboards/my_dashboard.rst new file mode 100644 index 0000000000..7c6d322ad1 --- /dev/null +++ b/content/applications/productivity/dashboards/my_dashboard.rst @@ -0,0 +1,70 @@ +============ +My Dashboard +============ + +**My Dashboard** allows you to centralize the :doc:`Odoo views <../../studio/views>` you consult +most regularly, making it possible to see critical tasks at a glance without having to first +navigate through multiple apps. Unlike other Odoo dashboards, My Dashboard is not based on **Odoo +Spreadsheet**. + +Views inserted in My Dashboard are fully dynamic and retain many features of the source view, e.g., +sorting of lists, changing the measures used for a pivot table or cohort view, changing the chart +type, or clicking on a value or data point to view the underlying record(s). + +.. tip:: + It is not possible to change the domain, i.e., the filtering or grouping, of a view that has been + added to My Dashboard. To change the domain, make the necessary changes in the original view, + then re-insert the view in My Dashboard and delete the originally inserted view. + +Add views +========= + +Most Odoo views can be added to My Dashboard, including: + +- :ref:`multiple record views ` like list, kanban, and map +- :ref:`timeline views ` like calendar, cohort, and gantt +- :ref:`reporting views ` like pivot and graph + +To add a view to My Dashboard: + +#. With the relevant view open in your database, click the :icon:`fa-cog` :guilabel:`(Actions)` icon + beside the name of the view, then :menuselection:`Dashboard`. +#. Under :guilabel:`Add to my Dashboard`, rename the view if desired, then click :guilabel:`Add`. + + .. image:: my_dashboard/add-view.png + :alt: Adding a view to My Dashboard + :scale: 80% + +#. Refresh the page. + +The added view is now visible as a widget in My Dashboard in the Dashboards app. + +.. tip:: + If added views are not showing in My Dashboard, refresh the browser page. + +Customize layout +================ + +When at least one view has been added to My Dashboard, the page can be customized as follows: + +- **Change the layout of the page**: Click :guilabel:`Change Layout` in the top-right corner and + select the desired layout. + + .. tip:: + For multi-column layouts, the column limits are identified by :icon:`fa-caret-left` + :guilabel:`(left caret)` and :icon:`fa-caret-right` :guilabel:`(right caret)` icons at the + bottom of the page. If needed, scroll to the bottom of the page to see the column limits. + + .. image:: my_dashboard/column-limits.png + :alt: Column limits visible at bottom of page + +- **Collapse and expand widgets**: By default, an inserted widget is shown fully expanded. To + collapse, or minimize, a widget, and show only the title, click the :icon:`fa-window-minimize` + :guilabel:`(minimize)` icon at the top right of the widget. To expand a widget, click the + :icon:`fa-window-maximize` :guilabel:`(maximize)` icon. +- **Move widgets**: Drag and drop widgets to the desired location in the same column or a different + column. +- **Remove widgets**: To remove a widget from the page, click the :icon:`fa-times` + :guilabel:`(remove)` icon. + + diff --git a/content/applications/productivity/dashboards/my_dashboard/add-view.png b/content/applications/productivity/dashboards/my_dashboard/add-view.png new file mode 100644 index 0000000000..f44e8dfe0b Binary files /dev/null and b/content/applications/productivity/dashboards/my_dashboard/add-view.png differ diff --git a/content/applications/productivity/dashboards/my_dashboard/column-limits.png b/content/applications/productivity/dashboards/my_dashboard/column-limits.png new file mode 100644 index 0000000000..620b22fa58 Binary files /dev/null and b/content/applications/productivity/dashboards/my_dashboard/column-limits.png differ diff --git a/content/applications/productivity/dashboards/sales-dashboard.png b/content/applications/productivity/dashboards/sales-dashboard.png new file mode 100644 index 0000000000..9577028611 Binary files /dev/null and b/content/applications/productivity/dashboards/sales-dashboard.png differ diff --git a/content/applications/productivity/discuss/chatter.rst b/content/applications/productivity/discuss/chatter.rst index 4aced6d115..72cf4e4cfe 100644 --- a/content/applications/productivity/discuss/chatter.rst +++ b/content/applications/productivity/discuss/chatter.rst @@ -4,6 +4,7 @@ Chatter .. |user| replace:: :icon:`fa-user-o` :guilabel:`(user)` icon .. |paperclip| replace:: :icon:`fa-paperclip` :guilabel:`(paperclip)` icon +.. |ve| replace:: :icon:`fa-ellipsis-v` :guilabel:`(vertical ellipsis)` The *Chatter* feature is integrated throughout Odoo to streamline communication, maintain traceability, and provide accountability among team members. Chatter windows, known as *composers*, @@ -16,8 +17,8 @@ Chatter thread ============== A *chatter thread* can be found on most pages in the database, and serves as a record of the updates -and edits made to a record. A note is logged in the chatter thread when a change is made. The note -includes details of the change, and a time stamp. +and edits made to a record. A note is logged in the chatter thread when a change is made to the +record. The note includes details of the change, and a time stamp. .. example:: A user, Mitchell Admin, needs to update the email address of a contact. After they save the @@ -29,7 +30,6 @@ includes details of the change, and a time stamp. - The updated email address. .. image:: chatter/chatter-thread-email-update.png - :align: center :alt: A close up of a chatter thread with an update to a contact record. If a record was created, or edited, via an imported file, or was otherwise updated through an @@ -37,7 +37,6 @@ intervention by the system, the chatter thread creates a log note, and credits t OdooBot. .. image:: chatter/odoo-bot-created.png - :align: center :alt: A close up of a chatter thread of an OdooBot created contact record. .. _discuss/add-followers: @@ -91,7 +90,6 @@ Tick the checkbox for any updates the follower should receive, and clear the che updates they should **not** receive. Click :guilabel:`Apply` when finished. .. figure:: chatter/chatter-edit-subscription.png - :align: center :alt: The Edit Subscription window on a Helpdesk ticket. The Edit Subscription options vary depending on the record type. These are the options for a @@ -151,7 +149,6 @@ recipients of the message. before the message is sent, or a note is logged. .. image:: chatter/send-message-followers.png - :align: center :alt: A chatter composer preparing to send a message to the followers of a CRM opportunity and the customer listed on the opportunity record. @@ -165,7 +162,6 @@ To open the full composer, click the :icon:`fa-expand` :guilabel:`(expand)` icon corner of the composer window. .. figure:: chatter/chatter-expand-icon.png - :align: center :alt: A chatter composer with emphasis on the expand icon. The expand icon in a chatter composer. @@ -174,8 +170,9 @@ Doing this opens a :guilabel:`Compose Email` pop-up window. Confirm or edit the :guilabel:`Recipients` of the message, or add additional recipients. The :guilabel:`Subject` field auto-populates based on the title of the record, though it can be edited, if desired. -To use an :doc:`email template <../../general/companies/email_template/>` for the message, select it -from the drop-down menu in the :guilabel:`Load template` field. +To use an :doc:`email template <../../general/companies/email_template/>` for the message, click the +|ve| icon, then select a template from the list. Existing templates can also be overwritten or +deleted from this menu. .. note:: The number and type of templates available vary, based on the record the message is created from. @@ -184,9 +181,29 @@ Click :icon:`fa-paperclip` :guilabel:`(paperclip)` icon to add any files to the :guilabel:`Send`. .. image:: chatter/chatter-full-composer.png - :align: center :alt: The expanded full chatter composer in the CRM application. +Generate text with AI +~~~~~~~~~~~~~~~~~~~~~ + +To generate message text using AI, click the AI icon from the expanded chatter composer. This opens +a :guilabel:`Generate Text with AI` pop-up. + +Enter a prompt in the :guilabel:`Send a message` field to instruct the AI on the type of content +needed, then press enter, or click the :icon:`fa-paper-plane` :guilabel:`(paper plane)` icon. + +.. image:: chatter/chatter-generate-text-with-ai.png + :alt: The generate text with AI popup. + +After the text is generated, click :guilabel:`Insert` to insert the text into the message composer. + +.. tip:: + Before sending the final message, be sure to edit any commentary from the AI, or any text in + brackets. + + .. image:: chatter/chatter-ai-draft-email.png + :alt: A draft of an email with text generated by AI. + Edit sent messages ------------------ @@ -197,11 +214,10 @@ information. When messages are edited after they have been sent, an updated message is **not** sent to the recipient. -To edit a sent message, click the :icon:`fa-ellipsis-h` :guilabel:`(ellipsis)` icon menu to the -right of the message. Then, select :guilabel:`Edit`. Make any necessary adjustments to the message. +To edit a sent message, click the |ve| menu to the right of the message. Then, select +:guilabel:`Edit`. Make any necessary adjustments to the message. .. image:: chatter/chatter-edit.png - :align: center :alt: The edit message option in a chatter thread. To save the changes, press :command:`Ctrl + Enter`. To discard the changes, press :command:`Escape`. @@ -234,7 +250,6 @@ corner of the result to reveal a :guilabel:`Jump` button. Click this button to b message's location in the thread. .. figure:: chatter/chatter-search.png - :align: center :alt: Search results in a chatter thread emphasising the search icon and the jump button. Search results in a chatter thread. Hover over the upper-right corner of a result to see the @@ -274,11 +289,12 @@ Add any additional information in the optional :guilabel:`Log a note...` field. Lastly, click one of the following buttons: - :guilabel:`Schedule`: adds the activity to the chatter under :guilabel:`Planned activities`. -- :guilabel:`Mark as Done`: adds the details of the activity to the chatter under :guilabel:`Today`. - The activity is not scheduled, it is automatically marked as completed. -- :guilabel:`Done \& Schedule Next`: adds the task under :guilabel:`Today` marked as done, and - opens a new activity window. -- :guilabel:`Discard`: discards any changes made on the pop-up window. +- :guilabel:`Schedule & Mark as Done`: adds the details of the activity to the chatter under + :guilabel:`Today`. The activity is added to :guilabel:`Today`, and is automatically marked as + done. +- :guilabel:`Done \& Schedule Next`: adds the task under :guilabel:`Today` marked as done, and opens + a new activity window. +- :guilabel:`Cancel`: discards any changes made on the pop-up window. Scheduled activities are added to the chatter for the record under :guilabel:`Planned activities`, and are color-coded based on their due date. @@ -288,7 +304,6 @@ and are color-coded based on their due date. - **Green** icons indicate an activity with a due date scheduled in the future. .. image:: chatter/chatter-activity-icons.png - :align: center :alt: A chatter thread with planned activities with varying due dates. .. tip:: @@ -296,7 +311,6 @@ and are color-coded based on their due date. additional details. .. image:: chatter/planned-activity-details.png - :align: center :alt: A detailed view of a planned activity. After completing an activity, click :guilabel:`Mark Done` under the activity entry in the chatter. @@ -308,7 +322,6 @@ After the activity is marked complete, an entry with the activity type, title, a that were included in the pop-up window are listed in the chatter. .. image:: chatter/chatter-completed-activity.png - :align: center :alt: A chatter thread with a completed activity, included additional details. .. _discuss/attach-files: @@ -345,7 +358,6 @@ heading. :guilabel:`Files` section from visible to invisible in the chatter thread. .. image:: chatter/chatter-attach-files.png - :align: center :alt: A chatter thread with a file attached and the Attach files button added. .. _discuss/integrations: @@ -385,7 +397,6 @@ pop-up window. ` for more information. .. image:: chatter/whats-app-message.png - :align: center :alt: A send WhatsApp message pop-up window. Google Translate @@ -404,13 +415,11 @@ changes. Translate a chatter message ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -To translate a user's text from another language, click the :icon:`fa-ellipsis-h` -:guilabel:`(ellipsis)` menu to the right of the chatter. Then, select :guilabel:`Translate`. The -content translates to the language set in the :doc:`user's preferences -<../../general/users/language/>`. +To translate a user's text from another language, click the |ve| menu to the right of the chatter. +Then, select :guilabel:`Translate`. The content translates to the language set in the :doc:`user's +preferences <../../general/users/language/>`. .. image:: chatter/chatter-translate-message.png - :align: center :alt: alt text .. important:: diff --git a/content/applications/productivity/discuss/chatter/chatter-ai-draft-email.png b/content/applications/productivity/discuss/chatter/chatter-ai-draft-email.png new file mode 100644 index 0000000000..62f3b69f0a Binary files /dev/null and b/content/applications/productivity/discuss/chatter/chatter-ai-draft-email.png differ diff --git a/content/applications/productivity/discuss/chatter/chatter-attach-files.png b/content/applications/productivity/discuss/chatter/chatter-attach-files.png index c6fd201a32..1ec81f8831 100644 Binary files a/content/applications/productivity/discuss/chatter/chatter-attach-files.png and b/content/applications/productivity/discuss/chatter/chatter-attach-files.png differ diff --git a/content/applications/productivity/discuss/chatter/chatter-edit.png b/content/applications/productivity/discuss/chatter/chatter-edit.png index 3e82745c22..f00c74f9c8 100644 Binary files a/content/applications/productivity/discuss/chatter/chatter-edit.png and b/content/applications/productivity/discuss/chatter/chatter-edit.png differ diff --git a/content/applications/productivity/discuss/chatter/chatter-expand-icon.png b/content/applications/productivity/discuss/chatter/chatter-expand-icon.png index 5f35e478ef..3c382b0d63 100644 Binary files a/content/applications/productivity/discuss/chatter/chatter-expand-icon.png and b/content/applications/productivity/discuss/chatter/chatter-expand-icon.png differ diff --git a/content/applications/productivity/discuss/chatter/chatter-full-composer.png b/content/applications/productivity/discuss/chatter/chatter-full-composer.png index 7ac0c604f6..7d723bcd03 100644 Binary files a/content/applications/productivity/discuss/chatter/chatter-full-composer.png and b/content/applications/productivity/discuss/chatter/chatter-full-composer.png differ diff --git a/content/applications/productivity/discuss/chatter/chatter-generate-text-with-ai.png b/content/applications/productivity/discuss/chatter/chatter-generate-text-with-ai.png new file mode 100644 index 0000000000..ef3da12331 Binary files /dev/null and b/content/applications/productivity/discuss/chatter/chatter-generate-text-with-ai.png differ diff --git a/content/applications/productivity/discuss/chatter/chatter-search.png b/content/applications/productivity/discuss/chatter/chatter-search.png index a8cf0657cc..9e3479d853 100644 Binary files a/content/applications/productivity/discuss/chatter/chatter-search.png and b/content/applications/productivity/discuss/chatter/chatter-search.png differ diff --git a/content/applications/productivity/discuss/chatter/chatter-translate-message.png b/content/applications/productivity/discuss/chatter/chatter-translate-message.png index 211a762a6f..d999b27eb3 100644 Binary files a/content/applications/productivity/discuss/chatter/chatter-translate-message.png and b/content/applications/productivity/discuss/chatter/chatter-translate-message.png differ diff --git a/content/applications/productivity/discuss/chatter/planned-activity-details.png b/content/applications/productivity/discuss/chatter/planned-activity-details.png index 1f8d0def54..143ba392eb 100644 Binary files a/content/applications/productivity/discuss/chatter/planned-activity-details.png and b/content/applications/productivity/discuss/chatter/planned-activity-details.png differ diff --git a/content/applications/productivity/discuss/chatter/send-message-followers.png b/content/applications/productivity/discuss/chatter/send-message-followers.png index ae85aff71b..55972a351b 100644 Binary files a/content/applications/productivity/discuss/chatter/send-message-followers.png and b/content/applications/productivity/discuss/chatter/send-message-followers.png differ diff --git a/content/applications/productivity/discuss/team_communication.rst b/content/applications/productivity/discuss/team_communication.rst index 140cc99b16..c992cdc2c5 100644 --- a/content/applications/productivity/discuss/team_communication.rst +++ b/content/applications/productivity/discuss/team_communication.rst @@ -2,112 +2,98 @@ Use channels for team communication =================================== -Use channels in the Odoo *Discuss* app to organize discussions between individual teams, +Use channels in the Odoo **Discuss** app to organize discussions between individual teams, departments, projects, or any other group that requires regular communication. With channels, employees can communicate inside dedicated spaces within the Odoo database around specific topics, updates, and latest developments having to do with the organization. -Public and private channels -=========================== +Create a new channel +==================== -A *Public* channel can be seen by everyone, while a *Private* one is only visible to users invited -to it. To create a new channel, navigate to the :menuselection:`Discuss` app, and then click on the -:guilabel:`➕ (plus)` icon next to the :guilabel:`Channels` heading in the left-side menu. After -typing the name of the channel, two selectable options will appear: The first is a channel with a -hashtag (`#`) to indicate that it is a public channel; the second option is a channel with a lock -icon (`🔒`) next to it, to indicate that it is a private channel. Select the channel type that best -fits the communication needs. +To create a new channel, navigate to the :menuselection:`Discuss` app, and then click on the +:icon:`fa-plus` :guilabel:`(plus)` icon next to the :guilabel:`Channels` heading in the left-side +menu. -.. image:: team_communication/public-private-channel.png - :align: center +.. image:: team_communication/create-new-channel.png :alt: View of discuss's sidebar and a channel being created in Odoo Discuss. -.. tip:: - A public channel is best used when many employees need to access information (such as company - announcements), whereas a private channel could be used whenever information should be limited - to specific groups (such as a specific department). +The channel's :guilabel:`Group Name`, :guilabel:`Description`, and :guilabel:`Privacy` settings can +be modified by clicking on the channel's settings, represented by a :icon:`fa-cog` +:guilabel:`(gear)` icon in the left sidebar menu, next to the channel's name. -Configuration options ---------------------- +Privacy tab +----------- -The channel's :guilabel:`Group Name`, :guilabel:`Description`, and :guilabel:`Privacy` settings can -be modified by clicking on the channel's settings, represented by a :guilabel:`⚙️ (gear)` icon in -the left sidebar menu, next to the channel's name. +To control which users can join a channel, open the channel's setting page and navigate to the +:guilabel:`Privacy` tab. .. image:: team_communication/channel-settings.png - :align: center :alt: View of a channel's settings form in Odoo Discuss. -Privacy and Members tabs -~~~~~~~~~~~~~~~~~~~~~~~~ +To limit access of the channel to a specific group, select an option from the :guilabel:`Authorized +Group` drop-down menu. -Changing :guilabel:`Who can follow the group's activities?` controls which groups can have access to -the channel. +To automatically add members of a group as followers of the channel, click the :guilabel:`Auto +Subscribe Groups` field, and select one or more groups from the list. .. note:: - Allowing :guilabel:`Everyone` to follow a private channel lets other users view and join it, as - they would a public one. - -When choosing :guilabel:`Invited people only`, specify in the :guilabel:`Members` tab which members -should be invited. Inviting members can also be done from the *Discuss* app's main dashboard, by -selecting the channel, clicking the *add user* icon in the top-right corner of the dashboard, and -finally clicking :guilabel:`Invite to Channel` once all the users have been added. - -.. image:: team_communication/invite-channel.png - :align: center - :alt: View of Discuss' option to invite members in Odoo Discuss. - -When the :guilabel:`Selected group of users` option is selected, it reveals the ability to add an -:guilabel:`Authorized Group`, along with the options to :guilabel:`Auto Subscribe Groups` and -:guilabel:`Auto Subscribe Departments`. + Users who are automatically added as followers can manually edit their subscription to the + channel, if necessary. The option to :guilabel:`Auto Subscribe Groups` automatically adds users of that particular user group as followers. In other words, while :guilabel:`Authorized Groups` limits which users can access the channel, :guilabel:`Auto Subscribe Groups` automatically adds users as members as long as they are part of a specific user group. The same is true for :guilabel:`Auto Subscribe Departments`. +Invite members to a channel +--------------------------- + +To invite members to a channel, click on the :guilabel:`Members` tab. Click :guilabel:`Add a line`, +then select either a :guilabel:`Partner` or :guilabel:`Guest` from the drop-down menu. + +Inviting members can also be done from the **Discuss** app's main dashboard, by selecting the +channel, clicking the :icon:`fa-user-plus` :guilabel:`(add user)` icon in the top-right corner of +the dashboard, and finally clicking :guilabel:`Invite to Channel` once all the users have been +added. + +.. image:: team_communication/invite-channel.png + :alt: View of Discuss' option to invite members in Odoo Discuss. + Quick search bar ================ -Once at least 20 channels, direct messages, or live chat conversations (if *Live Chat* module is -installed on the database) are pinned in the sidebar, a :guilabel:`Quick search…` bar is displayed. -This feature is a convenient way to filter conversations and quickly find relevant communications. +Once at least 20 channels, direct messages, or live chat conversations are pinned in the sidebar, a +:guilabel:`Quick search…` bar is displayed. This feature is a convenient way to filter conversations +and find relevant communications. .. image:: team_communication/quick-search.png - :align: center :alt: View of the Discuss' sidebar emphasizing the quick search bar in Odoo Discuss. Finding channels ---------------- -Click on the settings :guilabel:`⚙️ (gear)` icon, located in the left sidebar, to the right of the -:guilabel:`CHANNELS` collapsible menu item. Doing so will lead to a mosaic view containing all the -public channels available. Users can join or leave channels on this screen by clicking the -:guilabel:`JOIN` or :guilabel:`LEAVE` buttons that appear in the channel boxes. +To view all available channels, click on the :icon:`fa-cog` :guilabel:`(gear)` icon to the right of +the :guilabel:`CHANNELS` menu. Users can join or leave channels on this screen by clicking the +:guilabel:`Join` or :guilabel:`Leave` buttons that appear in the channel boxes. There is also the ability to apply filtering criteria and save them for later use. The :guilabel:`Search...` function accepts wildcards by using the underscore character [ `_` ], and specific searches can be saved by using the :menuselection:`Favorites --> Save Current Search` drop-down menu. -.. image:: team_communication/filter.png - :align: center - :alt: View of a channel being searched through filters in Odoo Discuss - Linking channel in chatter ========================== -Channels can be linked in the chatter (log note) of a record in Odoo. To do so, simply type: `#` and -the channel name. Click or press enter on the *channel* name. Upon logging the note a link to the -channel will appear. After clicking on the link a chat window with the channel conversation will -pop up in the lower right corner of the screen. +Channels can be linked in the *chatter* of a record to share relvant discussions. To do so, type: +`#` and the channel name. Click or press enter on the *Channel* name. Upon logging the note a link +to the channel appears. After clicking on the link a chat window with the channel conversation pops +up in the lower right corner of the screen. -Users are able to contribute to this group channel (either public or member based) by typing -messages in window and pressing *enter*. +Users are able to contribute to this group channel by typing messages in window and pressing +*enter*. .. image:: team_communication/chatter-channel.png - :align: center - :alt: Channel linked in chatter with the channel open on the lower right quadrant. + :alt: Channel linked in chatter. .. seealso:: - :doc:`../discuss` diff --git a/content/applications/productivity/discuss/team_communication/channel-settings.png b/content/applications/productivity/discuss/team_communication/channel-settings.png index 4be7b73da0..a49541bede 100644 Binary files a/content/applications/productivity/discuss/team_communication/channel-settings.png and b/content/applications/productivity/discuss/team_communication/channel-settings.png differ diff --git a/content/applications/productivity/discuss/team_communication/chatter-channel.png b/content/applications/productivity/discuss/team_communication/chatter-channel.png index 57263927a1..fa4b26b4a8 100644 Binary files a/content/applications/productivity/discuss/team_communication/chatter-channel.png and b/content/applications/productivity/discuss/team_communication/chatter-channel.png differ diff --git a/content/applications/productivity/discuss/team_communication/create-new-channel.png b/content/applications/productivity/discuss/team_communication/create-new-channel.png new file mode 100644 index 0000000000..6b4015e8dc Binary files /dev/null and b/content/applications/productivity/discuss/team_communication/create-new-channel.png differ diff --git a/content/applications/productivity/discuss/team_communication/filter.png b/content/applications/productivity/discuss/team_communication/filter.png deleted file mode 100644 index 0eb4e83557..0000000000 Binary files a/content/applications/productivity/discuss/team_communication/filter.png and /dev/null differ diff --git a/content/applications/productivity/discuss/team_communication/invite-channel.png b/content/applications/productivity/discuss/team_communication/invite-channel.png index f564aead87..34620ead86 100644 Binary files a/content/applications/productivity/discuss/team_communication/invite-channel.png and b/content/applications/productivity/discuss/team_communication/invite-channel.png differ diff --git a/content/applications/productivity/discuss/team_communication/public-private-channel.png b/content/applications/productivity/discuss/team_communication/public-private-channel.png deleted file mode 100644 index 28d528ec72..0000000000 Binary files a/content/applications/productivity/discuss/team_communication/public-private-channel.png and /dev/null differ diff --git a/content/applications/productivity/discuss/team_communication/quick-search.png b/content/applications/productivity/discuss/team_communication/quick-search.png index a77ed9938d..59a68f77a3 100644 Binary files a/content/applications/productivity/discuss/team_communication/quick-search.png and b/content/applications/productivity/discuss/team_communication/quick-search.png differ diff --git a/content/applications/productivity/documents.rst b/content/applications/productivity/documents.rst index 088329c06f..8d8867ee96 100644 --- a/content/applications/productivity/documents.rst +++ b/content/applications/productivity/documents.rst @@ -380,6 +380,8 @@ file should be :guilabel:`Discoverable` (accessible through browsing) or require permission to view or edit through the customer portal by clicking the :guilabel:`Documents` card. +.. _documents/file-digitization: + File digitization with AI ========================= diff --git a/content/applications/productivity/knowledge.rst b/content/applications/productivity/knowledge.rst index b612c5a3d1..1a81a73b19 100644 --- a/content/applications/productivity/knowledge.rst +++ b/content/applications/productivity/knowledge.rst @@ -1,24 +1,436 @@ -:show-content: -:hide-page-toc: -:show-toc: - ========= Knowledge ========= **Odoo Knowledge** is a multipurpose productivity app that allows internal users to enrich their -business knowledge base and provide individually or collaboratively gathered information. +business knowledge base by providing information gathered individually or collaboratively. The pages on which they gather content are called *articles*. They are mainly composed of a title -and a body. The latter is an HTML field containing text, images, links to other articles, records -from other models, templates, etc. +and a body. The latter is an HTML field containing text, images, links, records from other models, +templates, etc. .. seealso:: - - `Knowledge product page `_ + `Knowledge product page `_ + +.. _knowledge/articles_editing/create-article: + +Article creation +================ + +Knowledge articles can be created from scratch or a pre-configured template. When an article +is created under another, the original one is the **parent article**, while the new one is called a +**child** or **nested article**, indicating its subordinate position. This structure helps organize +content by establishing clear relationships between related articles. + +To create a nested article, hover over an article in the sidebar tree and click the :icon:`fa-plus` +:guilabel:`(plus)` icon. + +From scratch +------------ + +To create an article from scratch, click :guilabel:`New` in the top right corner or hover over the +:guilabel:`Private` or :guilabel:`Workspace` category in the sidebar tree, then click the +:icon:`fa-plus` :guilabel:`(plus)` icon. Start typing text or select one of the suggested options: + +- :guilabel:`Load a Template`: Select a preconfigured template and click :guilabel:`Load Template`. +- :guilabel:`Build an Item Kanban`: Create items to visualize and manage them in a Kanban view. +- :guilabel:`Build an Item List`: Create a structured list of items to centralize them in a single + article. +- :guilabel:`Build an Item Calendar`: Create a calendar view to manage and track items by date. +- :guilabel:`Generate an Article with AI`: Generate content based on a prompt. + +.. tip:: + After writing the header, click or hover over :guilabel:`Untitled` in the top bar to + automatically name the article after the header. This action does not apply if the article is + already titled. + +From a template +--------------- + +To create an article from a template, follow these steps: + + #. Click :icon:`fa-paint-brush` :guilabel:`Browse Templates` at the bottom of the sidebar tree. + #. Select a preferred template. + #. Click :guilabel:`Load Template`. + +.. _knowledge/articles_editing/edit-article: + +Article editing +=============== + +To edit an article, select it in the sidebar tree, then edit its content and format it using the +:ref:`text editor toolbar `, typing :ref:`powerbox +commands `, and adding a :ref:`cover picture +` with a :ref:`title emoji `. + +.. _knowledge/articles_editing/text-editor: + +Text editor toolbar +------------------- + +To edit a word, sentence, or paragraph, select or double-click it to display the text editor +toolbar and apply the desired :doc:`formatting options `. + +.. tip:: + Click :icon:`fa-commenting` :guilabel:`Comment` to add a comment to the selected text. + +.. _knowledge/articles_editing/commands: + +Commands +-------- + +Type `/` to open the :ref:`powerbox ` and use a command. The +following commands are exclusive to the Knowledge app: + +.. tabs:: + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + :stub-columns: 1 + + * - Command + - Use + * - :guilabel:`Index` + - Show :ref:`nested articles `: Display the + child pages of the parent article. + * - :guilabel:`Item Kanban` + - Insert a Kanban view and create :ref:`article items + `. + * - :guilabel:`Item Cards` + - Insert a Card view and create :ref:`article items `. + * - :guilabel:`Item List` + - Insert a List view and create :ref:`article items `. + * - :guilabel:`Item Calendar` + - Insert a Calendar view and create :ref:`article items + `. + +.. _knowledge/articles_editing/items: + +Article items +~~~~~~~~~~~~~ + +Article items are active building blocks within an article, allowing the addition, management, and +viewing of various organized content and data. + +Article items within a parent article can contain :ref:`properties +`, which are shared data fields from the parent, ensuring +consistent information across related items and articles. + +.. _knowledge/articles_editing/cover: + +Cover pictures +-------------- + +To add a cover picture, click the :icon:`fa-ellipsis-v` :guilabel:`(ellipsis)` icon, then +:guilabel:`Add Cover`. The following options enable selecting and inserting pictures from different +sources: + +- Search the :doc:`Unsplash ` database to find a + suitable picture. If the database and **Unsplash** account are associated, the cover + picture is automatically selected based on the article's name. +- :guilabel:`Add URL`: Copy-paste the **image address**. +- :guilabel:`Upload an image`: Upload the file into the image library. + +To manage the cover picture, hover the mouse over it and select the preferred option: + +- :guilabel:`Replace Cover` and search from the database or library, or add a different URL. + +- :guilabel:`Reposition` and adjust the picture before clicking :guilabel:`Save Position`. + +- :guilabel:`Remove Cover`. + +.. _knowledge/articles_editing/emoji: + +Title emoji +----------- + +To add a title emoji to the article's name and header: + +- Click the :icon:`fa-ellipsis-v` :guilabel:`(ellipsis)` icon, then :guilabel:`Add Icon` to + generate a random emoji. Click the emoji to select a different one. + +- Alternatively, click the :icon:`fa-file-text-o` :guilabel:`(page)` icon next to the article's + name in the sidebar or the top bar and select the preferred emoji. + +.. _knowledge/articles_editing/views: + +Views and links from other apps +------------------------------- + +To insert a view or a view link into an article, follow these steps: + + #. Go to the desired app and select the preferred view. + #. Click the :icon:`fa-cog` :guilabel:`(cog)` icon, then select :menuselection:`Knowledge --> + Insert view in article` or :guilabel:`Insert link in article`. + #. Choose the article to insert the view or link to. + +.. note:: + Once the view or link is inserted: + + - Users without access to the view cannot see it in Knowledge, even if they can access the + article. + - Clicking the inserted link opens a pop-up with the view's name next to the + :icon:`fa-clipboard` (:guilabel:`copy`), :icon:`fa-pencil-square-o` (:guilabel:`edit`), and + :icon:`fa-chain-broken` (:guilabel:`remove`) icons. Click the name inside the pop-up to open + the linked view. + +Article management +================== + +Knowledge allows for managing articles, which consists of :ref:`structuring +`, :ref:`sharing `, +:ref:`removing `, and :ref:`retrieving +` them. + +Basic management +---------------- + +Click the :icon:`fa-ellipsis-v` (:guilabel:`ellipsis`) icon and select one of the following actions +for basic article management: + +- :guilabel:`Move To`: Select the article to move under a category or another article, then click + :guilabel:`Move Article`. +- :guilabel:`Lock Content`: Lock the article to stop edits. Click :guilabel:`Unlock` to edit again. +- :guilabel:`Create a Copy`: Copy the article under the :guilabel:`Private` section. +- :guilabel:`Export`: Open the browser's print function. +- :guilabel:`Add to Templates`: Add the article to the list of templates. +- :guilabel:`Send to Trash`: Move the article to the trash. + +.. note:: + The following actions only apply to :ref:`nested articles + ` and :ref:`article items + `: + + - :guilabel:`Convert into Article Item`: Convert the nested article into an :ref:`article item + `. + - :guilabel:`Convert into Article`: Convert the article item into a :ref:`nested article + `. + +.. tip:: + - Move an article directly from the sidebar tree by dragging and dropping it under another + article or category. + - Press `CTRL` / `CMD` + `K` to open the command palette, then type `?` to search for visible + articles or `$` for :ref:`hidden articles `. + Alternatively, hover over the :guilabel:`Workspace` category and click the :icon:`fa-eye` + (:guilabel:`eye`) icon to find hidden articles. + +.. _knowledge/articles_editing/structure: + +Structuring +----------- + +Sidebar structure +~~~~~~~~~~~~~~~~~ + +The sidebar structure follows a hierarchy with parent and nested articles organized within the +following categories: + +- The :guilabel:`Favorites` category displays all articles marked as favorites. +- The :guilabel:`Workspace` category displays articles accessible to all internal users. +- The :guilabel:`Shared` category displays articles shared with specific users. +- The :guilabel:`Private` category displays personal articles. + +.. note:: + - To mark an article as a favorite and display the :guilabel:`Favorites` category, click the + :icon:`fa-star-o` (:guilabel:`star`) icon in the top-right menu. + +Article structure +~~~~~~~~~~~~~~~~~ + +Nested articles inherit their parent's :ref:`access rights `, and +:ref:`properties ` are applied to a group of nested articles +under the same parent. + +.. _knowledge/articles_editing/share: + +Sharing +------- + +Sharing an article involves configuring :ref:`access rights `, +inviting :ref:`users `, providing :ref:`online access +`, and determining its visibility in the :ref:`sidebar tree +`. + +Articles listed under a category in the sidebar tree are **visible**. Articles that certain users +must search for through the command palette due to restricted access rights are **hidden**. + +.. _knowledge/articles_editing/rights: + +Configure access rights +~~~~~~~~~~~~~~~~~~~~~~~ + +Click :guilabel:`Share` in the top-right menu to configure access rights. + +Default access rights +********************* + +.. tabs:: + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + :stub-columns: 1 + + * - Setting + - Use + * - :guilabel:`Can edit` + - Allow all internal users to edit the article. + * - :guilabel:`Can read` + - Allow all internal users to read the article only. + * - :guilabel:`No access` + - Prevent all users from accessing the article in the sidebar tree or searching in the + command palette. + +.. _knowledge/articles_editing/visibility: + +Visibility +********** + +.. tabs:: + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + :stub-columns: 1 + + * - Setting + - Use + * - :guilabel:`Everyone` + - The article is visible in the sidebar tree to all internal users. + * - :guilabel:`Members` + - The article is only visible in the sidebar tree to :ref:`invited users + `, while other users can find it using the hidden + article search by pressing `CTRL` / `CMD` + `K` and typing `$`. + +.. note:: + - The :guilabel:`Default Access Rights` apply to all internal users except invited users; + specific access rights override default access rights. + - Selecting `Can edit` or `Can read` in the :guilabel:`Default Access Rights` moves the article + to the :guilabel:`Workspace` category while selecting `No access` moves it to the + :guilabel:`Private` category if it is not shared with an invited user. + - The :guilabel:`Visibility` setting only applies to :guilabel:`Workspace` articles. + +.. _knowledge/articles_editing/invite: + +Invite specific users +~~~~~~~~~~~~~~~~~~~~~ + +To grant specific internal or portal users access to a private article or to share a +:guilabel:`Workspace` article with a portal user, follow these steps: + +#. Click :guilabel:`Share` in the top-right menu. +#. Click :guilabel:`Invite`. +#. Select the preferred :guilabel:`Permission` and add users in the :guilabel:`Recipients` field. +#. Click :guilabel:`Invite`. + +.. _knowledge/articles_editing/share-online: + +Generate article URL +~~~~~~~~~~~~~~~~~~~~ + +Click :guilabel:`Share` and activate the :guilabel:`Share to web` toggle to generate a URL. Click +the :icon:`fa-clone` (:guilabel:`copy`) icon to copy the article's URL. + +.. note:: + - If an article contains :ref:`inserted views `, users with + the URL do not see them unless they can access the inserted content. + - Having the Website app is necessary to share an article's URL. + +.. _knowledge/articles_editing/remove: + +Removal +------- + +Removing an article involves deleting or archiving it. + +Delete an article +~~~~~~~~~~~~~~~~~ + +Select an article in the sidebar tree and click the :icon:`fa-ellipsis-v` (:guilabel:`ellipsis`) +icon, then :guilabel:`Send to Trash`. The article is moved to the trash for 30 days before being +permanently deleted. + +To permanently delete an article, click :guilabel:`Search` in the top-left menu, select an article, +and click :menuselection:`Actions --> Delete --> Delete`. + +.. note:: + To restore a trashed article, click :guilabel:`Open the Trash` at the bottom of the sidebar + tree, select an article, and click :guilabel:`Restore`. Alternatively, click :guilabel:`Search` + in the top-left menu. In the search bar, click :menuselection:`Filters --> Trashed`. Click the + article, then :guilabel:`Restore`. + +Archive an article +~~~~~~~~~~~~~~~~~~ + +Click :guilabel:`Search`, select an article, and click :menuselection:`Actions --> Archive --> +Archive`. + +.. note:: + To restore an archived article, click :guilabel:`Search`. In the search bar, click + :menuselection:`Filters --> Archived`. Select the article and go to :menuselection:`Actions --> + Unarchive`. + +.. _knowledge/articles_editing/retrieve: + +Retrieval +--------- + +Retrieving Knowledge articles consists of accessing them from various Odoo apps or restoring +previous versions. + +Access articles from various apps +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Knowledge articles are accessible from the :ref:`form view ` of various +apps. Click the :icon:`fa-bookmark` :guilabel:`(Knowledge)` icon in the top right corner to open +the command palette, then choose one of the following search methods: + +- :guilabel:`Search for an article`: start typing the text to execute a semantic search that + identifies relevant article information. +- :guilabel:`Advanced Search`: after typing the text in the search bar, click :guilabel:`Advanced + Search` to perform a parametric search with options to filter, group, or save articles. + +Version history +~~~~~~~~~~~~~~~ + +To retrieve a previous version of an article, select it in the sidebar tree and click the +:icon:`fa-history` (:guilabel:`history`) icon in the top-right menu to open the version history. +Select a version and click :guilabel:`Restore history`. + +.. note:: + In the version history, the :guilabel:`Content` tab shows the selected version, while the + :guilabel:`Comparison` tab displays the differences between the article's previous and current + versions. + +.. _knowledge/articles_editing/properties: + +Properties +========== + +Properties are custom fields for storing and managing information that users with `Can edit` +:ref:`access rights ` can add to :ref:`nested articles +` or :ref:`article items +`. + +To add a property, click the :icon:`fa-ellipsis-v` (:guilabel:`ellipsis`) icon, then +:menuselection:`Add Properties --> Add a Property`, enter a :guilabel:`Label`, and select a +:guilabel:`Field Type`. + +To learn more about properties and field types, go to :doc:`Property fields +`. -.. toctree:: - :titlesonly: +.. note:: + - Click outside the property field window to save a property. + - To remove a property, hover over its name, click the :icon:`fa-pencil` (:guilabel:`pencil`) + icon, then click :menuselection:`Delete --> Delete`. Deleting a property is permanent, and + deleting all properties removes the property sidebar panel. - knowledge/articles_editing - knowledge/management - knowledge/properties +.. tip:: + - Hover over the property name and click the :icon:`fa-pencil` (:guilabel:`pencil`) icon to edit + it or the :icon:`oi-draggable` (:guilabel:`drag handle`) icon to move it above or below another + property. + - Tick :guilabel:`Display in Cards` to show the properties in an :ref:`article item's view + ` that is visible from a parent article. + - Click the :icon:`fa-cogs` (:guilabel:`cogs`) icon to hide the property sidebar panel. Exiting + and returning to the article causes the panel to reappear. diff --git a/content/applications/productivity/knowledge/articles_editing.rst b/content/applications/productivity/knowledge/articles_editing.rst deleted file mode 100644 index 5814964947..0000000000 --- a/content/applications/productivity/knowledge/articles_editing.rst +++ /dev/null @@ -1,143 +0,0 @@ -============================ -Article creation and editing -============================ - -.. _knowledge/articles_editing/create-article: - -Article creation -================ - -Knowledge articles can be created from scratch or from a preconfigured template. - -From scratch ------------- - -To create an article from scratch, click :guilabel:`New` in the top right corner or hover over the -:guilabel:`Private` or :guilabel:`Workspace` category in the sidebar tree, then click the -:icon:`fa-plus` :guilabel:`(plus)` icon. Start typing text or select one of the suggested options: - -- :guilabel:`Load a Template`: Select a preconfigured template and click :guilabel:`Load Template`. -- :guilabel:`Build an Item Kanban`: Create items to visualize and manage them in a Kanban view. -- :guilabel:`Build an Item List`: Create a structured list of items to centralize them in a single - article. -- :guilabel:`Build an Item Calendar`: Create a calendar view to manage and track items by date. -- :guilabel:`Generate an Article with AI`: Generate content based on a prompt. - -.. tip:: - After writing the header, click or hover over :guilabel:`Untitled` in the top bar to - automatically name the article after the header. This does not apply if the article is already - titled. - -From a template ---------------- - -To create an article from a template, follow these steps: - - #. Click :icon:`fa-paint-brush` :guilabel:`Browse Templates` at the bottom of the sidebar tree. - #. Select a preferred template. - #. Click :guilabel:`Load Template`. - -Article editing -=============== - -To edit an article, select it in the sidebar tree, then edit its content and format it using the -:ref:`text editor toolbar `, by typing :ref:`powerbox -commands `, and adding a :ref:`cover picture -` with a :ref:`title emoji `. - -.. _knowledge/articles_editing/text-editor: - -Text editor toolbar -------------------- - -To edit a word, sentence, or paragraph, select or double-click it to display the text editor -toolbar and apply the desired :doc:`formatting options `. - -.. tip:: - Click :icon:`fa-commenting` :guilabel:`Comment` to add a comment to the selected text. - -.. _knowledge/articles_editing/commands: - -Commands --------- - -Type `/` to open the :ref:`powerbox ` and use a command. The -following commands are exclusive to the Knowledge app: - -.. tabs:: - - .. list-table:: - :widths: 20 80 - :header-rows: 1 - :stub-columns: 1 - - * - Command - - Use - * - :guilabel:`Index` - - Show nested articles: Display the child pages of the parent article. - * - :guilabel:`Item Kanban` - - Insert a Kanban view and create items. - * - :guilabel:`Item Cards` - - Insert a Card view and create items. - * - :guilabel:`Item List` - - Insert a List view and create items. - * - :guilabel:`Item Calendar` - - Insert a Calendar view and create items. - -.. _knowledge/articles_editing/cover: - -Cover pictures --------------- - -To add a cover picture, click the :icon:`fa-ellipsis-v` :guilabel:`(ellipsis)` icon, then -:guilabel:`Add Cover`. The following options enable selecting and inserting pictures from different -sources: - -- Search the :doc:`Unsplash ` database to find a - suitable picture. If your database and your **Unsplash** account are associated, the cover - picture is automatically selected based on the article's name. -- :guilabel:`Add URL`: Copy-paste the **image address**. -- :guilabel:`Upload an image`: Upload the file into the image library. - -To manage the cover picture, hover the mouse over it and select the preferred option: - -- :guilabel:`Replace Cover` and search from the database or library, or add a different URL. - -- :guilabel:`Reposition` and adjust the picture before clicking :guilabel:`Save Position`. - -- :guilabel:`Remove Cover`. - -.. _knowledge/articles_editing/emoji: - -Title emoji ------------ - -To add a title emoji to the article's name and header: - -- Click the :icon:`fa-ellipsis-v` :guilabel:`(ellipsis)` icon, then :guilabel:`Add Icon` to - generate a random emoji. Click the emoji to select a different one. - -- Alternatively, click the :icon:`fa-file-text-o` :guilabel:`(page)` icon next to the article's - name in the sidebar or the top bar and select the preferred emoji. - -.. _knowledge/articles_editing/views: - -Views and links from other apps -------------------------------- - -To insert a view or a view link into an article, follow these steps: - - #. Go to the desired app and select the preferred view. - #. Click the :icon:`fa-cog` :guilabel:`(cog)` icon, then select :menuselection:`Knowledge --> - Insert view in article` or :guilabel:`Insert link in article`. - #. Choose the article to insert the view or link to. - -.. note:: - Once the view or link is inserted: - - - Users without access to the view cannot see it in Knowledge, even if they can access the - article containing it. - - Clicking the inserted link opens a pop-up with the view's name next to the - :icon:`fa-clipboard` (:guilabel:`copy`), :icon:`fa-pencil-square-o` (:guilabel:`edit`), and - :icon:`fa-chain-broken` (:guilabel:`remove`) icons. Click the name inside the pop-up to open - the linked view. diff --git a/content/applications/productivity/knowledge/articles_editing/inserted-view.png b/content/applications/productivity/knowledge/articles_editing/inserted-view.png deleted file mode 100644 index f50cc424f4..0000000000 Binary files a/content/applications/productivity/knowledge/articles_editing/inserted-view.png and /dev/null differ diff --git a/content/applications/productivity/knowledge/articles_editing/style-and-colors.png b/content/applications/productivity/knowledge/articles_editing/style-and-colors.png deleted file mode 100644 index f1ee33fb4e..0000000000 Binary files a/content/applications/productivity/knowledge/articles_editing/style-and-colors.png and /dev/null differ diff --git a/content/applications/productivity/knowledge/articles_editing/ui.png b/content/applications/productivity/knowledge/articles_editing/ui.png deleted file mode 100644 index 114bd67a0a..0000000000 Binary files a/content/applications/productivity/knowledge/articles_editing/ui.png and /dev/null differ diff --git a/content/applications/productivity/knowledge/management.rst b/content/applications/productivity/knowledge/management.rst deleted file mode 100644 index d4d13cbfce..0000000000 --- a/content/applications/productivity/knowledge/management.rst +++ /dev/null @@ -1,216 +0,0 @@ -================== -Article management -================== - -Knowledge allows for managing articles, which consists of :ref:`structuring -`, :ref:`sharing `, :ref:`removing -`, and :ref:`retrieving ` them. - -Basic management -================ - -Click the :icon:`fa-ellipsis-v` (:guilabel:`ellipsis`) icon and select one of the following actions -for basic article management: - -- :guilabel:`Move To`: Select the article to move under a category or another article, then click - :guilabel:`Move Article`. -- :guilabel:`Lock Content`: Lock the article to stop edits. Click :guilabel:`Unlock` to edit again. -- :guilabel:`Create a Copy`: Copy the article under the :guilabel:`Private` section. -- :guilabel:`Open Version History`: View the current and previous versions of the article. -- :guilabel:`Export`: Open the browser's print function. -- :guilabel:`Add to Templates`: Add the article to the list of templates. -- :guilabel:`Send to Trash`: Move the article to the trash. - -.. note:: - The following actions only apply to nested articles and :ref:`article items - `: - - - :guilabel:`Convert into Article Item`: Convert the nested article into an article item. - - :guilabel:`Convert into Article`: Convert the article item into a nested article. - -.. tip:: - - Move an article directly from the sidebar tree by dragging and dropping it under another - article or category. - - Press `CTRL` / `CMD` + `K` to open the command palette, then type `?` to search for visible - articles or `$` for :ref:`hidden articles `. Alternatively, - hover over the :guilabel:`Workspace` category and click the :icon:`fa-eye` (:guilabel:`eye`) - icon to find hidden articles. - -.. _knowledge/management/structure: - -Structuring -=========== - -The article structure follows a hierarchy with parent and nested articles organized within the -following categories: - -- :guilabel:`Favorites` displays all articles marked as favorites. -- :guilabel:`Workspace` displays articles accessible to all internal users. -- :guilabel:`Shared` displays articles shared with specific users. -- :guilabel:`Private` displays personal articles. - -.. note:: - - To mark an article as a favorite and display the :guilabel:`Favorites` category, click the - :icon:`fa-star-o` (:guilabel:`star`) icon in the top-right menu. - - Nested articles inherit the access rights of their parent article. - -.. _knowledge/management/share: - -Sharing -======= - -Sharing an article involves configuring :ref:`access rights `, -inviting :ref:`users `, providing :ref:`online access -`, and determining its visibility in the :ref:`sidebar tree -`. - -Articles listed under a category in the sidebar tree are visible. Articles that certain users must -search for through the command palette due to restricted access rights are hidden. - -.. _knowledge/management/rights: - -Configure access rights ------------------------ - -Click :guilabel:`Share` in the top-right menu to configure access rights. - -Default access rights -~~~~~~~~~~~~~~~~~~~~~ - -.. tabs:: - - .. list-table:: - :widths: 20 80 - :header-rows: 1 - :stub-columns: 1 - - * - Setting - - Use - * - :guilabel:`Can edit` - - Allow all internal users to edit the article. - * - :guilabel:`Can read` - - Allow all internal users to read the article only. - * - :guilabel:`No access` - - Prevent all users from accessing the article in the sidebar tree or searching in the - command palette. - -.. _knowledge/management/visibility: - -Visibility -~~~~~~~~~~ - -.. tabs:: - - .. list-table:: - :widths: 20 80 - :header-rows: 1 - :stub-columns: 1 - - * - Setting - - Use - * - :guilabel:`Everyone` - - The article is visible in the sidebar tree to all internal users. - * - :guilabel:`Members` - - The article is only visible in the sidebar tree to :ref:`invited users - `, while other users can find it using the hidden article - search by pressing `CTRL` / `CMD` + `K` and typing `$`. - -.. note:: - - The :guilabel:`Default Access Rights` apply to all internal users except invited users; - specific access rights override default access rights. - - Selecting `Can edit` or `Can read` in the :guilabel:`Default Access Rights` moves the article - to the :guilabel:`Workspace` category, while selecting `No access` moves it to the - :guilabel:`Private` category if it is not shared with anyone. - - The :guilabel:`Visibility` setting only applies to :guilabel:`Workspace` articles. - -.. _knowledge/management/invite: - -Invite specific users ---------------------- - -To grant specific internal or portal users access to a private article or to share a -:guilabel:`Workspace` article with a portal user, follow these steps: - -#. Click :guilabel:`Share` in the top-right menu. -#. Click :guilabel:`Invite`. -#. Select the preferred :guilabel:`Permission` and add users in the :guilabel:`Recipients` field. -#. Click :guilabel:`Invite`. - -.. _knowledge/management/share-online: - -Generate article URL --------------------- - -Click :guilabel:`Share` and activate the :guilabel:`Share to web` toggle to generate a URL. -Click the :icon:`fa-clone` (:guilabel:`copy`) icon to copy the article's URL. - -.. note:: - - If an article contains :ref:`inserted views `, users with - the URL do not see them unless they can access the inserted content. - - Having the Website app is necessary to share an article's URL. - -.. _knowledge/management/remove: - -Removal -======= - -Removing an article involves deleting or archiving it. - -Delete an article ------------------ - -Select an article in the sidebar tree and click the :icon:`fa-ellipsis-v` (:guilabel:`ellipsis`) -icon, then :guilabel:`Send to Trash`. The article is moved to the trash for 30 days before being -permanently deleted. - -To delete an article directly, click :guilabel:`Articles` in the top-left menu, select an article, -and click :menuselection:`Actions --> Delete --> Delete` to remove the article permanently. - -.. note:: - To restore a trashed article, click :guilabel:`Open the Trash` at the bottom of the sidebar - tree, select an article, and click :guilabel:`Restore`. Alternatively, click :guilabel:`Articles` - in the top-left menu. In the search bar, click :menuselection:`Filters --> Trashed`. Click the - article, then :guilabel:`Restore`. - -Archive an article ------------------- - -Click :guilabel:`Articles`, select an article, and click :menuselection:`Actions --> Archive --> -Archive`. - -.. note:: - To restore an archived article, click :guilabel:`Articles`. In the search bar, click - :menuselection:`Filters --> Archived`. Select the article and go to :menuselection:`Actions --> - Unarchive`. - -.. _knowledge/management/retrieve: - -Retrieval -========= - -Retrieving Knowledge articles consists of accessing them from various Odoo apps or restoring -previous versions. - -Access articles from various apps ---------------------------------- - -Knowledge articles are accessible from the :ref:`form view ` of various -apps. Click the :icon:`fa-bookmark` :guilabel:`(Knowledge)` icon in the top right corner to open -the command palette, then choose one of the following search methods: - -- :guilabel:`Search for an article`: start typing the text to execute a semantic search that - identifies relevant article information. -- :guilabel:`Advanced Search`: after typing the text in the search bar, click :guilabel:`Advanced - Search` to perform a parametric search with options to filter, group, or save articles. - -Version history ---------------- - -To retrieve a previous version of an article, click the :icon:`fa-ellipsis-v` (:guilabel:`ellipsis`) -icon and select :guilabel:`Open Version History`. Select a version and click :guilabel:`Restore -history`. - -.. note:: - In the version history, the :guilabel:`Content` tab shows the selected version, while the - :guilabel:`Comparison` tab displays the differences between the article's previous and current - versions. diff --git a/content/applications/productivity/knowledge/management/invite.png b/content/applications/productivity/knowledge/management/invite.png deleted file mode 100644 index c35be8086d..0000000000 Binary files a/content/applications/productivity/knowledge/management/invite.png and /dev/null differ diff --git a/content/applications/productivity/knowledge/management/left-sidebar-cat.png b/content/applications/productivity/knowledge/management/left-sidebar-cat.png deleted file mode 100644 index dbde6c8037..0000000000 Binary files a/content/applications/productivity/knowledge/management/left-sidebar-cat.png and /dev/null differ diff --git a/content/applications/productivity/knowledge/management/share-menu.png b/content/applications/productivity/knowledge/management/share-menu.png deleted file mode 100644 index 69fa26d480..0000000000 Binary files a/content/applications/productivity/knowledge/management/share-menu.png and /dev/null differ diff --git a/content/applications/productivity/knowledge/management/toolbox.png b/content/applications/productivity/knowledge/management/toolbox.png deleted file mode 100644 index af9bcc30aa..0000000000 Binary files a/content/applications/productivity/knowledge/management/toolbox.png and /dev/null differ diff --git a/content/applications/productivity/knowledge/properties.rst b/content/applications/productivity/knowledge/properties.rst deleted file mode 100644 index 3bdd0fa67f..0000000000 --- a/content/applications/productivity/knowledge/properties.rst +++ /dev/null @@ -1,102 +0,0 @@ -========== -Properties -========== - -Properties are fields containing data and that can be added to articles by any user with **write** -access. These fields are shared between all the child articles and article items under the same -parent. - -.. note:: - To be able to add properties, an article must be either a **child article** or an **article - item**. - -Add property fields -=================== - -Hover above the first-level header to make the buttons appear. Click :menuselection:`⚙ Add -Properties --> Field Type`, select the type and add a default value if needed. To make the fields -appear in **kanban views**, check :guilabel:`View in Kanban` as well. To validate and close the -property creation window, click anywhere. - -.. image:: properties/fields.png - :align: center - :alt: Dropdown of property fields types - -The different types assess what the field content can be: - -.. list-table:: - :widths: 20 80 - :header-rows: 1 - :stub-columns: 1 - - * - Types - - Uses - * - :guilabel:`Text` - - Allows adding any content with no restriction. - * - :guilabel:`Checkbox` - - Add a checkbox. - * - :guilabel:`Integer` - - Allows adding integer numbers. - * - :guilabel:`Decimal` - - Allows adding any number. - * - :guilabel:`Date` - - Allows selecting a date. - * - :guilabel:`Date & Time` - - Allows selecting a date and time. - -Some **field types** need to be configured: - -.. image:: properties/manyone.png - :align: center - :alt: property configuration form - -.. list-table:: - :widths: 20 80 - :header-rows: 1 - :stub-columns: 1 - - * - Types - - Uses - * - :guilabel:`Selection` - - Add a drop-down selection menu with restricted values that have been set at the property - creation. - - To set it up, click :guilabel:`Add a Value` next to the :guilabel:`Values` field. Enter - predetermined values and press **enter** to validate; you can enter as many values as needed. - Click anywhere to close the property creation window. - * - :guilabel:`Tags` - - Allows creating and applying as many tags as needed. - - To set it up, enter your `new_tag` in the :guilabel:`Tags` field, and press **enter** or - click :guilabel:`Create "new_tag"`. Click anywhere to close the window. Then, add the tags - into the property field. To do so, click the property field and choose from the created tags; - enter the tags' name and press **enter**; enter a new tag's name and create a new one on the - spot. - * - :guilabel:`Many2one` - - Choose from a list of records that result from a model's domain. You can only select one - result. - - To set it up, click :guilabel:`Search a Model` in the :guilabel:`Model` field, select the - model. Match all records by clicking :guilabel:`## Record(s)`, or filter the results by - clicking :guilabel:`+ Add Filter` and show the records by clicking :guilabel:`## Record(s)`. - * - :guilabel:`Many2many` - - Choose from a list of records that result from a model's domain. You can select as many - results as needed. - - To set it up, click :guilabel:`Search a Model` in the :guilabel:`Model` field, select the - model. Match all records by clicking :guilabel:`## Record(s)`, or filter the results by - clicking :guilabel:`+ Add Filter` and show the records by clicking :guilabel:`## Record(s)`. - -Delete property fields -====================== - -To remove a property, click the **pencil** icon next to the targeted property, then click -:menuselection:`Delete --> Delete`. - -.. warning:: - Once a property field is deleted, you cannot retrieve it. - -Hide the property panel -======================= - -To hide the property sidebar panel, click the gear :guilabel:`(⚙)` button. diff --git a/content/applications/productivity/knowledge/properties/fields.png b/content/applications/productivity/knowledge/properties/fields.png deleted file mode 100644 index 3718a800be..0000000000 Binary files a/content/applications/productivity/knowledge/properties/fields.png and /dev/null differ diff --git a/content/applications/productivity/knowledge/properties/manyone.png b/content/applications/productivity/knowledge/properties/manyone.png deleted file mode 100644 index 8a3766dfbc..0000000000 Binary files a/content/applications/productivity/knowledge/properties/manyone.png and /dev/null differ diff --git a/content/applications/productivity/spreadsheet.rst b/content/applications/productivity/spreadsheet.rst index 001084e8f9..83c01985ba 100644 --- a/content/applications/productivity/spreadsheet.rst +++ b/content/applications/productivity/spreadsheet.rst @@ -1,5 +1,4 @@ :show-content: -:hide-page-toc: =========== Spreadsheet @@ -8,37 +7,222 @@ Spreadsheet .. toctree:: :titlesonly: - spreadsheet/insert - spreadsheet/functions spreadsheet/templates + spreadsheet/functions + spreadsheet/insert + spreadsheet/dynamic_pivot_tables spreadsheet/global_filters -Spreadsheet lets you organize, analyze, and visualize your data in tabular form. Among others, you -can: +**Odoo Spreadsheet** allows you to organize, manipulate, analyze, and visualize data. It offers +similar functionality to other spreadsheet solutions with the added benefit of integrating directly +with your Odoo database. + +With Odoo Spreadsheet, you can: + +- :ref:`create spreadsheets ` or :ref:`upload files + ` and open them with Odoo Spreadsheet +- :doc:`create templates ` +- :doc:`use functions, including Odoo-specific functions ` +- :doc:`insert and link to Odoo data ` +- :doc:`create and use dynamic pivot tables ` +- filter data across multiple Odoo data sources using :doc:`global filters + ` +- visualize data using charts and formatting +- share files internally and externally + +The Spreadsheet module is part of **Odoo Documents**. + +.. tip:: + Within a spreadsheet, opening the command palette, using the :doc:`keyboard shortcut + <../../applications/essentials/keyboard_shortcuts>` `Ctrl` + `K` or `Command` + `K`, allows you + to browse and execute spreadsheet commands via the keyboard, without having to navigate menus. + +.. note:: + Odoo spreadsheets serve as the foundation for the :doc:`dashboards available in Odoo Dashboards + <../../applications/productivity/dashboards>`. On a dashboard, charts and data tables are used to + display dynamic Odoo data and provide an overview of key business metrics. + + :ref:`Standard, pre-configured dashboards + ` can be :ref:`customized + ` by editing the dashboard's underlying spreadsheet via + Dashboards. :ref:`Custom dashboards + ` can also be created from scratch, starting from an Odoo + spreadsheet; any subsequent :ref:`modifications ` are + performed via Dashboards. + +.. _spreadsheet/create-new: + +Create a new spreadsheet +======================== + +To create a new spreadsheet: + +#. Open Odoo Documents and navigate to the section or folder in which the spreadsheet should be + created. +#. Click :guilabel:`New` and select :guilabel:`Spreadsheet`. + + .. tip:: + Alternatively, from the :icon:`fa-folder-o` :guilabel:`All` folder, click :guilabel:`New` and + select :guilabel:`Spreadsheet`, then select in which :guilabel:`Folder` the + spreadsheet should be created. + +#. Click :guilabel:`Blank spreadsheet` or, to create a new spreadsheet using an existing + :doc:`template `, select the relevant template. +#. Click :guilabel:`Create`. +#. Click on `Untitled spreadsheet` at the top of the screen to edit the name of the spreadsheet. + +.. tip:: + It is also possible to create a new spreadsheet by: + + - clicking :menuselection:`File -->` :icon:`os-clear-and-reload` :menuselection:`New` from the + menu bar of an open spreadsheet; or + - :doc:`inserting a list, pivot table, or chart from another Odoo app ` into + a new spreadsheet directly from the app in question. + + In these cases, the new spreadsheet is saved in Odoo Documents in the :icon:`fa-hdd-o` + :guilabel:`My Drive` personal folder. + +.. _spreadsheet/upload-files: + +Upload files +============ + +Files in `.xlsx` or `.csv` format can be uploaded into Odoo Documents and opened with Odoo +Spreadsheet. To do so: + +#. Open Odoo Documents and navigate to the section or folder where the spreadsheet should be saved. +#. Click :guilabel:`New` and select :guilabel:`Upload`. +#. Select the relevant `.xlsx` or `.csv` file and click :guilabel:`Open`. +#. Click on the uploaded file. +#. By default, the original file is deleted when it is opened with Odoo Spreadsheet. To preserve + the original file in the same folder in Odoo Documents, disable :guilabel:`Send source file to + trash`. +#. Click :guilabel:`Open with Odoo Spreadsheet`. + +The file can now be fully edited in Odoo Spreadsheet. + +.. _spreadsheet/manage-spreadsheets: + +Manage spreadsheets +=================== + +Users with :guilabel:`Editor` rights to a specific spreadsheet have various options for managing the +spreadsheet via the :guilabel:`File` menu: + +- :icon:`os-copy-file` :guilabel:`Make a copy`: creates a duplicate of the current spreadsheet with + the same :ref:`regional settings ` (or locale). +- :icon:`os-save` :guilabel:`Save as template`: allows the current spreadsheet to be used as a + :doc:`template ` for future spreadsheets. +- :icon:`os-download` :guilabel:`Download`: downloads the spreadsheet in `.xlsx` format. + + .. important:: + When you download a spreadsheet in `.xlsx` format, any spreadsheet formulas that retrieve Odoo + data from your database, e.g., via an :doc:`inserted list ` or via other + :doc:`Odoo-specific functions `, are converted to the values they would + have returned at the moment the spreadsheet was downloaded. + + .. tip:: + Users with :guilabel:`Viewer` rights can also download a spreadsheet in `.xlsx` format. + +- :icon:`os-version-history` :guilabel:`See version history`: provides read-only :ref:`access to + previous versions ` of the current spreadsheet, + which can be named and restored if needed. +- :icon:`fa-print` :guilabel:`Print`: prints a copy of the spreadsheet on a connected printer. +- :icon:`os-cog` :guilabel:`Settings`: allows you to view and change the :ref:`locale + ` of the current spreadsheet. +- :icon:`os-add-to-dashboard` :guilabel:`Add to dashboard`: :ref:`converts + ` the current spreadsheet into an Odoo + dashboard. + +.. _spreadsheet/manage-spreadsheets/version-history: + +Version history +--------------- + +Odoo Spreadsheet automatically saves versions of spreadsheets as changes are made, allowing users +with :guilabel:`Editor` rights to browse and restore previous versions. + +To access the version history of a spreadsheet, click :menuselection:`File -->` +:icon:`os-version-history` :menuselection:`See version history` from the menu bar. Saved versions +appear in a panel on the right of the spreadsheet. The name of the user who made the change is +shown, as well as the date and time of the change. + +The following actions are possible: + +- **View an earlier version** in read-only format by clicking on the relevant version. +- **Restore an earlier version** by clicking :icon:`fa-ellipsis-v` :guilabel:`(vertical ellipsis)` + then :guilabel:`Restore this version`. +- **Copy an earlier version** by clicking :icon:`fa-ellipsis-v` :guilabel:`(vertical ellipsis)` then + :menuselection:`Make a copy`. A copy of the version opens as a new spreadsheet. +- **Create named versions** by clicking on the date and time of the relevant version and entering + the desired name. The date and time of the version are then displayed below the new name. + +.. tip:: + When viewing an earlier, read-only version of a spreadsheet, the following actions are still + possible: + + - Search the spreadsheet by clicking :menuselection:`Edit -->` :icon:`fa-search` + :menuselection:`Find and replace` or using the shortcut `Ctrl` + `H`. + - Copy an individual cell or selected area by clicking :menuselection:`Edit -->` + :icon:`fa-clipboard` :menuselection:`Copy` or using the shortcut `Ctrl` + `C`. + +.. _spreadsheet/manage-spreadsheets/regional-settings: + +Regional settings +----------------- + +To ensure data is displayed consistently for all users, the regional settings (or locale) of a +spreadsheet, are managed at spreadsheet level. This locale affects the following settings and +formats: + +- thousand and decimal separators +- date and time formats +- first day of the week + +By default, a new spreadsheet inherits the regional settings of the user who created it. For +example, any spreadsheets created by a user whose language is set to :guilabel:`French (BE) / +Français (BE)` will follow Belgian French conventions. + +A spreadsheet's locale can be viewed and changed at any time by a user with :guilabel:`Editor` +rights. To view the locale of a spreadsheet, click :menuselection:`File -->` :icon:`os-cog` +:menuselection:`Settings` from the menu bar. The :guilabel:`Spreadsheet settings` panel opens on the +right of the spreadsheet. To change the locale, select the appropriate locale from the dropdown. + +.. tip:: + When you open a spreadsheet that has a different locale to that of your user profile, a blue + :icon:`fa-globe` :guilabel:`(globe)` icon appears at the top right of the spreadsheet. Hovering + over the icon reveals a warning message that indicates the spreadsheet locale and highlights + formats that differ. + + .. image:: spreadsheet/locale-difference.png + :alt: Warning about difference between user and spreadsheet locale -- :doc:`Insert and link your Odoo data (pivots, graphs, lists, and menus) `. -- :doc:`Use global filters `. -- :doc:`Use formulas and functions `. -- :doc:`Create and use templates `. -- Format data. -- Sort and filter data. + If no :icon:`fa-globe` :guilabel:`(globe)` icon is shown, this means the spreadsheet's locale is + the same as that of your user profile. -.. _spreadsheet/glossary: +.. _spreadsheet/manage-spreadsheets/convert-to-dashboard: -Glossary -======== +Convert a spreadsheet into a dashboard +-------------------------------------- -Some of Spreadsheet's main :abbr:`UI (user interface)` elements are highlighted and defined below. +A user with the appropriate :ref:`access rights ` can convert an Odoo +spreadsheet into a dashboard that is then accessible via +:doc:`Odoo Dashboards <../../../applications/productivity/dashboards>`. To do so: -.. image:: spreadsheet/ui-elements.png - :align: center - :alt: Spreadsheet main UI elements +#. Click :menuselection:`File -->` :icon:`os-add-to-dashboard` :menuselection:`Add to dashboard` + from the menu bar. +#. Enter the :guilabel:`Dashboard Name`. +#. Select the relevant :guilabel:`Dashboard Section` from the dropdown or, to create a new dashboard + section, type the name of the new section, then click :guilabel:`Create`. +#. If necessary, modify the :guilabel:`Access Groups` to determine which :ref:`user groups + ` can access the dashboard. +#. Click :guilabel:`Create`. -#. Menu bar -#. Top bar -#. Formula bar -#. Filters button -#. Row header -#. Column header -#. Cell menu -#. Bottom bar +.. tip:: + - By default, the first tab of the spreadsheet serves as the front end of the dashboard. + - It is also possible to convert a spreadsheet to a dashboard from within the :ref:`Dashboard + configuration settings `, by directly adding the spreadsheet to + an existing or new dashboard section. + - After a spreadsheet has been converted to a dashboard, it is deleted from Odoo Documents. Any + subsequent :ref:`modifications ` need to be made via + Odoo Dashboards. diff --git a/content/applications/productivity/spreadsheet/command-palette.png b/content/applications/productivity/spreadsheet/command-palette.png new file mode 100644 index 0000000000..78ba142481 Binary files /dev/null and b/content/applications/productivity/spreadsheet/command-palette.png differ diff --git a/content/applications/productivity/spreadsheet/dynamic_pivot_tables.rst b/content/applications/productivity/spreadsheet/dynamic_pivot_tables.rst new file mode 100644 index 0000000000..49a934caec --- /dev/null +++ b/content/applications/productivity/spreadsheet/dynamic_pivot_tables.rst @@ -0,0 +1,221 @@ +==================== +Dynamic pivot tables +==================== + +When a pivot view from an Odoo database is inserted in a spreadsheet, it is by default a static +pivot table. Each cell in a static pivot table contains an :ref:`Odoo-specific function +` that retrieves data from your database. + +.. image:: dynamic_pivot_tables/pivot-function-static.png + :alt: Function of static pivot table cell + +When the corresponding data in your database changes, e.g., the sales related to a given quarter or +an individual salesperson, the cells of your static pivot table are updated. + +However, a static pivot table does not expand automatically to accommodate new data, e.g., sales +data for a new quarter or for a newly hired salesperson. Neither is it possible to add or manipulate +dimensions (i.e., columns or rows) or measures via the pivot table properties. + +.. note:: + If you attempt to update or manipulate the properties of a pivot table that has just been + inserted into a spreadsheet, an error message appears in the top right corner of the screen: + + .. image:: dynamic_pivot_tables/pivot-table-error.png + :alt: Error message when trying to manipulate static pivot table + +To have more flexibility in how you can manipulate your pivot table, you can :ref:`create a dynamic +pivot table ` from a static pivot table. + +.. _spreadsheet/dynamic-pivot-tables/create: + +Create a dynamic pivot table +============================ + +There are two main ways to create a dynamic pivot table from a static pivot table: + +- **Duplicate the static pivot table from the pivot table properties**: :ref:`Open the pivot table + properties `, click the :icon:`fa-cog` + (:guilabel:`gear`) icon at the top right of the pane, then click :icon:`fa-clone` + :guilabel:`Duplicate`. + + A new data source is created and a dynamic version of the pivot table is inserted into a new + sheet. The dynamic pivot table has the same styling as the original pivot table. + + .. note:: + When you use this method, your new dynamic pivot table gets the next available pivot ID. This + means you can create multiple pivot views associated with the same model, but with distinct + settings, groupings, or calculations. + +- **Re-insert the dynamic pivot table from the Data menu**: On the sheet that contains your static + pivot table, position your cursor in an empty cell. Click :menuselection:`Data -->` + :icon:`os-insert-pivot` :menuselection:`Re-insert dynamic pivot` from the menu bar, then select + the relevant pivot table. + + A new, dynamic pivot table appears, with the same styling as the original pivot table. + + .. note:: + When you use this method, your static and dynamic pivot share the same data source, and, + consequently, the same pivot ID. To avoid confusion, delete the original static pivot table. + +.. tip:: + It is also possible to directly enter the :ref:`function + ` of the dynamic pivot table in an empty cell. + However, with this method, the table styling needs to be re-applied manually. + +.. _spreadsheet/dynamic-pivot-tables/functions: + +Dynamic pivot table functions +----------------------------- + +Instead of each cell containing a unique function that retrieves data from your database, as in a +:ref:`static pivot table `, a dynamic pivot table +has a single function: + +.. code-block:: text + + =PIVOT(pivot_id, [row_count], [include_total], [include_column_titles], [column_count] ) + +The arguments of the function are as follows: + +- `pivot_id`: the ID assigned when the pivot table is inserted. The first pivot table + inserted in a spreadsheet is assigned pivot ID `1`, the second, pivot ID `2`, etc. +- `row_count` and `column count`: the number of rows and columns respectively. +- `include_total` and `include_column_titles`: values of `0` remove the total and column + titles respectively. + +This is an array function, which allows the pivot table to expand automatically to accommodate the +results of the function. + +The top-left cell contains the editable function, while clicking on any other cell reveals this +formula greyed out. + +.. image:: dynamic_pivot_tables/pivot-function-dynamic.png + :alt: Array function of a dynamic pivot table + +.. tip:: + If necessary, you can update the function of a dynamic pivot table to remove elements like the + total or column titles. + + With the function open in the formula bar or the top-left cell of the pivot table, position your + cursor after the pivot ID then type `,` to advance to the optional field you want to modify. In + the example below, adding the value `0` for `[include_total]` removes both the row total and + column total from the pivot table. + + .. image:: dynamic_pivot_tables/modify-function.png + :alt: Modifying the function of a dynamic pivot table + +.. _spreadsheet/dynamic-pivot-tables/manipulate: + +Manipulate a dynamic pivot table +================================ + +To manipulate data in a dynamic pivot table, :ref:`open the pivot table properties +`. + +The following options are available by clicking the :icon:`fa-cog` (:guilabel:`gear`) icon: + +- :icon:`fa-exchange` :guilabel:`Flip axes`: to move all the dimensions represented in columns to + rows and vice versa. + + .. tip:: + Flipping the axes presents the data from a different perspective, possibly bringing new + insights. However, depending on the volume of data, it can result in #SPILL errors. This + happens when a formula tries to output a range of values, but something is blocking those + cells, such as other data, merged cells, or the boundaries of the current sheet. + + Hovering over the cell containing :guilabel:`#SPILL` details the error. + +- :icon:`fa-clone` :guilabel:`Duplicate`: to duplicate the dynamic pivot table and create a new data + source with distinct properties. +- :icon:`fa-trash` :guilabel:`Delete`: to delete the data source of the dynamic pivot table. + + .. note:: + Deleting the data source of a pivot table does not delete the visual representation of the + data. Delete the table from the spreadsheet using your preferred means, e.g., via keyboard + commands, spreadsheet menus, or by deleting the sheet. + +.. _spreadsheet/dynamic-pivot-tables/manipulate-dimensions: + +Dimensions +---------- + +The dimensions of the pivot table, i.e., how the data is grouped, are placed in :guilabel:`Columns` +and :guilabel:`Rows` according to how they appeared in the pivot view in your database, i.e., before +the pivot table was inserted in the spreadsheet. + +You can: + +- add new dimensions by clicking :guilabel:`Add` +- delete existing dimensions by clicking the :icon:`fa-trash` :guilabel:`(delete)` icon on the + relevant dimension +- change the order in which dimensions are displayed in :guilabel:`Columns` or :guilabel:`Rows` by + clicking then dragging the dimension to the desired position within its respective section +- change the axis on which a dimension is shown by clicking then dragging the dimension from + :guilabel:`Columns` to :guilabel:`Rows` or vice versa +- change how a dimension's values are ordered by selecting :guilabel:`Ascending`, + :guilabel:`Descending`, or :guilabel:`Unsorted` in the :guilabel:`Order by` field +- for date- or time-based dimensions, select the desired :guilabel:`Granularity` from the options in + the dropdown menu + +.. _spreadsheet/dynamic-pivot-tables/manipulate-measures: + +Measures +-------- + +The measures of your pivot table, i.e., what you are measuring, or analyzing, based on the +dimensions you have chosen, are listed in the order they appeared in the pivot view in your +database. + +You can: + +- add new measures, including :ref:`calculated measures + `, by clicking + :guilabel:`Add` +- hide (:icon:`fa-eye`), show (:icon:`fa-eye-slash`), or delete (:icon:`fa-trash`) existing measures +- edit the name of existing measures by clicking on the measure's name +- change the order in which measures are displayed by clicking then dragging the measure to the + desired position +- change how measures are displayed by clicking the :icon:`fa-cog` :guilabel:`(gear)` icon, then + selecting the desired option from the dropdown menu, e.g., :guilabel:`% of grand total` or + :guilabel:`Rank smallest to largest`. The pivot table data updates dynamically as different + options are selected. +- choose how measures are aggregated, e.g., by :guilabel:`Sum`, :guilabel:`Average`, + :guilabel:`Minimum` + +.. tip:: + To sort the values of a dynamic pivot table by measure for a specific dimension, right-click any + pivot table value, then click :icon:`os-sort-range` :guilabel:`Sort pivot` and select + :guilabel:`Ascending` or :guilabel:`Descending` from the dropdown. To return to the default + order, follow the same steps then select :guilabel:`No sorting` from the dropdown. + +.. _spreadsheet/dynamic-pivot-tables/manipulate-measures-calculated-measures: + +Calculated measures +~~~~~~~~~~~~~~~~~~~ + +It is possible to add calculated measures if the desired measure did not exist in the original pivot +view. For example, a calculated measure could be added to show the average revenue per order or the +profit margin per product. + +To add a calculated measure: + +#. From the :guilabel:`Measures` section of the pivot table properties, click :guilabel:`Add`. +#. Below the scrollable list, click :icon:`os-formula` :guilabel:`Add calculated measure`. +#. Rename the calculated measure by clicking on the name and typing. +#. Click on the line starting with `=` and enter the formula. + + .. example:: + In the below example, the average revenue per order is added by dividing the sum of the sales + by the number of orders. + + .. image:: dynamic_pivot_tables/calculated-measure.png + :alt: Formula for a calculated measure + +#. Choose how the measure should be aggregated by selecting a value from the dropdown. + +.. tip:: + There are advantages to using a static pivot table, for example, being able to see the functions + behind individual cells. To have this possibility, select the relevant portion of your dynamic + pivot table, copy it, then paste it into an empty part of the sheet. Click on any pasted cell to + see the :ref:`Odoo function ` used to retrieve the data. + diff --git a/content/applications/productivity/spreadsheet/dynamic_pivot_tables/calculated-measure.png b/content/applications/productivity/spreadsheet/dynamic_pivot_tables/calculated-measure.png new file mode 100644 index 0000000000..90f74d29f7 Binary files /dev/null and b/content/applications/productivity/spreadsheet/dynamic_pivot_tables/calculated-measure.png differ diff --git a/content/applications/productivity/spreadsheet/dynamic_pivot_tables/modify-function.png b/content/applications/productivity/spreadsheet/dynamic_pivot_tables/modify-function.png new file mode 100644 index 0000000000..734c047818 Binary files /dev/null and b/content/applications/productivity/spreadsheet/dynamic_pivot_tables/modify-function.png differ diff --git a/content/applications/productivity/spreadsheet/dynamic_pivot_tables/pivot-function-dynamic.png b/content/applications/productivity/spreadsheet/dynamic_pivot_tables/pivot-function-dynamic.png new file mode 100644 index 0000000000..9da4c77bc2 Binary files /dev/null and b/content/applications/productivity/spreadsheet/dynamic_pivot_tables/pivot-function-dynamic.png differ diff --git a/content/applications/productivity/spreadsheet/dynamic_pivot_tables/pivot-function-static.png b/content/applications/productivity/spreadsheet/dynamic_pivot_tables/pivot-function-static.png new file mode 100644 index 0000000000..7f16ead4d2 Binary files /dev/null and b/content/applications/productivity/spreadsheet/dynamic_pivot_tables/pivot-function-static.png differ diff --git a/content/applications/productivity/spreadsheet/dynamic_pivot_tables/pivot-table-error.png b/content/applications/productivity/spreadsheet/dynamic_pivot_tables/pivot-table-error.png new file mode 100644 index 0000000000..b0a0a348e8 Binary files /dev/null and b/content/applications/productivity/spreadsheet/dynamic_pivot_tables/pivot-table-error.png differ diff --git a/content/applications/productivity/spreadsheet/functions.rst b/content/applications/productivity/spreadsheet/functions.rst index b739665adc..05adc89b70 100644 --- a/content/applications/productivity/spreadsheet/functions.rst +++ b/content/applications/productivity/spreadsheet/functions.rst @@ -2,30 +2,32 @@ Functions ========= -Spreadsheet functions are divided in the following categories: - -- :ref:`Array ` -- :ref:`Database ` -- :ref:`Date ` -- :ref:`Engineering ` -- :ref:`Filter ` -- :ref:`Financial ` -- :ref:`Info ` -- :ref:`Logical ` -- :ref:`Lookup ` -- :ref:`Math ` -- :ref:`Misc ` -- :ref:`Odoo ` -- :ref:`Operators ` -- :ref:`Statistical ` -- :ref:`Text ` -- :ref:`Web ` +**Odoo Spreadsheet** supports formulas and functions found in most spreadsheet solutions. This page +presents the available functions by category. Odoo-specific functions are included both in the +relevant category and in a dedicated :ref:`Odoo ` category: + +- :ref:`Array ` +- :ref:`Database ` +- :ref:`Date ` +- :ref:`Engineering ` +- :ref:`Filter ` +- :ref:`Financial ` +- :ref:`Info ` +- :ref:`Logical ` +- :ref:`Lookup ` +- :ref:`Math ` +- :ref:`Operators ` +- :ref:`Parser ` +- :ref:`Statistical ` +- :ref:`Text ` +- :ref:`Web ` +- :ref:`Odoo-specific functions ` .. note:: Formulas containing functions that are not compatible with Excel are replaced by their evaluated result when exporting a spreadsheet. -.. _functions/array: +.. _spreadsheet/functions/array: Array ===== @@ -77,7 +79,7 @@ Array * - WRAPROWS(range, wrap_count, [pad_with]) - `Excel WRAPROWS article `_ -.. _functions/database: +.. _spreadsheet/functions/database: Database ======== @@ -113,7 +115,7 @@ Database * - DVARP(database, field, criteria) - `Excel DVARP article `_ -.. _functions/date: +.. _spreadsheet/functions/date: Date ==== @@ -148,12 +150,22 @@ Date - `Excel MINUTE article `_ * - MONTH(date) - `Excel MONTH article `_ + * - MONTH.END(date) + - Last day of the month following a date (not compatible with Excel) + * - MONTH.START(date) + - First day of the month preceding a date (not compatible with Excel) * - NETWORKDAYS(start_date, end_date, [holidays]) - `Excel NETWORKDAYS article `_ * - NETWORKDAYS.INTL(start_date, end_date, [weekend], [holidays]) - `Excel NETWORKDAYS.INTL article `_ * - NOW() - `Excel NOW article `_ + * - QUARTER(date) + - Quarter of the year a specific date falls in (not compatible with Excel) + * - QUARTER.END(date) + - Last day of the quarter of the year a specific date falls in (not compatible with Excel) + * - QUARTER.START(date) + - First day of the quarter of the year a specific date falls in (not compatible with Excel) * - SECOND(time) - `Excel SECOND article `_ * - TIME(hour, minute, second) @@ -172,24 +184,14 @@ Date - `Excel WORKDAY.INTL article `_ * - YEAR(date) - `Excel YEAR article `_ - * - YEARFRAC(start_date, end_date, [day_count_convention]) - - Exact number of years between two dates (not compatible with Excel) - * - MONTH.START(date) - - First day of the month preceding a date (not compatible with Excel) - * - MONTH.END(date) - - Last day of the month following a date (not compatible with Excel) - * - QUARTER(date) - - Quarter of the year a specific date falls in (not compatible with Excel) - * - QUARTER.START(date) - - First day of the quarter of the year a specific date falls in (not compatible with Excel) - * - QUARTER.END(date) - - Last day of the quarter of the year a specific date falls in (not compatible with Excel) - * - YEAR.START(date) - - First day of the year a specific date falls in (not compatible with Excel) * - YEAR.END(date) - Last day of the year a specific date falls in (not compatible with Excel) + * - YEAR.START(date) + - First day of the year a specific date falls in (not compatible with Excel) + * - YEARFRAC(start_date, end_date, [day_count_convention]) + - Exact number of years between two dates (not compatible with Excel) -.. _functions/engineering: +.. _spreadsheet/functions/engineering: Engineering =========== @@ -203,7 +205,7 @@ Engineering * - DELTA(number1, [number2]) - `Excel DELTA article `_ -.. _functions/filter: +.. _spreadsheet/functions/filter: Filter ====== @@ -216,10 +218,14 @@ Filter - Description or link * - FILTER(range, condition1, [condition2, ...]) - `Excel FILTER article `_ + * - ODOO.FILTER.VALUE(filter_name) + - Returns the current value of a spreadsheet filter (not compatible with Excel) + * - SORT(range, [sort_column, ...], [is_ascending, ...]) + - `Excel SORT article `_ * - UNIQUE(range, [by_column], [exactly_once]) - `Excel UNIQUE article `_ -.. _functions/financial: +.. _spreadsheet/functions/financial: Financial ========= @@ -234,10 +240,10 @@ Financial - `Excel ACCRINTM article `_ * - AMORLINC(cost, purchase_date, first_period_end, salvage, period, rate, [day_count_convention]) - `Excel AMORLINC article `_ - * - COUPDAYS(settlement, maturity, frequency, [day_count_convention]) - - `Excel COUPDAYS article `_ * - COUPDAYBS(settlement, maturity, frequency, [day_count_convention]) - `Excel COUPDAYBS article `_ + * - COUPDAYS(settlement, maturity, frequency, [day_count_convention]) + - `Excel COUPDAYS article `_ * - COUPDAYSNC(settlement, maturity, frequency, [day_count_convention]) - `Excel COUPDAYSNC article `_ * - COUPNCD(settlement, maturity, frequency, [day_count_convention]) @@ -286,20 +292,34 @@ Financial - `Excel NPER article `_ * - NPV(discount, cashflow1, [cashflow2, ...]) - `Excel NPV article `_ + * - ODOO.ACCOUNT.GROUP(type) + - Returns the account ids of a given group (not compatible with Excel) + * - ODOO.CREDIT(account_codes, date_range, [offset], [company_id], [include_unposted]) + - Get the total credit for the specified account(s) and period (not compatible with Excel) + * - ODOO.CURRENCY.RATE(currency_from, currency_to, [date]) + - This function takes in two currency codes as arguments, and returns the exchange rate from the first currency to the second as float (not compatible with Excel) + * - ODOO.DEBIT(account_codes, date_range, [offset], [company_id], [include_unposted]) + - Get the total debit for the specified account(s) and period (not compatible with Excel) + * - ODOO.BALANCE(account_codes, date_range, [offset], [company_id], [include_unposted]) + - Get the total balance for the specified account(s) and period (not compatible with Excel) + * - ODOO.FISCALYEAR.END(day, [company_id]) + - Returns the ending date of the fiscal year encompassing the provided date (not compatible with Excel) + * - ODOO.FISCALYEAR.START(day, [company_id]) + - Returns the starting date of the fiscal year encompassing the provided date (not compatible with Excel) * - PDURATION(rate, present_value, future_value) - `Excel PDURATION article `_ * - PMT(rate, number_of_periods, present_value, [future_value], [end_or_beginning]) - `Excel PMT article `_ * - PPMT(rate, period, number_of_periods, present_value, [future_value], [end_or_beginning]) - `Excel PPMT article `_ - * - PV(rate, number_of_periods, payment_amount, [future_value], [end_or_beginning]) - - `Excel PV article `_ * - PRICE(settlement, maturity, rate, yield, redemption, frequency, [day_count_convention]) - `Excel PRICE article `_ * - PRICEDISC(settlement, maturity, discount, redemption, [day_count_convention]) - `Excel PRICEDISC article `_ * - PRICEMAT(settlement, maturity, issue, rate, yield, [day_count_convention]) - `Excel PRICEMAT article `_ + * - PV(rate, number_of_periods, payment_amount, [future_value], [end_or_beginning]) + - `Excel PV article `_ * - RATE(number_of_periods, payment_per_period, present_value, [future_value], [end_or_beginning], [rate_guess]) - `Excel RATE article `_ * - RECEIVED(settlement, maturity, investment, discount, [day_count_convention]) @@ -310,10 +330,10 @@ Financial - `Excel SLN article `_ * - SYD(cost, salvage, life, period) - `Excel SYD article `_ - * - TBILLPRICE(settlement, maturity, discount) - - `Excel TBILLPRICE article `_ * - TBILLEQ(settlement, maturity, discount) - `Excel TBILLEQ article `_ + * - TBILLPRICE(settlement, maturity, discount) + - `Excel TBILLPRICE article `_ * - TBILLYIELD(settlement, maturity, price) - `Excel TBILLYIELD article `_ * - VDB(cost, salvage, life, start, end, [factor], [no_switch]) @@ -329,7 +349,7 @@ Financial * - YIELDMAT(settlement, maturity, issue, rate, price, [day_count_convention]) - `Excel YIELDMAT article `_ -.. _functions/info: +.. _spreadsheet/functions/info: Info ==== @@ -342,6 +362,8 @@ Info - Description or link * - CELL(info_type, reference) - `Excel CELL article `_ + * - ISBLANK(value) + - `Excel IS article `_ * - ISERR(value) - `Excel IS article `_ * - ISERROR(value) @@ -356,12 +378,10 @@ Info - `Excel IS article `_ * - ISTEXT(value) - `Excel IS article `_ - * - ISBLANK(value) - - `Excel IS article `_ * - NA() - `Excel NA article `_ -.. _functions/logical: +.. _spreadsheet/functions/logical: Logical ======= @@ -388,12 +408,14 @@ Logical - `Excel NOT article `_ * - OR(logical_expression1, [logical_expression2, ...]) - `Excel OR article `_ + * - SWITCH(expression, case1, value1, [case2, ...], [value2, ...], [default]) + - `Excel SWITCH article `_ * - TRUE() - `Excel TRUE article `_ * - XOR(logical_expression1, [logical_expression2, ...]) - `Excel XOR article `_ -.. _functions/lookup: +.. _spreadsheet/functions/lookup: Lookup ====== @@ -420,12 +442,14 @@ Lookup - `Excel LOOKUP article `_ * - MATCH(search_key, range, [search_type]) - `Excel MATCH article `_ - * - PIVOT(pivot_id, measure_name, [domain_field_name, ...], [domain_value, ...]) - - Get the value from a pivot (not compatible with Excel) - * - PIVOT.HEADER(pivot_id, [domain_field_name, ...], [domain_value, ...]) - - Get the header of a pivot (not compatible with Excel) - * - PIVOT.TABLE(pivot_id, [row_count], [include_total], [include_column_titles]) + * - OFFSET(reference, rows, cols, [height], [width]) + - `Excel OFFSET article `_ + * - PIVOT(pivot_id, [row_count], [include_total], [include_column_titles], [column_count]) - Get a pivot table (not compatible with Excel) + * - PIVOT.HEADER(pivot_id, [domain_field_name, ...], [domain_value, ...]) + - Get the header of a pivot table (not compatible with Excel) + * - PIVOT.VALUE(pivot_id, measure_name, [domain_field_name, ...], [domain_value, ...]) + - Get the value from a pivot table (not compatible with Excel) * - ROW([cell_reference]) - `Excel ROW article `_ * - ROWS(range) @@ -435,7 +459,7 @@ Lookup * - XLOOKUP(search_key, lookup_range, return_range, [if_not_found], [match_mode], [search_mode]) - `Excel XLOOKUP article `_ -.. _functions/math: +.. _spreadsheet/functions/math: Math ==== @@ -486,10 +510,6 @@ Math - `Excel COUNTIF article `_ * - COUNTIFS(criteria_range1, criterion1, [criteria_range2, ...], [criterion2, ...]) - `Excel COUNTIFS article `_ - * - COUNTUNIQUE(value1, [value2, ...]) - - Counts number of unique values in a range (not compatible with Excel) - * - COUNTUNIQUEIFS(range, criteria_range1, criterion1, [criteria_range2, ...], [criterion2, ...]) - - Counts number of unique values in a range, filtered by a set of criteria (not compatible with Excel) * - CSC(angle) - `Excel CSC article `_ * - CSCH(value) @@ -516,6 +536,8 @@ Math - `Excel ISODD article `_ * - LN(value) - `Excel LN article `_ + * - LOG(value, [base]) + - Get the logarithm of a number for a given base (not compatible with Excel) * - MOD(dividend, divisor) - `Excel MOD article `_ * - MUNIT(dimension) @@ -544,6 +566,8 @@ Math - `Excel SEC article `_ * - SECH(value) - `Excel SECH article `_ + * - SEQUENCE(rows, [columns], [start], ][step]) + - `Excel SEQUENCE article `_ * - SIN(angle) - `Excel SIN article `_ * - SINH(value) @@ -563,53 +587,7 @@ Math * - TRUNC(value, [places]) - `Excel TRUNC article `_ -.. _functions/misc: - -Misc -==== - -.. list-table:: - :header-rows: 1 - :stub-columns: 1 - - * - Name and arguments - - Description or link - * - FORMAT.LARGE.NUMBER(value, [unit]) - - Apply a large number format (not compatible with Excel) - -.. _functions/odoo: - -Odoo -==== - -.. list-table:: - :header-rows: 1 - :stub-columns: 1 - - * - Name and arguments - - Description or link - * - ODOO.CREDIT(account_codes, date_range, [offset], [company_id], [include_unposted]) - - Get the total credit for the specified account(s) and period (not compatible with Excel) - * - ODOO.DEBIT(account_codes, date_range, [offset], [company_id], [include_unposted]) - - Get the total debit for the specified account(s) and period (not compatible with Excel) - * - ODOO.BALANCE(account_codes, date_range, [offset], [company_id], [include_unposted]) - - Get the total balance for the specified account(s) and period (not compatible with Excel) - * - ODOO.FISCALYEAR.START(day, [company_id]) - - Returns the starting date of the fiscal year encompassing the provided date (not compatible with Excel) - * - ODOO.FISCALYEAR.END(day, [company_id]) - - Returns the ending date of the fiscal year encompassing the provided date (not compatible with Excel) - * - ODOO.ACCOUNT.GROUP(type) - - Returns the account ids of a given group (not compatible with Excel) - * - ODOO.CURRENCY.RATE(currency_from, currency_to, [date]) - - This function takes in two currency codes as arguments, and returns the exchange rate from the first currency to the second as float (not compatible with Excel) - * - ODOO.LIST(list_id, index, field_name) - - Get the value from a list (not compatible with Excel) - * - ODOO.LIST.HEADER(list_id, field_name) - - Get the header of a list (not compatible with Excel) - * - ODOO.FILTER.VALUE(filter_name) - - Return the current value of a spreadsheet filter (not compatible with Excel) - -.. _functions/operators: +.. _spreadsheet/functions/operators: Operators ========= @@ -651,7 +629,21 @@ Operators * - UPLUS(value) - A specified number, unchanged (not compatible with Excel) -.. _functions/statistical: +.. _spreadsheet/functions/parser: + +Parser +====== + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - CONVERT(number, from_unit, to_unit) + - `Excel CONVERT article `_ + +.. _spreadsheet/functions/statistical: Statistical =========== @@ -666,14 +658,14 @@ Statistical - `Excel AVEDEV article `_ * - AVERAGE(value1, [value2, ...]) - `Excel AVERAGE article `_ - * - AVERAGE.WEIGHTED(values, weights, [additional_values, ...], [additional_weights, ...]) - - Weighted average (not compatible with Excel) * - AVERAGEA(value1, [value2, ...]) - `Excel AVERAGEA article `_ * - AVERAGEIF(criteria_range, criterion, [average_range]) - `Excel AVERAGEIF article `_ * - AVERAGEIFS(average_range, criteria_range1, criterion1, [criteria_range2, ...], [criterion2, ...]) - `Excel AVERAGEIFS article `_ + * - AVERAGE.WEIGHTED(values, weights, [additional_values, ...], [additional_weights, ...]) + - Weighted average (not compatible with Excel) * - CORREL(data_y, data_x) - `Excel CORREL article `_ * - COUNT(value1, [value2, ...]) @@ -736,10 +728,10 @@ Statistical - `Excel RANK article `_ * - RSQ(data_y, data_x) - `Excel RSQ article `_ - * - SMALL(data, n) - - `Excel SMALL article `_ * - SLOPE(data_y, data_x) - `Excel SLOPE article `_ + * - SMALL(data, n) + - `Excel SMALL article `_ * - SPEARMAN(data_y, data_x) - Compute the Spearman rank correlation coefficient of a dataset (not compatible with Excel) * - STDEV(value1, [value2, ...]) @@ -771,7 +763,7 @@ Statistical * - VARPA(value1, [value2, ...]) - `Excel VARPA article `_ -.. _functions/text: +.. _spreadsheet/functions/text: Text ==== @@ -822,8 +814,10 @@ Text - `Excel TRIM article `_ * - UPPER(text) - `Excel UPPER article `_ + * - VALUE(text) + - `Excel VALUE article `_ -.. _functions/web: +.. _spreadsheet/functions/web: Web === @@ -836,3 +830,198 @@ Web - Description or link * - HYPERLINK(url, [link_label]) - `Excel HYPERLINK article `_ + +.. _spreadsheet/functions/odoo: + +Odoo-specific functions +======================= + +This section contains functions that interact directly with your Odoo database. + +Array +----- + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - ARRAY.CONSTRAIN(input_range, rows, columns) + - Returns a result array constrained to a specific width and height (not compatible with Excel) + * - FLATTEN(range, [range2, ...]) + - Flattens all the values from one or more ranges into a single column (not compatible with Excel) + +Date +---- + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - MONTH.END(date) + - Last day of the month following a date (not compatible with Excel) + * - MONTH.START(date) + - First day of the month preceding a date (not compatible with Excel) + * - QUARTER(date) + - Quarter of the year a specific date falls in (not compatible with Excel) + * - QUARTER.END(date) + - Last day of the quarter of the year a specific date falls in (not compatible with Excel) + * - QUARTER.START(date) + - First day of the quarter of the year a specific date falls in (not compatible with Excel) + * - YEAR.END(date) + - Last day of the year a specific date falls in (not compatible with Excel) + * - YEAR.START(date) + - First day of the year a specific date falls in (not compatible with Excel) + * - YEARFRAC(start_date, end_date, [day_count_convention]) + - Exact number of years between two dates (not compatible with Excel) + +Financial +--------- + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - ODOO.ACCOUNT.GROUP(type) + - Returns the account ids of a given group (not compatible with Excel) + * - ODOO.CREDIT(account_codes, date_range, [offset], [company_id], [include_unposted]) + - Get the total credit for the specified account(s) and period (not compatible with Excel) + * - ODOO.CURRENCY.RATE(currency_from, currency_to, [date]) + - This function takes in two currency codes as arguments, and returns the exchange rate from -the first currency to the second as float (not compatible with Excel) + * - ODOO.DEBIT(account_codes, date_range, [offset], [company_id], [include_unposted]) + - Get the total debit for the specified account(s) and period (not compatible with Excel) + * - ODOO.BALANCE(account_codes, date_range, [offset], [company_id], [include_unposted]) + - Get the total balance for the specified account(s) and period (not compatible with Excel) + * - ODOO.FISCALYEAR.START(day, [company_id]) + - Returns the starting date of the fiscal year encompassing the provided date (not compatible with Excel) + * - ODOO.FISCALYEAR.END(day, [company_id]) + - Returns the ending date of the fiscal year encompassing the provided date (not compatible with Excel) + * - ODOO.PARTNER.BALANCE(partner_ids, [account_codes], [date_range], [offset], [company_id], [include_unposted]) + - Get the partner balance for the specified account(s) and period (not compatible with Excel) + * - ODOO.RESIDUAL([account_codes], [date_range], [offset], [company_id], [include_unposted]) + - Get the residual amount for the specified account(s) and period (not compatible with Excel) + +Lookup +------ + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - PIVOT(pivot_id, [row_count], [include_total], [include_column_titles], [column_count]) + - Get a pivot table (not compatible with Excel) + * - PIVOT.HEADER(pivot_id, [domain_field_name, ...], [domain_value, ...]) + - Get the header of a pivot table (not compatible with Excel) + * - PIVOT.VALUE(pivot_id, measure_name, [domain_field_name, ...], [domain_value, ...]) + - Get the value from a pivot table (not compatible with Excel) + +Math +---- + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - COUNTUNIQUE(value1, [value2, ...]) + - Counts number of unique values in a range (not compatible with Excel) + * - COUNTUNIQUEIFS(range, criteria_range1, criterion1, [criteria_range2, ...], [criterion2, ...]) + - Counts number of unique values in a range, filtered by a set of criteria (not compatible with Excel) + +Misc +---- + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - FORMAT.LARGE.NUMBER(value, [unit]) + - Apply a large number format (not compatible with Excel) + * - ODOO.LIST(list_id, index, field_name) + - Get the value from a list (not compatible with Excel) + * - ODOO.LIST.HEADER(list_id, field_name) + - Get the header of a list (not compatible with Excel) + +Operators +--------- + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - ADD(value1, value2) + - Sum of two numbers (not compatible with Excel) + * - DIVIDE(dividend, divisor) + - One number divided by another (not compatible with Excel) + * - EQ(value1, value2) + - Equal (not compatible with Excel) + * - GT(value1, value2) + - Strictly greater than (not compatible with Excel) + * - GTE(value1, value2) + - Greater than or equal to (not compatible with Excel) + * - LT(value1, value2) + - Less than (not compatible with Excel) + * - LTE(value1, value2) + - Less than or equal to (not compatible with Excel) + * - MINUS(value1, value2) + - Difference of two numbers (not compatible with Excel) + * - MULTIPLY(factor1, factor2) + - Product of two numbers (not compatible with Excel) + * - NE(value1, value2) + - Not equal (not compatible with Excel) + * - POW(base, exponent) + - A number raised to a power (not compatible with Excel) + * - UMINUS(value) + - A number with the sign reversed (not compatible with Excel) + * - UNARY.PERCENT(percentage) + - Value interpreted as a percentage (not compatible with Excel) + * - UPLUS(value) + - A specified number, unchanged (not compatible with Excel) + +Statistical +----------- + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - AVERAGE.WEIGHTED(values, weights, [additional_values, ...], [additional_weights, ...]) + - Weighted average (not compatible with Excel) + * - GROWTH(known_data_y, [known_data_x], [new_data_x], [b]) + - Fits points to exponential growth trend (not compatible with Excel) + * - MATTHEWS(data_x, data_y) + - Compute the Matthews correlation coefficient of a dataset (not compatible with Excel) + * - POLYFIT.COEFFS(data_y, data_x, order, [intercept]) + - Compute the coefficients of polynomial regression of the dataset (not compatible with Excel) + * - POLYFIT.FORECAST(x, data_y, data_x, order, [intercept]) + - Predict value by computing a polynomial regression of the dataset (not compatible with Excel) + * - SPEARMAN(data_y, data_x) + - Compute the Spearman rank correlation coefficient of a dataset (not compatible with Excel) + * - TREND(known_data_y, [known_data_x], [new_data_x], [b]) + - Fits points to linear trend derived via least-squares (not compatible with Excel) + +Text +---- + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - JOIN(delimiter, value_or_array1, [value_or_array2, ...]) + - Concatenates elements of arrays with delimiter (not compatible with Excel) diff --git a/content/applications/productivity/spreadsheet/global_filters.rst b/content/applications/productivity/spreadsheet/global_filters.rst index 85d127d888..5a0e9d5e46 100644 --- a/content/applications/productivity/spreadsheet/global_filters.rst +++ b/content/applications/productivity/spreadsheet/global_filters.rst @@ -2,202 +2,314 @@ Global filters ============== -.. role:: raw-html(raw) - :format: html +Global filters, represented by the :icon:`os-global-filters` :guilabel:`Filters` icon at the top +right of an Odoo spreadsheet, allow you to apply one or more filters to all the Odoo data that has +been :doc:`inserted in that spreadsheet `. -.. |global-filter| replace:: :raw-html:`` :guilabel:`(global filter)` -.. |drag-handle| replace:: :raw-html:`` :guilabel:`(drag handle)` +These filters are particularly useful for reports and dashboards as users can easily and dynamically +customize the view to answer complex business questions spanning multiple data sources. -Create dynamic views of :doc:`inserted data `, by mapping data source fields to *global -filters* in the Odoo **Spreadsheets** app. +.. tip:: + When a spreadsheet with global filters is added to a dashboard, the filters appear as dropdown + menus at the top of the dashboard. In a spreadsheet, they appear in a pane to the right of the + spreadsheet. + + .. image:: global_filters/dashboard-global-filters.png + :alt: Global filters at the top of a dashboard + +Four types of global filters are available: + +- :ref:`Date `: filters data based on a specific time range, + with the options :guilabel:`Month / Quarter`, :guilabel:`Relative Period`, or :guilabel:`From / + To`. +- :ref:`Relation `: filters data based on a relational + field in a related model, e.g., by :guilabel:`Salesperson` with the *User* model set as the + related model. +- :ref:`Text `: filters data based on a string of text or a + range of predefined values, e.g., a product reference or barcode. +- :ref:`Yes/No `: filters data based on whether or not a + checkbox, or boolean, field is set, e.g., lead is active. + +Unlike the standard :icon:`fa-filter` :guilabel:`(Add filters)` spreadsheet function, which lets you +sort and temporarily hide data, global filters act on the underlying :ref:`data sources +`, filtering data *before* it is loaded into the spreadsheet. + +When a global filter is created, :ref:`field matching ` +for each data source ensures the filter acts on the correct database :doc:`fields +`. -.. note:: - The global filters are represented by the |global-filter| icon, and enable data that was inserted - via a pivot table, list, or chart to be filtered. Global filters differ from the *sort and - filter* feature for cell ranges represented by the :icon:`fa-filter` :guilabel:`(filter)` icon. +.. tip:: + - Global filters work by adding extra conditions to the domains of all the data sources in the + spreadsheet. Therefore, if you intend to use global filters, do not use the same conditions + when configuring the initial list, pivot table, or chart in your database. + - Setting default values, where relevant, ensures that the spreadsheet or dashboard loads quickly + and provides a useful initial view that can be further customized if needed. For example, a + :guilabel:`Date` filter could be set to show data from the last 30 days by default. -.. image:: global_filters/global-filters-menu.png - :align: center - :alt: The global filters menu sidebar on a spreadsheet. +.. _spreadsheet/global-filters/field-matching: -Add filters -=========== +Field matching +============== -Navigate to the :menuselection:`Documents app` and click on the desired spreadsheet, then open the -|global-filter| filter menu. +.. important:: + This process is crucial, as matching the wrong fields, or not setting matching fields at all, + results in global filters that do not show the desired results. -Create a new filter by selecting one of the buttons under the :guilabel:`Add a new filter...` -section: +To function as intended, a global filter needs to act on the correct database fields. Consider +a :guilabel:`Date` filter applied to sales data. As the *Sales Order* model contains several date +fields, it is crucial to determine which field is relevant for the filter, e.g., the order date, the +delivery date, the expected date, or the expiration date. -- :ref:`Date `: filter dates by matching data source date fields to - a time range (e.g., *Month / Quarter*, *Relative Period*, or *From / To*). -- :ref:`Relation `: filter records by matching data source - fields to fields in a related model (e.g., *Lead/Opportunity*, *Sales Order*, or *Event - Registration*). -- :ref:`Text `: filter text by matching data source text fields to a - string of text (e.g., *Restrict values to a range* and/or provide a *Default value*). +When :ref:`creating a global filter `, the :guilabel:`Field +matching` section of the :guilabel:`Filter properties` allows you to determine, for each +:ref:`data source ` in the spreadsheet, which database field the +filter should act on, or match with. -.. note:: - Only filters that are able to be applied to the fields in the data source are shown. +Field matching is further explained in the relevant sections on creating +:ref:`Date `, +:ref:`Relation `, +:ref:`Text `, and +:ref:`Yes/No ` global filters. -.. _spreadsheet/global-filter-date: +.. _spreadsheet/global-filters/create: + +Create global filters +===================== + +Open the desired spreadsheet from the **Odoo Documents** app or via the **Odoo Dashboards** app if +you are adding filters to a dashboard. + +.. tip:: + To access the underlying spreadsheet of a dashboard, with the **Dashboards** app open, + :ref:`activate developer mode `, then click the :icon:`fa-pencil` + :guilabel:`(Edit)` icon that appears when hovering over the dashboard name. + +To add a new filter, click :icon:`os-global-filters` :guilabel:`Filters`, then, under :guilabel:`Add +a new filter...`, click :guilabel:`Date`, :guilabel:`Relation`, :guilabel:`Text`, or +:guilabel:`Yes/No` as appropriate. The :guilabel:`Filter properties` pane opens. + +When saving a global filter, if any required information is missing or if any information provided +in the :ref:`Field matching ` section is not appropriate, +an error is shown stating :guilabel:`Some required fields are not valid`. + +.. _spreadsheet/global-filters/create-date: Date ---- -The *Date* global filter enables the filtering of data sources by a specific time range, to -automatically filter on the current period, or to offset the time range relative to the period. +.. note:: + A :guilabel:`Date` filter can only match with a :ref:`Date ` + or :ref:`Date & Time ` field. + +With the :guilabel:`Filter properties` pane open: -With the |global-filter| menu open, select the :guilabel:`Date` button to create a new date filter. -The :guilabel:`Filter properties` menu displays the following fields for configuration below. +#. Enter a name for the new date filter in the :guilabel:`Label` field. +#. From the :guilabel:`Time range` dropdown menu, select one of the following: -First, enter a name for the new date filter in the :guilabel:`Label` field. + - :guilabel:`Month / Quarter`: enables a dropdown menu of specific months and/or quarters and a + year selector for the year. The values :guilabel:`Months` and :guilabel:`Quarters` are enabled + by default. Disabling both of these values allows filtering by year only. -Then, select one of the three period options in the :guilabel:`Time range` field: + To set a :guilabel:`Default value`, enable + :guilabel:`Automatically filter on the current period` and choose whether to filter on the + current :guilabel:`Month`, :guilabel:`Quarter` or :guilabel:`Year`. -- :guilabel:`Month / Quarter`: enables a drop-down menu of specific months and quarters of a year - (i.e., *Q1*, *Q2*, *January*, etc.). -- :guilabel:`Relative Period`: enables a drop-down menu of specific moving time frames (i.e., *Year - to Date*, *Last 7 Days*, *Last 30 Days*, etc.). -- :guilabel:`From / To`: enables *Date from...* and *Date to...* date selection fields to define a - specific time range (e.g., `06/05/2024` to `06/27/2024`). + - :guilabel:`Relative Period`: enables a dropdown menu of specific time ranges relative to the + current date (e.g., :guilabel:`Year to Date`, :guilabel:`Last 7 Days`, + :guilabel:`Last 30 Days`, etc.). -Optionally, set a :guilabel:`Default value` for the :guilabel:`Time range`. + To set a :guilabel:`Default value`, select one of the available values. -.. note:: - The :guilabel:`Default value` field only appears for :guilabel:`Month / Quarter` or - :guilabel:`Relative Period` ranges. + - :guilabel:`From / To`: enables :guilabel:`Date from...` and :guilabel:`Date to...` date + selection fields to define a specific time range (e.g., `06/05/2024` to `06/27/2024`). - If the :guilabel:`Month / Quarter` range is selected, tick the :guilabel:`Automatically filter on - the current period` checkbox to define the default period of either :guilabel:`Month`, - :guilabel:`Quarter`, or :guilabel:`Year`. +#. In the :guilabel:`Field matching` section, for each data source, click beside :guilabel:`Date + field` and select the field the filter should match with. -Next, configure the :guilabel:`Field matching` for each data source. To do so, expand the section by -clicking on the :guilabel:`Field matching` heading, to reveal a list of the data sources in the -spreadsheet where each data source has two fields for matching: + The :guilabel:`Period offset` option, which appears when a date field is chosen, enables + comparisons to be made by shifting the time range by one or more periods in the past or future. + By default, no period offset is defined. To define a period offset, select :guilabel:`Previous` + or :guilabel:`Next`, then select the desired number of periods in the past or future. -- :guilabel:`Date field`: select a date field from the data source model to apply the time range to. -- :guilabel:`Period offset`: (optionally) select an offset that shifts the time range by a relative - period. + .. tip:: - The options available are: :guilabel:`Previous`, :guilabel:`Before Previous`, :guilabel:`Next`, - :guilabel:`After Next`. + To compare data effectively using the :guilabel:`Period offset` feature, :ref:`duplicate the + relevant inserted list ` or :ref:`pivot table + `, then, when setting up field matching, set a + period offset for the second data source but not the first. -Lastly, once all the information is entered on the form, click the :guilabel:`Save` button. If any -of the data source fields do not match the data type of *date* (or *datetime*), an error is shown -stating :guilabel:`Some required fields are not valid`. + When applying the filter, the original list or pivot table shows data for the time range + selected, while the second shows data for a period before or after that time range, as + defined. + +#. Click :guilabel:`Save`. .. example:: - Consider a :guilabel:`Period offset` of :guilabel:`Next` when using the :guilabel:`Month / - Quarter` range to apply the filter to the *next* period relative to the set time range. + In the example below, a :guilabel:`Date` global filter has been created to allow the pivot table + and chart to show sales data per quarter. If only a year is selected, data is shown for the + entire year. + + .. image:: global_filters/example-date.png + :alt: A date filter to filter on quarter and year - With this configuration, selecting `January` `2024` as the date, filters data as `February` - `2024`; where the selected month is offset to the next month. + In the :guilabel:`Field matching` section of the :guilabel:`Filter properties`, the field + :guilabel:`Order Date` has been selected as the matching date field. A matching date field is not + needed for *List #1* as we will not use this filter on the data source in question. - .. image:: global_filters/date-period-offset.png - :align: center - :alt: A date filter with a period offset of "Next" configured. + .. image:: global_filters/field-matching-date.png + :alt: A date filter with the Order Date selected as the matching field + :scale: 80% -.. _spreadsheet/global-filter-relation: +.. _spreadsheet/global-filters/create-relation: Relation -------- -The *Relation* global filter enables the filtering of records in data sources by selecting a field -from a related model. - -With the |global-filter| menu open, select the :guilabel:`Relation` button to create a new relation -filter. The :guilabel:`Filter properties` menu displays the following fields for configuration. +.. note:: + A :guilabel:`Relation` filter can only match with a :ref:`Many2One + `, :ref:`One2Many + `, or :ref:`Many2Many + ` field. -First, enter a name for the new relation filter in the :guilabel:`Label` field. +With the :guilabel:`Filter properties` pane open: -Then, select or search for a model from the :guilabel:`Related model` field. +#. Enter a name for the new relation filter in the :guilabel:`Label` field. -Once a model is selected, the :guilabel:`Default value` and :guilabel:`Field matching` fields -appear. +#. In the :guilabel:`Related model` field, start typing the model name to reveal a list of all + models, then select the appropriate one. Once a model is selected, the + :guilabel:`Default value` and :guilabel:`Possible values` fields appear, as well as the + :guilabel:`Field matching` section. -Optionally, set a :guilabel:`Default value` for the :guilabel:`Related model`. The available options -are records of the model. +#. To set a :guilabel:`Default value`, select one of the available values; these are records from + the model. If the related model is the *User* model, the option :guilabel:`Automatically filter + on the current user` can be enabled. -Next, configure the :guilabel:`Field matching` for each data source. To do so, expand the section by -clicking on the :guilabel:`Field matching` heading, to reveal a list of the data sources in the -spreadsheet where each data source has a field for matching. +#. To limit the values that can be shown, enable :guilabel:`Restrict values with a domain`, then + click :ref:`Edit domain ` to add or edit rules. -Select a field from the data source model from which to apply the relation filter. +#. In the :guilabel:`Field matching` section, check if the correct matching field has been + assigned for each data source. If this is not the case, click below the data source name to + select the correct field. -Lastly, once all the information is entered on the form, click the :guilabel:`Save` button. If any -of the data source fields do not match the data type of the related model, an error is shown -stating :guilabel:`Some required fields are not valid`. +#. Click :guilabel:`Save`. .. example:: - Consider a *Relation* filter with the :guilabel:`Related model` set as :guilabel:`Contact`. The - :guilabel:`Field matching` *CRM* lead (`crm.lead`) pivot data sources are set to - :guilabel:`Customer`. + In the example below, a :guilabel:`Relation` filter has been created to allow the pivot table + and chart to show sales data related to selected salespeople only. The *User* model was set as + the :guilabel:`Related model`. + + .. image:: global_filters/example-relation.png + :alt: Relation filter set on a pivot table - With this configuration, selecting a customer record filters the pivot table to only leads that - are related to the selected customer record. + In the :guilabel:`Field matching` section of the :guilabel:`Filter properties`, the field + :guilabel:`Salesperson` was automatically assigned as the matching field for both the pivot table + and the chart. A matching field is not needed for *List #1* as we will not use this filter on the + data source in question. - .. image:: global_filters/relation-contact.png - :align: center - :alt: A relation filter with the Contact model configured. + .. image:: global_filters/field-matching-relation.png + :alt: A relation filter with the User model configured + :scale: 80% -.. _spreadsheet/global-filter-text: +.. _spreadsheet/global-filters/create-text: Text ---- -The *Text* global filter enables the filtering of text by matching data source text fields to a -string of text or to a range of predefined values. +.. note:: + A :guilabel:`Text` filter can only match with a :ref:`Text + ` (char), :ref:`Integer `, + or :ref:`Decimal ` (float) field. + +With the :guilabel:`Filter properties` pane open: + +#. Enter a name for the new text filter in the :guilabel:`Label` field. +#. Optionally, enable :guilabel:`Restrict values to a range`. Doing so allows you to input a + spreadsheet range either by typing the range or selecting it from within the spreadsheet. +#. Optionally, enter a :guilabel:`Default value`. +#. In the :guilabel:`Field matching` section, for each data source click below the data source name + and select the field the :guilabel:`Text` filter should match with. + +#. Click :guilabel:`Save`. + +.. example:: + In the example below, a :guilabel:`Text` global filter was created to allow the user to select a + product from the :guilabel:`Product` filter and have both the pivot table and chart only show + sales data related to that specific product. -With the |global-filter| menu open, select the :guilabel:`Text` button to create a new text filter. -The :guilabel:`Filter properties` menu displays the following fields for configuration. + .. image:: global_filters/example-text.png + :alt: Global filters set on a pivot table -First, enter a name for the new text filter in the :guilabel:`Label` field. + In the :guilabel:`Filter properties`, the :guilabel:`Possible values` of the filter were + restricted to the range `Products (List #1)'!A2:A34`. This corresponds to the range + containing the :guilabel:`Display name` of the product on a list inserted in the spreadsheet. -Then, choose whether or not to :guilabel:`Restrict values to a range` by ticking the checkbox. Doing -so, reveals a field to input a range within the spreadsheet. Either type in or select the range. + .. image:: global_filters/field-matching-text.png + :alt: A text filter with a restricted range + :scale: 80% -Next, configure the :guilabel:`Field matching` for each data source. To do so, expand the section by -clicking on the :guilabel:`Field matching` heading, to reveal a list of the data sources in the -spreadsheet where each data source has a field for matching. + With this configuration, the pivot table and chart can be filtered by product name by + selecting one of the predefined values available in the text filter. In the example, + :guilabel:`Furniture` has already been selected as the :guilabel:`Product category`, meaning + that only products of this category can be selected as possible values. -Select a field from the data source model from which to apply the text filter. + Furthermore, if the values in the range have been retrieved dynamically from the database, as in + this case, the text filter is also dynamic, i.e., will reflect changes made to those values. -Lastly, once all the information is entered on the form, click the :guilabel:`Save` button. If any -of the data source fields do not match the data type of the related model, an error is shown -stating :guilabel:`Some required fields are not valid`. +.. _spreadsheet/global-filters/create-checkbox: + +Yes/No +------ + +.. note:: + A :guilabel:`Yes/No` filter can only match with a :ref:`Checkbox + ` (boolean) field. + +With the :guilabel:`Filter properties` pane open: + +#. Enter a name for the new :guilabel:`Yes/No` filter in the :guilabel:`Label` field. +#. Optionally, select :guilabel:`Is set` or :guilabel:`Is not set` as the :guilabel:`Default value`. +#. In the :guilabel:`Field matching` section, for each data source, click below the data source name + and select the field the :guilabel:`Yes/No` filter should match with. +#. Click :guilabel:`Save`. .. example:: - Consider a text filter with the range `A2:A6` added to the :guilabel:`Restrict values to a range` - field. The spreadsheet has five different product names listed as values in the cells of column - `A`, rows `2` though `6`. + In the example below, a :guilabel:`Yes/No` global filter was created to allow the user to see + all opportunities that are active, i.e., for which the :guilabel:`Active` checkbox is enabled + on the record, or all opportunities that are inactive, i.e., for which the :guilabel:`Active` + checkbox is disabled. Leaving the filter empty shows both active and inactive opportunities. - With the above configuration, a pivot table of products can be filtered by product name by - selecting one of the 5 predefined values available in the text filter. + .. image:: global_filters/example-checkbox.png + :alt: Global filters set on a pivot table - Furthermore, if the values in the range `A2:A6` are added dynamically– the text filter becomes - dynamic as well. + In the :guilabel:`Field matching` section of the :guilabel:`Filter properties`, the field + :guilabel:`Active` was assigned as the matching field for the pivot table. - .. image:: global_filters/text-values.png - :align: center - :alt: A dynamic text filter with a restricted range. + .. image:: global_filters/field-matching-checkbox.png + :alt: A yes/no filter with the Active field set as matching field -Manage filters -============== +.. _spreadsheet/global-filters/manage: -Open the |global-filter| filter menu by navigating to the :menuselection:`Documents app` and -clicking on the desired spreadsheet. +Manage and use global filters +============================= -Existing global filters appear under the :guilabel:`Filters` section. Filters can be used -individually, or at the same time. +Click the :icon:`os-global-filters` :guilabel:`Filters` icon at the top right of an Odoo spreadsheet +to access the global filters that have been created for that spreadsheet. -.. tip:: - The order of existing filters can be changed by hovering over a filter and using the - |drag-handle| icon to change the position. +It is possible to: + +- **Apply one or more global filters** by selecting appropriate values per filter, as relevant. -To reset a filter with set values back to default, click on the :icon:`fa-times` (clear) icon next -to the value in the filter. + .. tip:: + Reloading the browser will cause any global filters to reset to their initial state or default + value, as relevant. To refresh data in an inserted list, pivot table, or chart without losing + global filters that have been applied, click :menuselection:`Data -->` :icon:`os-refresh-data` + :menuselection:`Refresh all data` from the menu bar. -To edit an existing filter, select the :icon:`fa-cog` :guilabel:`(gear)` icon to open the filter's -:guilabel:`Filter properties` menu. From here, edits can be made or the filter can be deleted by -clicking the :guilabel:`Remove` button. +- **Change the order** of existing filters by hovering over a filter and using the + :icon:`os-thin-drag-handle` :guilabel:`(drag handle)` icon to change the position. +- **Clear filter values** (whether default or selected values) by clicking the :icon:`fa-times` + :guilabel:`(Clear)` icon next to the value in the filter. +- **Edit an existing filter** by selecting the :icon:`fa-cog` :guilabel:`(Edit)` icon to open the + filter's :guilabel:`Filter properties` then editing as needed. +- **Delete an existing filter** by selecting the :icon:`fa-cog` :guilabel:`(Edit)` icon to open the + filter's :guilabel:`Filter properties` then clicking :guilabel:`Remove`. diff --git a/content/applications/productivity/spreadsheet/global_filters/dashboard-global-filters.png b/content/applications/productivity/spreadsheet/global_filters/dashboard-global-filters.png new file mode 100644 index 0000000000..5d9b304782 Binary files /dev/null and b/content/applications/productivity/spreadsheet/global_filters/dashboard-global-filters.png differ diff --git a/content/applications/productivity/spreadsheet/global_filters/date-period-offset.png b/content/applications/productivity/spreadsheet/global_filters/date-period-offset.png deleted file mode 100644 index 4338694b71..0000000000 Binary files a/content/applications/productivity/spreadsheet/global_filters/date-period-offset.png and /dev/null differ diff --git a/content/applications/productivity/spreadsheet/global_filters/example-checkbox.png b/content/applications/productivity/spreadsheet/global_filters/example-checkbox.png new file mode 100644 index 0000000000..686577f93b Binary files /dev/null and b/content/applications/productivity/spreadsheet/global_filters/example-checkbox.png differ diff --git a/content/applications/productivity/spreadsheet/global_filters/example-date.png b/content/applications/productivity/spreadsheet/global_filters/example-date.png new file mode 100644 index 0000000000..53b46ab9a2 Binary files /dev/null and b/content/applications/productivity/spreadsheet/global_filters/example-date.png differ diff --git a/content/applications/productivity/spreadsheet/global_filters/example-relation.png b/content/applications/productivity/spreadsheet/global_filters/example-relation.png new file mode 100644 index 0000000000..854fa682fe Binary files /dev/null and b/content/applications/productivity/spreadsheet/global_filters/example-relation.png differ diff --git a/content/applications/productivity/spreadsheet/global_filters/example-text.png b/content/applications/productivity/spreadsheet/global_filters/example-text.png new file mode 100644 index 0000000000..8077944da3 Binary files /dev/null and b/content/applications/productivity/spreadsheet/global_filters/example-text.png differ diff --git a/content/applications/productivity/spreadsheet/global_filters/field-matching-checkbox.png b/content/applications/productivity/spreadsheet/global_filters/field-matching-checkbox.png new file mode 100644 index 0000000000..42d3a0148f Binary files /dev/null and b/content/applications/productivity/spreadsheet/global_filters/field-matching-checkbox.png differ diff --git a/content/applications/productivity/spreadsheet/global_filters/field-matching-date.png b/content/applications/productivity/spreadsheet/global_filters/field-matching-date.png new file mode 100644 index 0000000000..7b7a6ee7ca Binary files /dev/null and b/content/applications/productivity/spreadsheet/global_filters/field-matching-date.png differ diff --git a/content/applications/productivity/spreadsheet/global_filters/field-matching-relation.png b/content/applications/productivity/spreadsheet/global_filters/field-matching-relation.png new file mode 100644 index 0000000000..170426892e Binary files /dev/null and b/content/applications/productivity/spreadsheet/global_filters/field-matching-relation.png differ diff --git a/content/applications/productivity/spreadsheet/global_filters/field-matching-text.png b/content/applications/productivity/spreadsheet/global_filters/field-matching-text.png new file mode 100644 index 0000000000..f2d7e0a380 Binary files /dev/null and b/content/applications/productivity/spreadsheet/global_filters/field-matching-text.png differ diff --git a/content/applications/productivity/spreadsheet/global_filters/global-filters-menu.png b/content/applications/productivity/spreadsheet/global_filters/global-filters-menu.png deleted file mode 100644 index a6e78e9bc7..0000000000 Binary files a/content/applications/productivity/spreadsheet/global_filters/global-filters-menu.png and /dev/null differ diff --git a/content/applications/productivity/spreadsheet/global_filters/pivot-table-global-filters.png b/content/applications/productivity/spreadsheet/global_filters/pivot-table-global-filters.png new file mode 100644 index 0000000000..2de4520e37 Binary files /dev/null and b/content/applications/productivity/spreadsheet/global_filters/pivot-table-global-filters.png differ diff --git a/content/applications/productivity/spreadsheet/global_filters/relation-contact.png b/content/applications/productivity/spreadsheet/global_filters/relation-contact.png deleted file mode 100644 index 10cb205ff6..0000000000 Binary files a/content/applications/productivity/spreadsheet/global_filters/relation-contact.png and /dev/null differ diff --git a/content/applications/productivity/spreadsheet/global_filters/text-values.png b/content/applications/productivity/spreadsheet/global_filters/text-values.png deleted file mode 100644 index 153f068258..0000000000 Binary files a/content/applications/productivity/spreadsheet/global_filters/text-values.png and /dev/null differ diff --git a/content/applications/productivity/spreadsheet/insert.rst b/content/applications/productivity/spreadsheet/insert.rst index 3e7a3138bd..be58d6cefc 100644 --- a/content/applications/productivity/spreadsheet/insert.rst +++ b/content/applications/productivity/spreadsheet/insert.rst @@ -1,58 +1,915 @@ -============== -Link Odoo data -============== +============================ +Insert and link to Odoo data +============================ + +Several elements from your Odoo database can be inserted into an Odoo spreadsheet, namely: + +- lists, i.e., data from a :ref:`list view ` +- pivot tables, i.e., data from a :ref:`pivot view ` +- charts, i.e., data from a :ref:`graph view ` + +.. note:: + Lists, pivot tables, and charts from different apps and models can be inserted into the same + spreadsheet. + +Each time a list, pivot table, or chart is inserted, a :ref:`data source +` is created. This data source connects the spreadsheet to your +Odoo database, retrieving up-to-date information every time the spreadsheet is opened, the browser +page is reloaded, or data is manually refreshed by clicking :menuselection:`Data -->` +:icon:`os-refresh-data` :menuselection:`Refresh all data` from the menu bar. + +:ref:`Inserted lists ` and :ref:`inserted pivot tables +` use formulas with Odoo-specific :ref:`list functions +` and :ref:`pivot table functions +` to retrieve data from your database and can be +further manipulated in the spreadsheet. Certain elements of :ref:`inserted charts +` can be modified, but no data manipulation or computation is possible. -You can insert and link several elements from your database in your spreadsheets, namely: +.. tip:: + If you intend to use :doc:`global filters ` to dynamically filter Odoo data in + a spreadsheet or dashboard, do not use the same conditions to establish the initial list, pivot + table, or chart in your database. -- pivots, -- graphs, -- lists, and -- links to menus (i.e., a clickable link to a view of a specific model). +It is also possible to: -Before inserting :ref:`pivots `, :ref:`graphs `, or -lists, ensure they are tailored to your needs, as some elements are more quickly - or only - -configurable in their respective view. +- :ref:`add clickable links ` to Odoo menu items, to other + sheets of the same spreadsheet, or to external URLs +- :ref:`insert financial data ` from your Odoo database using + Odoo-specific spreadsheet :doc:`functions ` +- paste data from another Odoo spreadsheet, Excel spreadsheet, or Google Sheet directly into any + Odoo spreadsheet -- To insert pivots and graphs, click :guilabel:`Insert in spreadsheet` from any pivot or graph view. -- To insert lists, click :menuselection:`Favorites --> Insert list in spreadsheet` from any list - view. -- To insert links to menus, click :menuselection:`Favorites --> Link menu in spreadsheet` from any - view. +.. _spreadsheet/insert/data-sources: -In the pop-up box, either create a new spreadsheet by selecting :guilabel:`Blank spreadsheet` or -insert it in an existing one by selecting it and clicking :guilabel:`Confirm`. +Data sources +============ -.. image:: insert/insert-spreadsheet.png - :align: center - :alt: Inserting a pivot in a spreadsheet +Data sources, which are created each time a :ref:`list `, :ref:`pivot table +`, or :ref:`chart ` is inserted into an +Odoo spreadsheet, connect the spreadsheet and the relevant :doc:`model +<../../studio/models_modules_apps>` in your database, ensuring the data stays up-to-date and +allowing you to :ref:`access the underlying data `. + +Each data source is defined by properties that can be accessed via the :guilabel:`Data` menu. Data +sources are identified by their respective :icon:`oi-view-pivot` :guilabel:`(pivot table)`, +:icon:`oi-view-list` :guilabel:`(list)` or :icon:`fa-bar-chart` :guilabel:`(chart)` icon, followed +by their ID and name, e.g., :icon:`oi-view-pivot` *(#1) Sales Analysis by Product*. + +.. image:: insert/data-menu.png + :alt: Data sources listed in Data menu + +Clicking on a data source opens the related properties in a pane on the right of the spreadsheet. + +.. tip:: + - The properties pane can also be opened by right-clicking any cell of an inserted list or pivot + table, then clicking :icon:`oi-view-list` :guilabel:`See list properties` or + :icon:`oi-view-pivot` :guilabel:`See pivot properties`, or by clicking the :icon:`fa-bars` + :guilabel:`(menu)` icon at the top right of an inserted chart, then clicking + :icon:`fa-pencil-square-o` :guilabel:`Edit`. + - Once the properties of a specific data source are open, they remain open even when navigating + between spreadsheet tabs. To close the properties pane, click the :icon:`fa-times` + :guilabel:`(close)` icon at the top right of the pane. .. note:: - By default, new spreadsheets are saved under the :guilabel:`Spreadsheet` workspace of the - Documents app. + Deleting an inserted list or pivot table, or deleting the sheet into which it was inserted, does + not delete the underlying data source. The data source of an inserted list or pivot table can + only be deleted via the data source's properties. + + A warning in the :guilabel:`Data` menu identifies any data sources for which the corresponding + list or pivot table no longer appears in the spreadsheet. + + .. image:: insert/list-deleted.png + :alt: Warning message about unused list + + Deleting an inserted chart, on the other hand, also deletes the underlying data source. + +.. _spreadsheet/insert/accessing-data: -.. _insert/update: +Accessing underlying data +------------------------- -Updating data +The underlying data of an inserted list, pivot table, or chart can be accessed at any time. To view: + +- an individual record of an **inserted list**, right-click any cell of the relevant row, then + select :icon:`fa-eye` :guilabel:`See record` +- a list of records referenced by an individual cell of an **inserted pivot table**, right-click the + cell, then select :icon:`fa-eye` :guilabel:`See records` +- a list of records represented by a data point of an **inserted chart**, click the data point. + +.. tip:: + Use the middle mouse button or `Ctrl` + left-click (Microsoft/Linux), or `Command` + left-click + (Mac OS) to open the results in a new browser tab. + +To return to the spreadsheet after viewing the underlying data, click the name of the spreadsheet in +the breadcrumbs at the top of the page. + +.. _spreadsheet/insert/list: + +Insert a list ============= -Once inserted in a spreadsheet, your data is kept up-to-date, reflecting any changes made to your -database. Reopening the spreadsheet reloads the linked data. +.. important:: + Before inserting a list in a spreadsheet, ensure the list is tailored to your needs. Consider + which fields should be visible as well as how the records are filtered and/or sorted. This can + impact both the loading time and the user-friendliness of your spreadsheet. + +To insert a list: + +#. With the relevant list view open in your database, click the :icon:`fa-cog` + :guilabel:`(Actions)` icon beside the name of the view, then :menuselection:`Spreadsheet -->` + :icon:`oi-view-list` :menuselection:`Insert list in spreadsheet`. + + .. note:: + To insert only specific records, select the relevant records, click the :icon:`fa-cog` + :guilabel:`Actions` button that appears at the top center of the screen, then + :icon:`oi-view-list` :guilabel:`Insert in spreadsheet`. + +#. In the window that opens, edit the :guilabel:`Name of the list` if needed. + + The list name is used in the sheet name and in the :ref:`list properties + `. + + .. image:: insert/insert-list.png + :alt: Inserting a list in a spreadsheet + +#. Edit the number of records, i.e., rows, to be inserted if needed. + + By default, the number shown is the number of records visible on the first page of the list. For + example, if the list contains 150 records but only 80 are visible, this field will show 80. + + .. note:: + While the data in your list is kept up to date thanks to the connection to your database, an + inserted list will not automatically expand to accommodate new records, e.g., a new product + category or a new salesperson. + + If you anticipate new records being added, consider adding extra rows when inserting the list. + Records/rows can also be :ref:`added manually ` after the + spreadsheet has been inserted. + + .. example:: + Your company currently has ten product categories and you insert this list in a + spreadsheet. If an 11th product category is created and your inserted list only had ten + rows, the new category will be inserted in the appropriate position in the spreadsheet, + thereby removing an existing category. + + One way to avoid this is to :ref:`add extra rows ` + when inserting the list. + +#. Click :guilabel:`Blank spreadsheet` to create a new spreadsheet, or select in which existing + spreadsheet the list should be inserted. + + .. note:: + When inserting a list into a new spreadsheet, the spreadsheet is saved in the **Odoo + Documents** app in the :icon:`fa-hdd-o` :guilabel:`My Drive` personal folder. + +#. Click :guilabel:`Confirm`. + +The list is inserted into a new sheet in the spreadsheet. The sheet tab in the bottom bar shows the +name of the list followed by the list ID, e.g., *Quotations by Total (List #1)*. A pane on the right +side of the screen shows the :ref:`list properties `. + +.. tip:: + - To sever the link between an inserted list and your database, select the entire list, + right-click and select :icon:`fa-clipboard` :guilabel:`Copy` then right-click again and select + :menuselection:`Paste special --> Paste as value`. + - Do not modify the list ID in the sheet name, as the inserted list retains this ID for the + lifetime of the spreadsheet. This list ID is used in the :ref:`spreadsheet functions + ` that retrieve data from your database. + +.. _spreadsheet/insert/list-functions: + +List functions +-------------- + +When a list is inserted into a spreadsheet, the following :doc:`functions ` are used to +retrieve the header and field values, respectively: + +.. code-block:: text + + =ODOO.LIST.HEADER(list_id, field_name) + =ODOO.LIST(list_id, index, field_name) + +The arguments of the function are as follows: + +- `list_id`: the ID assigned when the list is inserted. The first list inserted into a spreadsheet + is assigned list ID `1`, the second, list ID `2`, etc. +- `index`: identifies the line on which the record appeared in the list before insertion. The + first line has an index of `1`, the second an index of `2`, etc. +- `field_name`: the technical name of the field. + +.. tip:: + Clicking on an individual cell displays the related formula, if relevant, in the formula bar. To + display all the formulas of a spreadsheet at the same time, click :menuselection:`View -->` + :icon:`fa-eye` :menuselection:`Show --> Formulas` on the menu bar. The example below shows the + functions used to retrieve list headers and values. + + .. image:: insert/list-formulas.png + :alt: Viewing formulas of spreadsheet cells + +.. _spreadsheet/insert/list-properties: + +List properties +--------------- + +The list properties appear on the right side of the screen when a list is inserted. They can be +accessed at any time via the :guilabel:`Data` menu by clicking the relevant list, as prefaced by +the :icon:`oi-view-list` :guilabel:`(list)` icon, or by right-clicking anywhere on the list and +clicking :icon:`oi-view-list` :guilabel:`See list properties`. + +The following list properties are shown, some of which can be edited: + +- :guilabel:`List #`: the list ID. List IDs are assigned sequentially as additional lists are + inserted into the spreadsheet. +- :guilabel:`List Name`: the name of the list. Edit this if needed. Note that editing the list name + in the list properties does not modify the list name shown in the sheet name, and vice versa. +- :guilabel:`Model`: the model from which the data has been extracted. +- :guilabel:`Columns`: the fields of the model that were visible when the list was inserted. +- :guilabel:`Domain`: the rules used to determine which records are shown. Click + :ref:`Edit domain ` to add or edit rules. + + .. note:: + When :doc:`global filters ` are used, this domain is combined with the selected + values of the global filter before the data is loaded into the spreadsheet. + +- :guilabel:`Sorting`: how the data is sorted, if applicable. To add a sorting rule, click + :guilabel:`Add`, select the field, then choose whether sorting should be :guilabel:`Ascending` or + :guilabel:`Descending`. Delete a sorting rule by clicking the :icon:`fa-times` + :guilabel:`(delete)` icon. + +To :ref:`duplicate ` or :ref:`delete +` a list's data source, click the :icon:`fa-cog` :guilabel:`(gear)` +icon, then click :icon:`fa-clone` :guilabel:`Duplicate` or :icon:`fa-trash` :guilabel:`Delete` as +relevant. + +.. _spreadsheet/insert/list-manage: + +Manage an inserted list +----------------------- + +After a list from an Odoo database has been inserted into an Odoo spreadsheet, you can: + +- :ref:`add records `, i.e., rows +- :ref:`add fields `, i.e., columns +- :ref:`duplicate the list ` to create a new, identical data + source +- :ref:`delete the list and its underlying data source ` + +.. _spreadsheet/insert/list-add-records: + +Add records/rows to a list +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To add records to a list, use one of the following methods: + +- Select the last row of the table, then hover over the blue square until the plus icon appears. + Click and drag down to add the desired number of rows. The cells of the new rows are populated + with the :ref:`appropriate formula ` to retrieve the list + values. If there is corresponding data in your database, the cells are populated. + + .. image:: insert/list-add-records.png + :alt: Add records by dragging the cell down + +- Position your cursor in the top left cell of the sheet, click :menuselection:`Data --> Re-insert + list` from the menu bar, then select the appropriate list. In the pop-up window, indicate the + number of records to insert and click :guilabel:`Confirm`. An updated list is inserted, + overwriting the previous list. + +.. tip:: + The above methods can also be used to add additional blank rows to your spreadsheet table. This + may be useful for lists where you expect additional records to be generated in your database, + e.g., new product categories or new salespersons. + +.. _spreadsheet/insert/list-add-fields: + +Add fields/columns to a list +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To add fields/columns to a list: + +#. Select the column to the right or left of where the new column should be inserted. +#. Click :menuselection:`Insert -->` :icon:`os-insert-col` :menuselection:`Insert column` then + :icon:`os-insert-col-before` :menuselection:`Column left` or :icon:`os-insert-col-after` + :menuselection:`Column right` from the menu bar, or right-click then :icon:`os-insert-col-before` + :guilabel:`Insert column left` or :icon:`os-insert-col-after` :guilabel:`Insert column right` as + appropriate. +#. Copy the header cell of any column, paste it into the header cell of the new column, and press + `Enter`. +#. Double-click the new header cell then click on the field name that appears in quotation marks at + the end of the formula; a list of all the technical names of the fields of the related model + appears. + + .. image:: insert/list-add-columns.png + :alt: Add fields/columns by editing the formula + +#. Select the appropriate field name and press `Enter`. The field's label appears in the header. + + .. tip:: + To know a field's technical name, navigate to the relevant view, :ref:`activate developer mode + `, then check the field name by hovering over the question mark beside a + field's label. + +#. With the header cell selected, double-click on the blue square in the bottom-right corner. The + cells of the column are populated with the appropriate formula to retrieve the list values. If + there is corresponding data in your database, the cells are populated. + +.. _spreadsheet/insert/list-duplicate: + +Duplicate a list +~~~~~~~~~~~~~~~~ + +Duplicating a list via the list's properties creates an additional data source. This allows for +different manipulations to be performed on the same data within one spreadsheet. + +With the :ref:`list properties ` open, click the :icon:`fa-cog` +:guilabel:`(gear)` icon then :icon:`fa-clone` :guilabel:`Duplicate`. + +The new data source is assigned the next available list ID. For example, if no other lists have been +inserted in the meantime, duplicating *List #1* results in the creation of *List #2*. + +Unlike when you insert a list, a duplicated list is not automatically inserted into the spreadsheet. +To insert it, perform the following steps: + +#. Add a new sheet by clicking the :icon:`os-plus` :guilabel:`(add sheet)` icon at the bottom left + of the spreadsheet. +#. Click :menuselection:`Data --> Re-insert list` from the menu bar, then select the appropriate + list. +#. Define the number of records to insert and click :guilabel:`Confirm`. +#. Edit the :guilabel:`List Name` in the properties pane if needed. +#. Rename the sheet by right-clicking on the sheet tab, selecting :guilabel:`Rename`, and entering + the new sheet name. + +.. note:: + Duplicating an inserted list by copying and pasting it or by duplicating the sheet into which it + has been inserted does not create a new data source. Any changes made to the list's properties + would therefore impact any copies of the list. + +.. _spreadsheet/insert/list-delete: + +Delete a list +~~~~~~~~~~~~~ + +To fully delete a list and the underlying data source from a spreadsheet, perform the following +steps in any order: + +- Delete the spreadsheet table using your preferred means, e.g., via keyboard commands, spreadsheet + menus, or by deleting the sheet. This deletes the visual representation of the data. +- From the :ref:`properties pane ` of the relevant list, click + the :icon:`fa-cog` :guilabel:`(gear)` icon then :icon:`fa-trash` :guilabel:`Delete`. This deletes + the data source of the list from the spreadsheet. + +.. _spreadsheet/insert/pivot-table: + +Insert a pivot table +==================== + +.. tip:: + Converting an inserted pivot table to a :doc:`dynamic pivot table ` allows + you to add, remove, and manipulate dimensions (i.e., columns and rows) and measures. It is + therefore possible to insert a basic pivot table with minimal configuration, convert it to a + dynamic pivot table, then refine it directly in the spreadsheet. + +To insert a pivot table: + +#. With the relevant pivot view open in your database, click :guilabel:`Insert in Spreadsheet`. +#. In the window that opens, edit the :guilabel:`Name of the pivot` if needed. + + This name is used in the sheet name and in the :ref:`pivot table properties + `. + + .. image:: insert/insert-pivot-table.png + :alt: Inserting a pivot table in a spreadsheet + +#. Click :guilabel:`Blank spreadsheet` to create a new spreadsheet, or select in which existing + spreadsheet the pivot table should be inserted. + + .. note:: + When inserting a pivot table into a new spreadsheet, the spreadsheet is saved in the **Odoo + Documents** app in the :icon:`fa-hdd-o` :guilabel:`My Drive` personal folder. + +#. Click :guilabel:`Confirm`. + +The pivot table is inserted into a new sheet in the spreadsheet. The sheet tab in the bottom bar +shows the name of the pivot table followed by the pivot table ID, e.g., *Sales Analysis by Sales +Team (Pivot #1)*. A pane on the right side of the screen shows the :ref:`pivot table properties +`. + +.. tip:: + - To sever the link between an inserted pivot table and your database, select the entire pivot + table, right-click and select :icon:`fa-clone` :guilabel:`Copy`, then right-click again and + select :menuselection:`Paste special --> Paste as value`. + - Do not modify the pivot table ID in the sheet name, as the inserted pivot table retains this ID + for the lifetime of the spreadsheet. This pivot table ID is used in the :ref:`spreadsheet + functions ` that retrieve data from your + database. + +.. _spreadsheet/insert/pivot-table-functions-static: + +Pivot table functions +--------------------- + +An inserted pivot table that has not been converted to a :doc:`dynamic pivot table +` uses the following :doc:`functions ` to retrieve the header and +field values, respectively: + + .. code-block:: text + + =PIVOT.HEADER(pivot_id, [domain_field_name, …], [domain_value, …]) + =PIVOT.VALUE(pivot_id, measure_name, [domain_field_name, …], [domain_value, …]) + +The arguments of the functions are as follows: + +- `pivot_id`: the ID assigned when the pivot table is inserted. The first pivot table inserted + in a spreadsheet is assigned pivot ID `1`, the second, pivot ID `2`, etc. +- `measure_name`: the technical name of what is being measured, followed by the type of aggregation, + e.g., `product_uom_qty:sum`. +- `domain_field_name`: the technical name of the field used as a dimension, e.g., `user_id`, or, if + the dimension is a time period, the technical name of the date field, followed by the time period, + e.g., `date_order:month`. +- `domain_value`: the ID of the record, or, if the dimension is a time period, the date or time + period targeted. + +.. tip:: + Clicking on an individual cell displays the related formula, if relevant, in the formula bar. To + display all the formulas of a spreadsheet at the same time, click :menuselection:`View -->` + :icon:`fa-eye` :menuselection:`Show --> Formulas` on the menu bar. The example below shows the + functions used to retrieve headers and values of a static pivot table. + + .. image:: insert/pivot-table-formulas.png + :alt: Functions of a static pivot table + +.. _spreadsheet/insert/pivot-table-properties: + +Pivot table properties +---------------------- + +The pivot table properties appear on the right side of the screen when a pivot table is inserted. +They can be accessed at any time via the :guilabel:`Data` menu by clicking the relevant pivot table, +as prefaced by the :icon:`oi-view-pivot` :guilabel:`(pivot)` icon, or by right-clicking anywhere on +the pivot table and clicking :icon:`oi-view-pivot` :guilabel:`See pivot properties`. + +The following pivot table properties are shown, some of which can be edited: + +- :guilabel:`Pivot #`: the pivot table ID. Pivot table IDs are assigned sequentially as additional + pivot tables are inserted in the spreadsheet. +- :guilabel:`Name`: the name of the pivot table. Edit this if needed. Note that editing the name + in the pivot table properties does not modify the name shown in the sheet name, and vice versa. +- :guilabel:`Model`: the model from which the data has been extracted. +- :guilabel:`Columns` and :guilabel:`Rows`: dimensions you are using to categorize or group data + from the model. +- :guilabel:`Measures`: what you are measuring, or analyzing, based on the dimensions you have + chosen. + + .. tip:: + If you attempt to make changes to the columns, rows, or measures of a pivot table that has just + been inserted into a spreadsheet, an error appears at the top right of the screen. + + .. image:: dynamic_pivot_tables/pivot-table-error.png + :alt: Error message when trying to manipulate static pivot table + + To be able to manipulate a pivot table's properties, convert a static pivot table to a + :ref:`dynamic pivot table `. + +- :guilabel:`Domain`: the rules used to determine which records are shown. Click + :ref:`Edit domain ` to add or edit rules. + + .. note:: + When :doc:`global filters ` are used, this domain is combined with the selected + values of the global filter before the data is loaded into the spreadsheet. + +To :ref:`duplicate ` or :ref:`delete +` a pivot table's data source, click the :icon:`fa-cog` +:guilabel:`(gear)` icon then :icon:`fa-clone` :guilabel:`Duplicate` or :icon:`fa-trash` +:guilabel:`Delete`. + +.. _spreadsheet/insert/pivot-table-manage: + +Manage an inserted pivot table +------------------------------ + +After a pivot table from an Odoo database has been inserted into an Odoo spreadsheet, you can: + +- :ref:`convert it to a dynamic pivot table ` to be able to + manipulate the dimensions and measures +- :ref:`duplicate the pivot table ` to create a new, + identical data source +- :ref:`delete the pivot table and its underlying data source + ` + +.. _spreadsheet/insert/pivot-table-duplicate: + +Duplicate a pivot table +~~~~~~~~~~~~~~~~~~~~~~~ + +Duplicating a pivot table via the pivot table's properties creates an additional data source. This +allows for different manipulations to be performed on the same data within one spreadsheet. + +For example, you can see the same data aggregated by different dimensions or use :doc:`global +filters ` to offset the date and create pivot tables that compare the current +period's data with a previous period. + +To duplicate a pivot table, perform the following steps: + +#. With the :ref:`pivot table properties ` open, click + the :icon:`fa-cog` :guilabel:`(gear)` icon then :icon:`fa-clone` :guilabel:`Duplicate`. + + The duplicated pivot table is automatically inserted into a new sheet in the spreadsheet, with + the pivot table properties open in the right pane. +#. Edit the :guilabel:`Name` in the properties pane and the sheet tab if needed. + +The new data source is assigned the next available pivot table ID. For example, if no other pivot +tables have been inserted in the meantime, duplicating *Pivot #1* results in the creation of +*Pivot #2*. .. note:: - To update pivots and lists data without reopening a spreadsheet, go to the menu bar and click - :menuselection:`Data --> Refresh all data`. + - Duplicating an inserted pivot table by copying and pasting it or by duplicating the sheet does + not create a new data source. Any changes made to the pivot table's properties would therefore + impact any copies of the pivot table. + - When a pivot table is duplicated, the new pivot table is by default a :doc:`dynamic pivot table + `. + +.. _spreadsheet/insert/pivot-table-delete: + +Delete a pivot table +~~~~~~~~~~~~~~~~~~~~ + +To fully delete a pivot table and the underlying data source from a spreadsheet, perform the +following steps in any order: + +- Delete the spreadsheet table using your preferred means, e.g., via keyboard commands, spreadsheet + menus, or by deleting the sheet. This deletes the visual representation of the data. +- From the :ref:`properties pane ` of the relevant pivot + table, click the :icon:`fa-cog` :guilabel:`(gear)` icon then :icon:`fa-trash` :guilabel:`Delete`. + This deletes the data source of the pivot table. + +.. _spreadsheet/insert/chart: + +Insert a chart +============== + +To insert a chart from an Odoo database into an Odoo spreadsheet: + +#. With the relevant graph view open in your database, click :guilabel:`Insert in Spreadsheet`. +#. In the window that opens, edit the :guilabel:`Name of the graph` if needed. + +#. Click :guilabel:`Blank spreadsheet` to create a new spreadsheet, or select in which existing + spreadsheet the chart should be inserted. + + .. note:: + When inserting a chart into a new spreadsheet, the spreadsheet is saved in the **Odoo + Documents** app in the :icon:`fa-hdd-o` :guilabel:`My Drive` personal folder. + +#. Click :guilabel:`Confirm`. + +Charts are inserted on the first sheet of the spreadsheet. + +.. tip:: + Clicking on a data point in a chart opens the relevant list view in the database. In the example, + clicking on :guilabel:`Jessica Childs` opens the list view of all sales by this salesperson that + match the domain of the chart. + + .. image:: insert/clickable-link-chart.png + :alt: A clickable link to an Odoo menu plus clickable data point + +.. _spreadsheet/insert/chart-properties: + +Chart properties +---------------- + +When you insert a chart into a spreadsheet, the chart properties appear on the right side of the +screen. Access these at any time via the :guilabel:`Data` menu by clicking the relevant chart, as +prefaced by the :icon:`fa-bar-chart` :guilabel:`(chart)` icon. Alternatively, hover over the chart +then click the :icon:`fa-bars` :guilabel:`(menu)` icon and click :icon:`fa-pencil-square-o` +:guilabel:`Edit`. + +In the chart properties, the :icon:`fa-sliders` :guilabel:`Configuration` and :icon:`fa-paint-brush` +:guilabel:`Design` tabs let you modify various elements of the chart. + +Configuration +~~~~~~~~~~~~~ + +The :icon:`fa-sliders` :guilabel:`Configuration` tab includes the following sections: + +- :guilabel:`Chart type`: the type of chart. By default, this indicates the type of chart you + selected in the graph view in the database before inserting the chart in the spreadsheet. + + After a chart has been inserted, more chart types are available. Click the dropdown menu to + select the most appropriate chart type for the data. + + .. note:: + The chart types in the :guilabel:`Other` tab below are only available when creating a chart + from spreadsheet data; an inserted chart cannot be converted to a chart type shown in that tab. + All other chart types are available for both inserted charts and when creating a chart directly + from spreadsheet data. + + .. tabs:: + + .. tab:: Line + + .. image:: insert/chart-type-line.png + :alt: Line chart icon + + :guilabel:`Line`: best for showing trends or changes over time, such as sales + growth across months or temperature variations. + + .. image:: insert/chart-type-line-stacked.png + :alt: Stacked line chart icon + + :guilabel:`Stacked Line`: useful for visualizing cumulative trends where multiple series + contribute to a total, like revenue by department over time. + + .. image:: insert/chart-type-line-combo.png + :alt: Combo chart icon + + :guilabel:`Combo`: combines multiple chart types (e.g., bars and lines) to compare different + data types or highlight key metrics alongside trends. + + .. tab:: Column + + .. image:: insert/chart-type-column.png + :alt: Column chart icon + + :guilabel:`Column`: ideal for comparing values across discrete categories, such as sales per + product or revenue by region. + + .. image:: insert/chart-type-column-stacked.png + :alt: Stacked column chart icon + + :guilabel:`Stacked Column`: displays part-to-whole relationships within categories, such as + regional contributions to total sales. + + .. tab:: Bar + + .. image:: insert/chart-type-bar.png + :alt: Bar chart icon + + :guilabel:`Bar`: similar to a column chart but horizontal, making it better for comparing + long category names or datasets. + + .. image:: insert/chart-type-bar-stacked.png + :alt: Stacked bar chart icon + + :guilabel:`Stacked Bar`: highlights cumulative contributions across categories, often used + in demographic or resource allocation analysis. + + .. tab:: Area + + .. image:: insert/chart-type-area.png + :alt: Area chart icon + + :guilabel:`Area`: similar to a line chart but fills the area beneath the lines to emphasize + magnitude, perfect for cumulative metrics over time. + + .. image:: insert/chart-type-area-stacked.png + :alt: Stacked area chart icon + + :guilabel:`Stacked Area`: visualizes the composition of changes over time, such as market + share by product category. + + .. tab:: Pie + + .. image:: insert/chart-type-pie.png + :alt: Pie chart icon + + :guilabel:`Pie`: best for showing proportions or percentages of a whole, such as market + share or budget allocation. + + .. image:: insert/chart-type-doughnut.png + :alt: Doughnut chart icon + + :guilabel:`Doughnut`: a variation of the pie chart with a hollow center, offering similar + use cases but with a modern aesthetic. + + .. tab:: Hierarchical + + .. image:: insert/chart-type-sunburst.png + :alt: Sunburst chart icon + + :guilabel:`Sunburst`: a variation of the doughnut chart with hierarchical rings, showcasing + part-to-whole relationships across multiple levels. + + .. image:: insert/chart-type-treemap.png + :alt: Treemap chart icon + + :guilabel:`Treemap`: a multi-level rectangular chart that displays hierarchical data through + nested rectangles, ideal for illustrating proportions and categories. + + .. tab:: Miscellaneous + + .. image:: insert/chart-type-scatter.png + :alt: Scatter chart icon + + :guilabel:`Scatter`: ideal for analyzing relationships or correlations between two numerical + variables, such as price vs. quantity sold. + + .. image:: insert/chart-type-waterfall.png + :alt: Waterfall chart icon + + :guilabel:`Waterfall`: ideal for visualizing cumulative effects of sequential positive and + negative values, such as profit/loss analysis. + + .. image:: insert/chart-type-population-pyramid.png + :alt: Population pyramid chart icon + + :guilabel:`Population Pyramid`: a specialized chart for comparing distributions, often used + in demographics, such as age and gender group analysis. + + .. image:: insert/chart-type-radar.png + :alt: Radar chart icon + + :guilabel:`Radar`: displays multivariate data as a polygon on axes radiating from a center, + allowing for profile comparisons across multiple variables. + + .. image:: insert/chart-type-filled-radar.png + :alt: Filled radar chart icon + + :guilabel:`Filled radar`: fills the area within the radar chart's polygon, emphasizing the + overall magnitude of values across different attributes for comparison. + + .. tab:: Other + + When creating a chart from spreadsheet data, rather than inserting one from a graph view, + the following chart types are also available: + + .. image:: insert/chart-type-gauge.png + :alt: Gauge chart icon + + :guilabel:`Gauge`: displays progress toward a goal or a single key metric, such as + performance against a target. + + .. image:: insert/chart-type-scorecard.png + :alt: Scorecard icon + + :guilabel:`Scorecard`: used to summarize key performance indicators (KPIs) in a compact + format, such as total sales or conversion rates, and compare to a baseline or a previous + value. + + .. image:: insert/chart-type-geo.png + :alt: Geo chart icon + + :guilabel:`Geo`: visualizes data on a map using color variations to represent values or + categories across different geographical regions. + + .. image:: insert/chart-type-funnel.png + :alt: Geo chart icon + + :guilabel:`Funnel`: visualizes data that progressively decreases over stages of a + process, with the option to display cumulative data for each stage. + +- :guilabel:`Domain`: the rules used to determine which records are shown. Click :ref:`Edit domain + ` to add or edit rules. +- :guilabel:`Link to Odoo menu`: to add a :ref:`clickable link ` + from a chart to an Odoo menu item, i.e., a specific view of a model. + +Design +~~~~~~ + +Depending on the chart type, the :icon:`fa-paint-brush` :guilabel:`Design` tab has one or more +sections. + +The :guilabel:`General` section allows you to modify the following elements: + +- :guilabel:`Background color`: Add or change the background color by clicking on the color dot. + Choose one of the standard colors or click the :icon:`fa-plus` icon to manually select a custom + color. +- :guilabel:`Chart title`: Edit the chart title, if needed. The font formatting, horizontal + alignment, font size, and color of the title can be modified using the editor. +- :guilabel:`Legend position`: Change the position of the legend or opt to have no legend. +- Enable :guilabel:`Show values` to add numeric values to the data points on the + chart. + +The :guilabel:`Data Series` section allows you to modify the following elements: + +- :guilabel:`Series color`: With the relevant data series selected, change the color of the related + data points on the chart by clicking on the color dot circle. Choose one of the standard colors or + click the :icon:`fa-plus` icon to manually select a custom color. +- :guilabel:`Series name`: Edit the name of a data series, if needed. +- :guilabel:`Serie type`: For each data series of a :guilabel:`Combo` chart, determine whether the + series is shown as a :guilabel:`Bar` or :guilabel:`Line`. +- :guilabel:`Vertical axis`: For the selected data series of a :guilabel:`Line`, :guilabel:`Area`, + or :guilabel:`Column` chart, select whether it should be displayed on the :guilabel:`Left` + (primary) or :guilabel:`Right` (secondary) vertical axis. +- :guilabel:`Trend line`: With the relevant data series selected, enable :guilabel:`Show trend line` + then select the type of trend line from the dropdown; the options are :guilabel:`Linear`, + :guilabel:`Exponential`, :guilabel:`Polynomial`, :guilabel:`Logarithmic`, and :guilabel:`Trailing + moving average`. The color of the trend line can be changed by clicking on the color circle. + +The :guilabel:`Axes` section allows you add a title to one or both axes of a chart. The font +formatting, horizontal alignment, font size, and color of the title can be modified using the +editor. + +Waterfall charts have a dedicated :guilabel:`Waterfall design` section. + +Manage an inserted chart +------------------------ + +After a chart from an Odoo database has been inserted into an Odoo spreadsheet, you can: + +- move the chart within the same sheet by selecting it, then dragging the chart to the desired + position +- resize the chart by selecting it, then clicking and dragging the blue markers until the chart is + the desired size +- hover over the chart, then click the :icon:`fa-bars` :guilabel:`(menu)` icon to reveal the + following options: + + - :icon:`fa-clipboard` :guilabel:`Copy` or :icon:`os-cut` :guilabel:`Cut`: to copy or cut a chart + with the intention of pasting it *within the same spreadsheet*, click the relevant icon or use + the relevant keyboard shortcut. Paste the chart in the desired location by clicking + :menuselection:`Edit -->` :icon:`os-paste` :menuselection:`Paste` from the menu bar or use the + relevant keyboard shortcut. + + .. note:: + Copying/cutting and pasting a chart in this way maintains the link between the chart and your + database. The data in the pasted chart remains up-to-date, and clicking on a data point opens + the related list view in the database. + + - :guilabel:`Copy as image`: to copy an image of a chart to your clipboard with the intention of + pasting it *in any location within or outside your spreadsheet*, click :guilabel:`Copy as + image`. Paste the image in the desired location using the paste function of the destination + program or the relevant keyboard shortcut. + + .. note:: + Copying and pasting a static image of a chart implies there is no longer any link between the + chart and your database. + + - :icon:`fa-trash-o` :guilabel:`Delete`: delete a chart and its underlying :ref:`data source + ` by clicking :icon:`fa-trash-o` :guilabel:`Delete`. + Alternatively, use your preferred keyboard command to delete a chart and its data source. + +.. _spreadsheet/insert/clickable-links: + +Insert clickable links +====================== + +Adding links to related or supporting information can make your report or dashboard more +user-friendly and effective. + +You can :ref:`insert a clickable link from any spreadsheet cell +` to: + +- an Odoo menu item +- another sheet inside the same spreadsheet +- an external URL + +You can :ref:`insert a clickable link from any chart ` to +an Odoo menu item. + +.. note:: + - Clicking a link to a menu item provides the same result as navigating via the Odoo menu within + an app, e.g., the menu item :guilabel:`Sales/Orders/Quotations` corresponds to the default view + when navigating to :menuselection:`Sales --> Orders --> Quotations`. + - It is also possible to insert a clickable link to a specific view of a model in a spreadsheet + starting from the view itself. However, as this method inserts each new link in a new sheet, it + is more efficient to create links to specific views starting from the spreadsheet. + +.. tip:: + Use the middle mouse button or `Ctrl` + left-click (Microsoft/Linux), or `Command` + left-click + (Mac OS) to open clickable links in a new browser tab. + +.. _spreadsheet/insert/clickable-links-cell: + +Insert a clickable link from a cell +----------------------------------- + +To insert a clickable link from a cell: + +#. Click :menuselection:`Insert -->` :icon:`fa-link` :menuselection:`Link` from the menu bar or + right-click on the cell, then click :icon:`fa-link` :guilabel:`Insert link`. Next, depending on + the desired outcome, perform one of the following actions: + + - Click the :icon:`fa-bars` :guilabel:`(menu)` icon, then :guilabel:`Link an Odoo menu`. Select + the relevant menu item from the list or click :guilabel:`Search more` to choose from a list of + all menu items. Click :guilabel:`Confirm`. + - Click the :icon:`fa-bars` :guilabel:`(menu)` icon, then :guilabel:`Link sheet`, then choose the + relevant sheet from the current spreadsheet. + - Under :guilabel:`Link`, type a URL. + +#. Enter or edit the label for the link in the :guilabel:`Text` field. +#. Click :guilabel:`Confirm`. + +.. _spreadsheet/insert/clickable-links-chart: + +Insert a clickable link from a chart +------------------------------------ + +To insert a clickable link from a chart to an Odoo menu item: + +#. Hover over the top right of the chart's box, then click the :icon:`fa-bars` :guilabel:`(menu)` + icon, then :icon:`fa-pencil-square-o` :guilabel:`Edit`. The chart properties appear at the right + of the screen. +#. At the bottom of the :icon:`fa-sliders` :guilabel:`Configuration` tab of the chart properties + pane, click under :guilabel:`Link to Odoo menu`, then select a menu. + +Hover over the top right of the chart's box to see that a new :icon:`fa-external-link` +:guilabel:`(external link)` icon has been added. -Pivot data ----------- +.. _spreadsheet/insert/financial-data: -Using :guilabel:`Refresh all data` only updates existing pivot cells. If new cells need to be added, -go to the menu bar and click :menuselection:`Data --> Re-insert pivot` to fully update the pivot. -Alternatively, click :guilabel:`Insert pivot`, select the pivot, and tick :guilabel:`Display missing -cells only` to preview first the missing data. +Insert financial data +===================== - .. image:: insert/missing-cells.png - :align: center - :alt: Displaying missing cells in a pivot +When building reports and dashboards, it may be useful to include certain accounting-related data, +such as account IDs, credits and debits for specific accounts, and dates of the start and end of the +tax year. -To change which records are :ref:`used by the pivot `, right-click on -a pivot cell, select :guilabel:`See pivot properties`, and click :guilabel:`Edit domain`. +:ref:`Odoo-specific spreadsheet functions ` allow you to retrieve such +accounting data from your database and insert it into a spreadsheet. diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-area-stacked.png b/content/applications/productivity/spreadsheet/insert/chart-type-area-stacked.png new file mode 100644 index 0000000000..bed4b5d0a7 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-area-stacked.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-area.png b/content/applications/productivity/spreadsheet/insert/chart-type-area.png new file mode 100644 index 0000000000..6dda39e373 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-area.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-bar-stacked.png b/content/applications/productivity/spreadsheet/insert/chart-type-bar-stacked.png new file mode 100644 index 0000000000..3c31dceca4 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-bar-stacked.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-bar.png b/content/applications/productivity/spreadsheet/insert/chart-type-bar.png new file mode 100644 index 0000000000..025ede44cd Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-bar.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-column-stacked.png b/content/applications/productivity/spreadsheet/insert/chart-type-column-stacked.png new file mode 100644 index 0000000000..059ef8a564 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-column-stacked.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-column.png b/content/applications/productivity/spreadsheet/insert/chart-type-column.png new file mode 100644 index 0000000000..ed67b8ae7f Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-column.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-doughnut.png b/content/applications/productivity/spreadsheet/insert/chart-type-doughnut.png new file mode 100644 index 0000000000..d218c27f7d Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-doughnut.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-filled-radar.png b/content/applications/productivity/spreadsheet/insert/chart-type-filled-radar.png new file mode 100644 index 0000000000..b8b5f8d5d4 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-filled-radar.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-funnel.png b/content/applications/productivity/spreadsheet/insert/chart-type-funnel.png new file mode 100644 index 0000000000..8cbc8a2e59 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-funnel.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-gauge.png b/content/applications/productivity/spreadsheet/insert/chart-type-gauge.png new file mode 100644 index 0000000000..a668537538 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-gauge.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-geo.png b/content/applications/productivity/spreadsheet/insert/chart-type-geo.png new file mode 100644 index 0000000000..1885d634af Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-geo.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-line-combo.png b/content/applications/productivity/spreadsheet/insert/chart-type-line-combo.png new file mode 100644 index 0000000000..f3353812b8 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-line-combo.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-line-stacked.png b/content/applications/productivity/spreadsheet/insert/chart-type-line-stacked.png new file mode 100644 index 0000000000..17121323be Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-line-stacked.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-line.png b/content/applications/productivity/spreadsheet/insert/chart-type-line.png new file mode 100644 index 0000000000..1cc1511e35 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-line.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-pie.png b/content/applications/productivity/spreadsheet/insert/chart-type-pie.png new file mode 100644 index 0000000000..8bfea76392 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-pie.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-population-pyramid.png b/content/applications/productivity/spreadsheet/insert/chart-type-population-pyramid.png new file mode 100644 index 0000000000..de887710bd Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-population-pyramid.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-radar.png b/content/applications/productivity/spreadsheet/insert/chart-type-radar.png new file mode 100644 index 0000000000..8c112a1944 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-radar.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-scatter.png b/content/applications/productivity/spreadsheet/insert/chart-type-scatter.png new file mode 100644 index 0000000000..57e8eca2ea Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-scatter.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-scorecard.png b/content/applications/productivity/spreadsheet/insert/chart-type-scorecard.png new file mode 100644 index 0000000000..ea80d8fd15 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-scorecard.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-sunburst.png b/content/applications/productivity/spreadsheet/insert/chart-type-sunburst.png new file mode 100644 index 0000000000..86b7b4bdc0 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-sunburst.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-treemap.png b/content/applications/productivity/spreadsheet/insert/chart-type-treemap.png new file mode 100644 index 0000000000..b8ced3de75 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-treemap.png differ diff --git a/content/applications/productivity/spreadsheet/insert/chart-type-waterfall.png b/content/applications/productivity/spreadsheet/insert/chart-type-waterfall.png new file mode 100644 index 0000000000..3e14dd7cf4 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/chart-type-waterfall.png differ diff --git a/content/applications/productivity/spreadsheet/insert/clickable-link-chart.png b/content/applications/productivity/spreadsheet/insert/clickable-link-chart.png new file mode 100644 index 0000000000..0aaea2b80c Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/clickable-link-chart.png differ diff --git a/content/applications/productivity/spreadsheet/insert/data-menu.png b/content/applications/productivity/spreadsheet/insert/data-menu.png new file mode 100644 index 0000000000..57cb2e1cc3 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/data-menu.png differ diff --git a/content/applications/productivity/spreadsheet/insert/insert-list.png b/content/applications/productivity/spreadsheet/insert/insert-list.png new file mode 100644 index 0000000000..661c9beefb Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/insert-list.png differ diff --git a/content/applications/productivity/spreadsheet/insert/insert-pivot-table.png b/content/applications/productivity/spreadsheet/insert/insert-pivot-table.png new file mode 100644 index 0000000000..a974a09b9a Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/insert-pivot-table.png differ diff --git a/content/applications/productivity/spreadsheet/insert/insert-spreadsheet.png b/content/applications/productivity/spreadsheet/insert/insert-spreadsheet.png deleted file mode 100644 index b6359ce599..0000000000 Binary files a/content/applications/productivity/spreadsheet/insert/insert-spreadsheet.png and /dev/null differ diff --git a/content/applications/productivity/spreadsheet/insert/list-add-columns.png b/content/applications/productivity/spreadsheet/insert/list-add-columns.png new file mode 100644 index 0000000000..0a58e39093 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/list-add-columns.png differ diff --git a/content/applications/productivity/spreadsheet/insert/list-add-records.png b/content/applications/productivity/spreadsheet/insert/list-add-records.png new file mode 100644 index 0000000000..b205128124 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/list-add-records.png differ diff --git a/content/applications/productivity/spreadsheet/insert/list-deleted.png b/content/applications/productivity/spreadsheet/insert/list-deleted.png new file mode 100644 index 0000000000..95799cbf39 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/list-deleted.png differ diff --git a/content/applications/productivity/spreadsheet/insert/list-formulas.png b/content/applications/productivity/spreadsheet/insert/list-formulas.png new file mode 100644 index 0000000000..0cd9301ad1 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/list-formulas.png differ diff --git a/content/applications/productivity/spreadsheet/insert/missing-cells.png b/content/applications/productivity/spreadsheet/insert/missing-cells.png deleted file mode 100644 index 08a538b508..0000000000 Binary files a/content/applications/productivity/spreadsheet/insert/missing-cells.png and /dev/null differ diff --git a/content/applications/productivity/spreadsheet/insert/pivot-table-error.png b/content/applications/productivity/spreadsheet/insert/pivot-table-error.png new file mode 100644 index 0000000000..b0a0a348e8 Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/pivot-table-error.png differ diff --git a/content/applications/productivity/spreadsheet/insert/pivot-table-formulas.png b/content/applications/productivity/spreadsheet/insert/pivot-table-formulas.png new file mode 100644 index 0000000000..b1c4c8fd2a Binary files /dev/null and b/content/applications/productivity/spreadsheet/insert/pivot-table-formulas.png differ diff --git a/content/applications/productivity/spreadsheet/locale-difference.png b/content/applications/productivity/spreadsheet/locale-difference.png new file mode 100644 index 0000000000..6368d323b2 Binary files /dev/null and b/content/applications/productivity/spreadsheet/locale-difference.png differ diff --git a/content/applications/productivity/spreadsheet/templates.rst b/content/applications/productivity/spreadsheet/templates.rst index 0cc9999587..259a3ca58a 100644 --- a/content/applications/productivity/spreadsheet/templates.rst +++ b/content/applications/productivity/spreadsheet/templates.rst @@ -15,8 +15,9 @@ Create a template ================= Any spreadsheet can be saved as a template. Open the relevant spreadsheet or :ref:`create a new one -`. From the menu bar, click :menuselection:`File --> Save as template`. -Modify the default :guilabel:`Template Name` if needed and click :guilabel:`Confirm`. +`. From the menu bar, click :menuselection:`File -->` :icon:`os-save` +:menuselection:`Save as template`. Modify the default :guilabel:`Template Name` if needed and +click :guilabel:`Confirm`. .. important:: Once a spreadsheet is saved as a template, any further changes to the open spreadsheet are @@ -62,7 +63,3 @@ Various actions are possible: - Delete a template by ticking the checkbox next to it, clicking :icon:`fa-cog` :guilabel:`Actions`, then :guilabel:`Delete`. - -.. tip:: - Use the download button under the :guilabel:`Spreadsheet file` column to export a template in - JSON format. The file can be imported into another database. diff --git a/content/applications/productivity/spreadsheet/ui-elements.png b/content/applications/productivity/spreadsheet/ui-elements.png deleted file mode 100644 index 618ec00cf4..0000000000 Binary files a/content/applications/productivity/spreadsheet/ui-elements.png and /dev/null differ diff --git a/content/applications/productivity/voip.rst b/content/applications/productivity/voip.rst index b1a072bee0..e844b4ac18 100644 --- a/content/applications/productivity/voip.rst +++ b/content/applications/productivity/voip.rst @@ -101,22 +101,30 @@ VoIP workflows ============== Here are a few commonly used workflows for Odoo |VOIP|. This technology is especially popular with - sales teams, but can be useful for other teams as well. + sales teams and support teams, but can be useful for other teams as well. .. cards:: .. card:: Sales teams and VoIP :target: voip/sales_calls :large: - Learn how to use VoIP for a sales team. This includes making sales calls, handling - follow-ups, and sending a sales quotation while on a call. + Learn how to use VoIP for a sales team. This includes making sales calls, handling follow-ups, + and sending a sales quotation while on a call. + .. card:: Support queues and VoIP + :target: voip/support_calls + :large: + + Learn how to use VoIP for a support team. This includes joining a call queue as an agent and + handling support tickets that require calls. .. toctree:: :titlesonly: voip/onsip voip/axivox + voip/didww voip/voip_widget voip/devices_integrations voip/sales_calls + voip/support_calls diff --git a/content/applications/productivity/voip/axivox/axivox_config.rst b/content/applications/productivity/voip/axivox/axivox_config.rst index 59b80413b5..c29b34b6b1 100644 --- a/content/applications/productivity/voip/axivox/axivox_config.rst +++ b/content/applications/productivity/voip/axivox/axivox_config.rst @@ -19,12 +19,13 @@ Configuration To configure Axivox in Odoo, go to the :menuselection:`Apps` application, and search for `VoIP`. Then, install the :guilabel:`VoIP` module. -Next, go to :menuselection:`Settings app --> General Settings --> Integrations section`, and fill -out the :guilabel:`VoIP` field: +Next, go to :menuselection:`Settings app --> General Settings --> Integrations section --> VoIP`. +Click :guilabel:`Manage Providers`, then :guilabel:`New`. Fill in the following information: +- :guilabel:`Name`: type `Axivox` +- :guilabel:`WebSocket`: type in `wss://pabx.axivox.com:3443` - :guilabel:`OnSIP Domain`: set the domain created by Axivox for the account (e.g., `yourcompany.axivox.com`) -- :guilabel:`WebSocket`: type in `wss://pabx.axivox.com:3443` - :guilabel:`VoIP Environment`: set as :guilabel:`Production` .. image:: axivox_config/voip-configuration.png diff --git a/content/applications/productivity/voip/axivox/axivox_config/voip-configuration.png b/content/applications/productivity/voip/axivox/axivox_config/voip-configuration.png index 3150364a22..d4679b806a 100644 Binary files a/content/applications/productivity/voip/axivox/axivox_config/voip-configuration.png and b/content/applications/productivity/voip/axivox/axivox_config/voip-configuration.png differ diff --git a/content/applications/productivity/voip/axivox/call_queues.rst b/content/applications/productivity/voip/axivox/call_queues.rst index f97ae6de43..f5425af402 100644 --- a/content/applications/productivity/voip/axivox/call_queues.rst +++ b/content/applications/productivity/voip/axivox/call_queues.rst @@ -2,172 +2,117 @@ Call queues =========== -A call queue is a system that organizes and routes incoming calls. When customers call a business, -and all of the agents are busy, the call queue lines up the callers in sequential order, based on -the time they called in. +A call queue organizes and routes incoming calls when all agents are busy, placing callers on hold +in the order they called. This system helps manage high call volumes more efficiently, ensures fair +workload distribution, and provides a more predictable experience for both callers and agents. -The callers then wait on hold to be connected to the next available call center agent. - -Implementing a call queue system reduces stress for employees, and helps build brand trust with -customers. Many companies use call queues to set expectations with customers, and to distribute the -workload equally amongst employees. - -This document covers the process required to configure call queues (with advanced settings), as well -as how to log into a call queue from the Odoo database. +This document explains how to configure call queue settings and log into a queue from the Odoo +database. .. seealso:: - :ref:`voip/axivox/music_on_hold` + :ref:`Set up on hold music ` Add a queue =========== To add a call queue in Axivox, navigate to the `Axivox management console `_. In the left menu, click :guilabel:`Queues`. Next, click -:guilabel:`Add a queue`. Doing so reveals a blank :guilabel:`New queue` form with various fields to -fill out. - -Name ----- - -Once the :guilabel:`New queue` page appears, enter the :guilabel:`Name` of the queue. - -Internal extension ------------------- - -Choose an :guilabel:`Internal extension` for the queue. This is a number to be dialed by users of -the database to reach the login prompt for the queue. - -Strategy --------- - -Next, is the :guilabel:`Strategy` field. This field determines the call routing of received calls -into this queue. - -The following choices are available in the :guilabel:`Strategy` drop-down menu: - -- :guilabel:`Call all available agents` -- :guilabel:`Calls the agent who has received the call for the longest time` -- :guilabel:`Calls the agent who has received the least call` -- :guilabel:`Call a random agent` -- :guilabel:`Call agents one after the other` -- :guilabel:`Call agents one after the other starting with the first in the list` - -Choose a strategy that best meets the company's needs for customers in the queue. - -Maximum waiting time in seconds -------------------------------- - -In the :guilabel:`Maximum waiting time in seconds` field, determine the longest time a customer -waits in the queue before going to a voicemail, or wherever else they are directed to in a dial -plan. Enter a time in seconds. - -Maximum duration of ringing at an agent ---------------------------------------- - -In the :guilabel:`Maximum duration of ringing at an agent` field, determine the longest time an -individual agent's line rings before moving on to another agent, or moving to the next step in the -dial plan. Enter a time in seconds. +:guilabel:`Add a queue`. From here, set up the call queue. + +- :guilabel:`Name`: The call queue's name. A required field. +- :guilabel:`Internal Extension`: The extension agents can transfer callers to. A required field. +- :guilabel:`Strategy`: How calls are routed. Choose the option that best matches the company's + needs for this call queue: + + - :guilabel:`Call all available agents`: The call is sent to every agent. + - :guilabel:`Calls the agent who has received the call for the longest time`: The call is sent to + the agent with the longest idle time. + - :guilabel:`Calls the agent who has received the least call`: The call is sent to the agent who + has handled the fewest calls in a time window. + - :guilabel:`Call a random agent`: The call is sent to a random agent. + - :guilabel:`Call agents one after the other`: The call is sent to the next agent in a specified + order. This order is remembered, and the order does not reset after each call. + - :guilabel:`Call agents one after the other starting with the first in the list`: The call is + sent to the next agent in a specified order. This order is remembered, and the order does reset + after each call. + +- :guilabel:`Maximum waiting time in seconds`: How long a customer can wait in the queue before + getting forwarded to voicemail or a specific agent. +- :guilabel:`Maximum duration of ringing at an agent`: How long an individual agent's phone rings + before the call gets moved onto the next step in the dial plan. Learn more about :doc:`dial plans + `. +- :guilabel:`Static agents`: Agents in the queue who receive calls without logging in. +- :guilabel:`Dynamic agents`: Agents who must log into the queue to receive calls from it. .. seealso:: - For more information on dial plans, visit: - + - :ref:`voip/axivox/music_on_hold` - :doc:`dial_plan_basics` - :doc:`dial_plan_advanced` -Adding agents -------------- - -The final two fields on the :guilabel:`New queue` form revolve around adding agents. Adding -:guilabel:`Static agents` and :guilabel:`Dynamic agents` are two pre-configured methods for adding -agents onto the call queue during the configuration. - -.. _voip/axivox/static-agents: - -Static agents -~~~~~~~~~~~~~ - -When :guilabel:`Static agents` are added, these agents are automatically added to the queue without -the need to log in to receive calls. - -.. _voip/axivox/dynamic-agents: - -Dynamic agents -~~~~~~~~~~~~~~ - -When :guilabel:`Dynamic agents` are added, these agents have the ability to log into this queue. -They are **not** logged-in automatically, and **must** log in to receive calls. - -Be sure to :guilabel:`Save` the changes, and click :guilabel:`Apply changes` in the upper-right -corner to implement the change in production. - Agent connection ================ -There are three ways call agents can connect to an Axivox call queue: +Agents have three ways to join a call queue: -#. Dynamic agents connect automatically. -#. Manager logs in specific agent(s), via the `Axivox management console - `_. -#. Agent connects to the queue in Odoo, via the *VoIP* widget. +- Static agents connect automatically. -.. seealso:: - See the documentation on setting :ref:`voip/axivox/dynamic-agents` in the `Axivox management - console `_. + - Static agents are always signed into the call queue. -Connect via Axivox queue ------------------------- +- Manager logs in specific agents, via the `Axivox management console `_. +- Agent connects to the queue in Odoo, via the **VoIP** widget. + +Connect to the queue through Axivox +----------------------------------- -After the initial configuration of the call queue is completed, with the changes saved and -implemented, a manager can log into the `Axivox management console `_ and -connect dynamic agents to the queue manually. +Once the call queue is set up and the changes are applied, a manager can log into the `Axivox +management console `_ and connect dynamic agents to the queue manually. -To connect an agent, click :guilabel:`Queues`, located in the left-hand column. Doing so reveals the +To connect an agent, click :guilabel:`Queues`, located in the left-hand menu. Doing so opens the :guilabel:`Queues` dashboard, with a few different columns listed: - :guilabel:`Name`: name of the queue. - :guilabel:`Extension`: number of the extension to be dialed to reach the queue. -- :guilabel:`Agent Connection`: number to dial to log into the queue. -- :guilabel:`Agent disconnection`: number to dial to log out of the queue. -- :guilabel:`Connected Agents`: name of agent connected to the queue. +- :guilabel:`Agent Connection`: number to dial for dynamic agents to log into the queue. +- :guilabel:`Agent disconnection`: number to dial for dynamic agents to log out of the queue. +- :guilabel:`Connected Agents`: name of agents connected to the queue. The following buttons are also available on the :guilabel:`Queues` dashboard: - :guilabel:`Connect an agent`: manually connect an agent to the queue. - :guilabel:`Report`: run a report on the queue. - :guilabel:`Delete`: delete the queue. -- :guilabel:`Edit`: make changes to the settings of the queue. +- :guilabel:`Edit`: make changes to the queue's settings. When agents are connected to the queue, or are live with a customer, they are displayed under the :guilabel:`Connected Agents` column. If they are static agents, they **always** show up as connected. -Connect an agent by clicking the orange button labeled, :guilabel:`Connect an agent`. Then, select +Connect an agent by clicking the orange button labeled :guilabel:`Connect an agent`. Then, select the desired agent's name from the drop-down menu, and click :guilabel:`Connect`. +To manually log a dynamic agent out of a call queue, navigate to the `Axivox management console +`_, and click :guilabel:`Queues` from the left-hand menu. Then, click the +green :guilabel:`Refresh` button at the top of the :guilabel:`Connected agents` column. From here, +click the red :guilabel:`Disconnect` button, and they are immediately disconnected. This can be +helpful in situations where agents forget to log out at the end of the day. + .. image:: call_queues/call-queue.png - :align: center :alt: Call queue with connected agents column highlighted and connect an agent and report buttons highlighted. -.. seealso:: - For more information on static and dynamic agents, see this documentation: - - - :ref:`voip/axivox/static-agents` - - :ref:`voip/axivox/dynamic-agents` - Report ~~~~~~ -Click :guilabel:`Report` to check on the reporting for a particular queue, in order to see who -connected when, and what phone calls came in and out of the queue. This information is showcased on -a separate :guilabel:`Queue report` page, when the green :guilabel:`Report` button is clicked. +Click :guilabel:`Report` to open a :guilabel:`Queue report` page that shows queue activity. This +report includes who connected and when when, as well as what phone calls were handled by the queue.f +This information is showcased on a separate :guilabel:`Queue report` page. -Reports can be customized by date in the :guilabel:`Period` field, and specified in the +Set the report's date in the :guilabel:`Period` field. To pick a specific date range, use the :guilabel:`From` and :guilabel:`to` fields. The information can be organized by :guilabel:`Event -type`, and :guilabel:`Call ID`. +type` (covered below), and :guilabel:`Call ID`. -When the custom configurations have been entered, click :guilabel:`Apply`. +Generate the report by clicking :guilabel:`Apply`. Each report can be exported to a :abbr:`CSV (comma separated value)` file for further use and analysis, via the :guilabel:`Export to CSV` button. @@ -187,59 +132,42 @@ options: - :guilabel:`No one is answering` - :guilabel:`No one is answering, the caller hangs up` - :guilabel:`Transfer` -- :guilabel:`Blind Transfer` - -.. image:: call_queues/event-type.png - :align: center - :alt: Event types in the Axivox queue reporting feature. - -There is no limit to how many options can be selected from the :guilabel:`Event type` drop-down -menu. +- :guilabel:`Blind Transfer` (when the caller is transferred without interacting with an agent) +Any or all of the thirteen options can be selected from the :guilabel:`Event type` drop-down menu. Clicking :guilabel:`Check all` selects all the available options from the drop-down menu, and clicking :guilabel:`Uncheck all` removes all selections from the drop-down menu. To select an individual :guilabel:`Event type`, click on the desired option in the drop-down menu. .. image:: call_queues/report.png - :align: center :alt: Axivox queue report with result, event type, and period highlighted. Connect to queue on Odoo ------------------------ -Dynamic agents can connect manually to the Axivox call queue from the Odoo *VoIP* widget, once the -*VoIP* app is configured for the individual user in Odoo. +Dynamic agents can connect manually to the Axivox call queue from the Odoo **VoIP** widget once the +**VoIP** app is configured for the individual user in Odoo. -.. seealso:: - :doc:`axivox_config` - -To access the Odoo *VoIP* widget, click the :guilabel:`☎️ (phone)` icon in the upper-right corner of -the screen, from any window within Odoo. +To access the Odoo **VoIP** widget, click the :icon:`oi-voip` :guilabel:`(VoIP)` icon in the +upper-right corner of the screen anywhere in an Odoo database. .. seealso:: - For more information on the Odoo *VoIP* widget, see this documentation: :doc:`../voip_widget` + - :doc:`axivox_config` + - :doc:`../voip_widget` -For an agent to connect to the call queue, simply dial the :guilabel:`Agent connection` number, and -press the green call button :guilabel:`📞 (phone)` icon in the *VoIP* widget. Then, the agent hears -a short, two-second message indicating the agent is logged in. The call automatically ends -(disconnects). +For an agent to connect to the call queue, dial the :guilabel:`Agent connection` number, and then +press the green call button :icon:`fa-phone` :guilabel:`(phone)` icon in the **VoIP** widget. Then, +the agent hears a short, two-second message indicating the agent is logged in. The call +automatically ends. To view the connected agents in a call queue, navigate to the `Axivox management console -`_, and click :guilabel:`Queues`, located in the left-hand column. +`_, and click :guilabel:`Queues` from the left-hand menu. Then, click the green :guilabel:`Refresh` button at the top of the :guilabel:`Connected agents` -column. Any agent (static or dynamic) that is connected to the queue currently, appears in the -column next to the queue they are logged into. - -To log out of the queue, open the Odoo *VoIP* widget, dial the :guilabel:`Agent disconnection` -number, and press the green call button :guilabel:`📞 (phone)` icon. The agent is disconnected from -the queue after a short, two-second message. - -To manually log a dynamic agent out of a call queue, navigate to the `Axivox management console -`_, and click :guilabel:`Queues`, located in the left-hand column. Then, -click the green :guilabel:`Refresh` button at the top of the :guilabel:`Connected agents` column. +column. Any agent, static or dynamic, that is connected to the queue currently appears in the column +next to the queue they are logged into. -To disconnect an agent manually, click the red :guilabel:`Disconnect` button, and they are -immediately disconnected. This can be helpful in situations where agents forget to log out at the -end of the day. +To log out of the queue, open the Odoo **VoIP** widget, dial the :guilabel:`Agent disconnection` +number, and then press the green call button :icon:`fa-phone` :guilabel:`(phone)` icon. The agent is +disconnected from the queue after a short, two-second message. diff --git a/content/applications/productivity/voip/axivox/call_queues/call-queue.png b/content/applications/productivity/voip/axivox/call_queues/call-queue.png index b8690aafa0..80c854304d 100644 Binary files a/content/applications/productivity/voip/axivox/call_queues/call-queue.png and b/content/applications/productivity/voip/axivox/call_queues/call-queue.png differ diff --git a/content/applications/productivity/voip/axivox/call_queues/event-type.png b/content/applications/productivity/voip/axivox/call_queues/event-type.png deleted file mode 100644 index f8982c2e95..0000000000 Binary files a/content/applications/productivity/voip/axivox/call_queues/event-type.png and /dev/null differ diff --git a/content/applications/productivity/voip/axivox/call_queues/report.png b/content/applications/productivity/voip/axivox/call_queues/report.png index 498730982a..a6899e35eb 100644 Binary files a/content/applications/productivity/voip/axivox/call_queues/report.png and b/content/applications/productivity/voip/axivox/call_queues/report.png differ diff --git a/content/applications/productivity/voip/didww.rst b/content/applications/productivity/voip/didww.rst new file mode 100644 index 0000000000..b8e04c60e0 --- /dev/null +++ b/content/applications/productivity/voip/didww.rst @@ -0,0 +1,84 @@ +================================ +VoIP services in Odoo with DIDWW +================================ + +*DIDWW* is a global *VoIP* and SIP trunking provider. An active account with DIDWW is required to +use this service. + +Before creating an account with DIDWW, make sure that the company's location and the applicable +regions are supported by DIDWW's services. + +DIDWW setup +=========== + +After verifying country coverage and availability, create an account with `DIDWW +`_. Then navigate to the `DIDWW Dashboard +`_. + +To transfer existing numbers from an existing telephone network service provider, follow the steps +outlined on the `DIDWW website `_. + +Purchase new numbers +-------------------- + +To puchase new phone numbers, click :guilabel:`Buy Numbers` in the dashboard, then follow the +instructions to complete the purchase. + +When buying a new number, it **must** support both inbound calls and Local CLI. + +.. image:: didww/didww-purchase-numbers.png + :alt: The purchase dashboard in DIDWW. + +Enable phone.systems +-------------------- + +Next, click :guilabel:`Cloud Phone System` in the dashboard sidebar. Then, click :guilabel:`Launch +admin UI`. + +.. important:: + The *phone.systems PBX* feature is an extra paid service in DIDWW, and may require additional + fees. + +To create a new user, click :guilabel:`Users`, click the plus sign, then enter the necessary +information. + +.. image:: didww/add-user.png + :alt: The add a new user screen in DIDWW. + +Click :guilabel:`Contact Methods`, then click the plus sign to add a new *SIP Device Route*. + +Configure or add the following parameters: + +- :guilabel:`Allowed Codecs`: `OPUS`, `PCMU`, `PCMA`, `telephone-event`, `g722`, `g729`. +- :guilabel:`Allowed media types`: `SRTP-DTLS` +- :guilabel:`Default media type`: `SRTP-DTLS` +- :guilabel:`Transport protocol`: `UDP`, `TCP`, `WSS`, `TLS` + +.. image:: didww/sip-device-route.png + :alt: The settings for a new contact method in DIDWW. + +.. tip:: + If no phone number available from drop-down selection in *Inbound and Outbound DID/Caller ID* + selection, the :guilabel:`Inbound voice trunk` needs to be modified. Navigate to the dashboard, + then click :guilabel:`My Numbers`. Scroll to :guilabel:`Configuration`. In the :guilabel:`Inbound + voice trunk` field, select :guilabel:`phone.systems`. + +Odoo setup +========== + +In *Odoo*, navigate to :menuselection:`Settings app --> Integrations --> VoIP --> Manage Providers`. +Click :guilabel:`New`. + +Enter the name, `DIDWW`, then update the :guilabel:`WebSocket` field with `wss://sip.phone.systems`. +Under :guilabel:`PBX Server IP`, enter `sip.phone.systems`. + +.. image:: didww/new-provider.png + :alt: The VoIP providers page in Odoo. + +To configure a user's VoIP provider, click the user avatar icon in the top-right corner of the +database, and then choose :guilabel:`My Preferences` from the sub-menu. Then click into the +:guilabel:`VoIP` tab, and under the :guilabel:`Voip Provider` field, select :guilabel:`DIDWW`. +Finally, enter the :guilabel:`Voip Username` and :guilabel:`Voip Secret`, then save. + +.. image:: didww/odoo-credentials.png + :alt: DIDWW provider, username, and secret credentials entered. diff --git a/content/applications/productivity/voip/didww/add-user.png b/content/applications/productivity/voip/didww/add-user.png new file mode 100644 index 0000000000..a6407b110f Binary files /dev/null and b/content/applications/productivity/voip/didww/add-user.png differ diff --git a/content/applications/productivity/voip/didww/didww-purchase-numbers.png b/content/applications/productivity/voip/didww/didww-purchase-numbers.png new file mode 100644 index 0000000000..29d20a0b95 Binary files /dev/null and b/content/applications/productivity/voip/didww/didww-purchase-numbers.png differ diff --git a/content/applications/productivity/voip/didww/new-provider.png b/content/applications/productivity/voip/didww/new-provider.png new file mode 100644 index 0000000000..e5b3d13e10 Binary files /dev/null and b/content/applications/productivity/voip/didww/new-provider.png differ diff --git a/content/applications/productivity/voip/didww/odoo-credentials.png b/content/applications/productivity/voip/didww/odoo-credentials.png new file mode 100644 index 0000000000..cc8a5c10e2 Binary files /dev/null and b/content/applications/productivity/voip/didww/odoo-credentials.png differ diff --git a/content/applications/productivity/voip/didww/sip-device-route.png b/content/applications/productivity/voip/didww/sip-device-route.png new file mode 100644 index 0000000000..d5affd7c6a Binary files /dev/null and b/content/applications/productivity/voip/didww/sip-device-route.png differ diff --git a/content/applications/productivity/voip/support_calls.rst b/content/applications/productivity/voip/support_calls.rst new file mode 100644 index 0000000000..fb97b70813 --- /dev/null +++ b/content/applications/productivity/voip/support_calls.rst @@ -0,0 +1,120 @@ +======================= +Support calls with VoIP +======================= + +.. |VOIP| replace:: :abbr:`VoIP (Voice over Internet Protocol)` + +A useful tool for support teams, Odoo |VOIP| is used as a way to get in contact with customers that +need some help. Using |VOIP| can help improve customer satisfaction, reduce support costs, and +allows support agents to navigate an Odoo database while on a call. + +Instead of being tied to their desks, support agents can take calls from anywhere they have access +to Odoo :doc:`VoIP <../voip>`. + +.. important:: + This feature requires at least one :doc:`call queue ` to be configured. + +.. seealso:: + `Odoo Tutorial: Working as a Support Agent + `_ + +Log into a support queue +======================== + +If :doc:`call queues ` are set up, begin a support shift by logging into a call +queue. + +Begin by clicking :icon:`oi-voip` :guilabel:`(VoIP)` in the top-right corner of the Odoo database. +From there, click :icon:`fa-keyboard-o` :guilabel:`(keyboard)`, then dial the *agent connection* +number and click :icon:`fa-phone` :guilabel:`(phone)`. + +Once the support agent calls their *agent connection code*, they'll hear a short message letting +them know they are logged into the queue. From here, the agent receives support calls according to +the administrator's :doc:`call queue strategy `. When a support agent receives a +call, the Odoo |VOIP| widget appears in the bottom-right corner of their screen with the caller's +phone number, as well as their name if the number is tied to a customer profile. + +.. note:: + When support staff are added as :doc:`static agents ` to a call queue, they + do not need to log into the queue to receive calls from that queue. + +Call a customer from a support ticket +===================================== + +As part of a support agent's daily tasks, they might be asked to call customers with open support +tickets. With Odoo |VOIP|, the support agent can stay in the Odoo database throughout the entire +workflow. + +From the database's home page, click the **Helpdesk** app, click into a helpdesk, and then open a +ticket. If the ticket does not already have a call activity scheduled, click :guilabel:`Activities` +in the ticket's chatter, then set the activity's :guilabel:`Activity Type` to :guilabel:`Call`, and +then fill out the rest of the activity form, and finally click :guilabel:`Schedule`. + +.. image:: support_calls/create-call-activity.png + :alt: Scheduling a call activity for a support ticket. + +From here, the agent has three ways to make a call: + +- Hover over the :guilabel:`Phone` field in the ticket, then click :icon:`fa-phone` + :guilabel:`Call`. +- In the ticket's chatter, click the customer's phone number. +- In the upper-right corner, click the :icon:`oi-voip` :guilabel:`(VoIP)` icon to open the |VOIP| + widget. From the :guilabel:`Next Activities` tab, select the call, and finally click the + :icon:`fa-phone` :guilabel:`(phone)` icon near the bottom of the widget. + +Work during a call +------------------ + +Once the call with the customer begins, the support agent can still move about the Odoo database. +Also, there are shortcut icons in the |VOIP| widget that the support agent can use to access common +actions, like sending an email to the customer, or pulling up their profile. Learn more about +:doc:`the documents a support agent can access ` during a call. + +The support agent can also take some actions during the call: + +- :icon:`fa-arrows-h` :guilabel:`(transfer)`: Transfer a call to another team member. +- :icon:`fa-microphone` :guilabel:`(microphone)`: The support agent can mute themselves during a + call. +- :icon:`fa-pause` :guilabel:`(pause)`: Place the caller on hold. + +Handle call follow-ups +---------------------- + +The |VOIP| widget can handle some common follow-up tasks, but support agents can still navigate Odoo +for tasks not available in the widget. + +Here are some of the common follow-up tasks that can be managed from the |VOIP| widget: + +- Send a follow-up email sharing troubleshooting steps with the customer using the + :icon:`fa-envelope` :guilabel:`(envelope)` icon. +- Update the customer's mailing address by clicking on the :icon:`fa-user` :guilabel:`(user)` icon, + which opens their profile. +- Schedule a second call with the customer by clicking the :icon:`fa-clock-o` :guilabel:`(clock)` + icon, setting the :guilabel:`Activity Type` field to :guilabel:`Call`, and then filling out the + rest of the form. + +End the support call +-------------------- + +When it is time to end the call, the support agent clicks the red :icon:`fa-phone` +:guilabel:`(phone)` icon in the lower-right corner of the |VOIP| widget. When they do, the call is +logged in the ticket's chatter. + +If they have not done so already, the support agent then marks the phone call activity as done. To +do so, navigate to the ticket's chatter and find the :guilabel:`Planned Activities` section, then +click :icon:`fa-check` :guilabel:`Mark Done` on the planned call to remove it from the +:guilabel:`Next Activities` tab in the |VOIP| widget. + +Log out of a support queue +========================== + +Once the agent's shift ends, or if they are taking a break, they can log out of the support call +queue. + +Begin by clicking :icon:`oi-voip` :guilabel:`(VoIP)` in the top-right corner of the Odoo database. +From there, click :icon:`fa-keyboard-o` :guilabel:`(keyboard)`, then dial the *agent disconnection* +number and click :icon:`fa-phone` :guilabel:`phone`. + +Once the support agent calls their *agent disconnection code*, they'll hear a short message letting +them know they are logged out of the queue. From here, the agent will no longer receive support +calls until they log back in. diff --git a/content/applications/productivity/voip/support_calls/create-call-activity.png b/content/applications/productivity/voip/support_calls/create-call-activity.png new file mode 100644 index 0000000000..36da306f42 Binary files /dev/null and b/content/applications/productivity/voip/support_calls/create-call-activity.png differ diff --git a/content/applications/productivity/whatsapp.rst b/content/applications/productivity/whatsapp.rst index 53ee113666..d2c87b8f2e 100644 --- a/content/applications/productivity/whatsapp.rst +++ b/content/applications/productivity/whatsapp.rst @@ -53,10 +53,11 @@ number), then Odoo will open a group chat with all operators responsible for thi the help desk team and sales teams can chat on different channels. .. seealso:: - :download:`Magic Sheet - WhatsApp configuration PDF ` + `Magic Sheet - WhatsApp configuration [PDF] + `_ -WhatsApp configuration in a Meta -================================ +WhatsApp configuration in Meta +============================== A WhatsApp integration with Odoo uses a standard :abbr:`API (Application Programming Interface)` connection, and is configured on Meta in the following steps: @@ -205,8 +206,8 @@ test message. .. note:: If the browser is not on the :guilabel:`Quickstart` page for WhatsApp, navigate to - ``_ and click on the app that is being configured, (the - app name is `Odoo` if the instructions above were followed). + ``_ and click on the app that is being configured, (the app + name is `Odoo` if the instructions above were followed). Then, in the menu on the left-hand side of the page, click the :guilabel:`v (menu toggle)` icon next to the :guilabel:`WhatsApp` section heading. A small menu will open, containing the @@ -409,8 +410,8 @@ depending on the verification method chosen. Enter that verification code into t :guilabel:`Verification code` field and click :guilabel:`Next` to finish. .. warning:: - If a payment method has not been added, this is necessary to proceed. `Visit Meta's - documentation on how to add a payment method in Meta's Business Manager + If a payment method has not been added, this is necessary to proceed. `Visit Meta's documentation + on how to add a payment method in Meta's Business Manager `_. This is part of Meta's fraud detection system, in order to ensure that the account/company are real a payment method is required to proceed. @@ -459,6 +460,7 @@ permissions: - `business_management` - `whatsapp_business_messaging` - `whatsapp_business_management` +- `whatsapp_business_manage_events` When permissions are set, click :guilabel:`Generate token`. Copy the token value that populates on the screen that follows. @@ -547,10 +549,10 @@ action will apply to for this template. .. tip:: These models can also be accessed in :ref:`developer mode `. On a contact form - (or similar relevant form in Odoo), navigate to the model that is referenced, and hover over - any field name. A box of backend information will reveal itself with the specific Odoo - :guilabel:`Model` name in the backend. Search (using the front-end name) for this model in the - :guilabel:`Applies to` drop-down menu in the WhatsApp template. + (or similar relevant form in Odoo), navigate to the model that is referenced, and hover over any + field name. The backend information box displays the Odoo :guilabel:`Model` name. Search (using + the front-end name) for this model in the :guilabel:`Applies to` drop-down menu in the WhatsApp + template. .. warning:: Often when changing the model or :guilabel:`Applies to` field, the :guilabel:`Phone Field` may @@ -773,8 +775,7 @@ Enter the :guilabel:`Name` of the template and then select the :guilabel:`Langua template. .. note:: - Multiple languages can be selected by typing the language names and selecting the other - languages as needed. + Multiple languages can be selected. .. image:: whatsapp/template-config.png :alt: Template configuration options listed, with Marketing, Utility, Name and Language diff --git a/content/applications/productivity/whatsapp/magic-sheet-whatsapp.pdf b/content/applications/productivity/whatsapp/magic-sheet-whatsapp.pdf deleted file mode 100644 index 42580f0bb3..0000000000 Binary files a/content/applications/productivity/whatsapp/magic-sheet-whatsapp.pdf and /dev/null differ diff --git a/content/applications/sales/crm/acquire_leads/opportunities_form.rst b/content/applications/sales/crm/acquire_leads/opportunities_form.rst index d9b65a48a2..3c2181e8a1 100644 --- a/content/applications/sales/crm/acquire_leads/opportunities_form.rst +++ b/content/applications/sales/crm/acquire_leads/opportunities_form.rst @@ -115,4 +115,4 @@ record. - :doc:`../pipeline/manage_sales_teams` - :doc:`convert` - :doc:`../track_leads/lead_scoring` - - :ref:`Website forms ` + - :ref:`Website forms ` diff --git a/content/applications/sales/crm/optimize/partner_autocomplete.rst b/content/applications/sales/crm/optimize/partner_autocomplete.rst index f3b613a0d0..b094241006 100644 --- a/content/applications/sales/crm/optimize/partner_autocomplete.rst +++ b/content/applications/sales/crm/optimize/partner_autocomplete.rst @@ -12,10 +12,8 @@ hard-to-find data for a desired company. it with data. The information provided by partner autocomplete can include general information about the business -(including full business name and logo), social media accounts, :guilabel:`Company type`, -:guilabel:`Founded` information, :guilabel:`Sectors` information, the number of -:guilabel:`Employees`, :guilabel:`Estimated revenue`, :guilabel:`Phone` number, -:guilabel:`Timezone`, and :guilabel:`Technologies Used`. +(including full business name and logo), :guilabel:`Phone` number, :guilabel:`Email`, +:guilabel:`Tax ID`, address and UNSPSC activities as :guilabel:`Tags`. .. important:: When getting a company's contact information make sure to be aware of the latest EU regulations. @@ -46,13 +44,6 @@ For example, after typing `Odoo`, the following information populates: :align: center :alt: Creating a new contact in Odoo -In the chatter, the following information populates about the company, after clicking on the desired -pre-populated contact: - -.. image:: partner_autocomplete/odoo-info-autocomplete.png - :align: center - :alt: View of the information being shown about odoo with the autocomplete option in Odoo - .. tip:: Partner Autocomplete also works if a :abbr:`VAT (value-added tax)` number is entered instead of company name. diff --git a/content/applications/sales/crm/optimize/partner_autocomplete/odoo-info-autocomplete.png b/content/applications/sales/crm/optimize/partner_autocomplete/odoo-info-autocomplete.png deleted file mode 100644 index 9d0ae747a4..0000000000 Binary files a/content/applications/sales/crm/optimize/partner_autocomplete/odoo-info-autocomplete.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale.rst b/content/applications/sales/point_of_sale.rst index 7e8248b7b0..b3e82c1fb5 100644 --- a/content/applications/sales/point_of_sale.rst +++ b/content/applications/sales/point_of_sale.rst @@ -99,24 +99,27 @@ under the related product. Return and refund products ========================== -To return and refund a product, +To refund a returned product, follow these steps: -#. :ref:`start a session ` from the **POS dashboard**; -#. click :guilabel:`Refund` and select the corresponding order; -#. select the product and the quantity to refund using the keypad; -#. click :guilabel:`Refund` to go back to the previous screen; -#. once the order is completed, click :guilabel:`Payment` to proceed to the refund; -#. click :guilabel:`Validate` and :guilabel:`New Order` to move on to the next customer. +#. :ref:`Start a session ` from the **POS dashboard**. +#. Click the :icon:`fa-ellipsis-v` :guilabel:`(vertical ellipsis)` icon, then :icon:`fa-undo` + :guilabel:`Refund`, and select the corresponding order. +#. Select items, use the keypad to set the quantity to refund, then click :guilabel:`Refund`. +#. Click :guilabel:`Payment` and select the appropriate refund payment method. +#. Click :guilabel:`Validate` and print the receipt if needed. +#. Click :guilabel:`New Order` to proceed to the next customer. -.. image:: point_of_sale/refund.png - :alt: refund view from a POS +.. tip:: + - To filter the **orders list** by :guilabel:`Reference`, :guilabel:`Receipt Number`, + :guilabel:`Date`, or :guilabel:`Customer`, enter a value in the search bar and choose the + relevant filter from the dropdown menu. + - When the total amount is negative, adding a gift card to the cart automatically adjusts the + gift card balance to match that amount. .. note:: - - You can filter the **orders list** by :guilabel:`Receipt Number`, :guilabel:`Date` or - :guilabel:`Customer` using the search bar. - - You can also refund a product by selecting the returned product from an open session, and - setting a negative quantity that equals the number of returned products. To do so, click - :guilabel:`Qty` and :guilabel:`+/-`, followed by the quantity of returned products. + Alternatively, a refund can be processed by selecting the returned product(s) from an open + session and setting a negative quantity equal to the number of returned items. To do so, click + :guilabel:`Qty` and :guilabel:`+/-`, and update the quantity accordingly. Once the return payment is validated, Odoo generates the required credit note, referencing the original receipt or invoice and partially or fully canceling the document. @@ -175,10 +178,41 @@ the **POS dashboard**. - To look at all your previous sessions, go to :menuselection:`Point of Sale --> Orders --> Sessions`. +.. _pos/analytics: + +Analytics +========= + +Once you :ref:`close and post the POS session `, access the comprehensive report +to review all session activities, including who initiated the session and who handled specific +orders. To access the session's report: + +#. Click :icon:`fa-ellipsis-v` (:guilabel:`vertical ellipsis`) on the POS card. +#. Click :guilabel:`Sessions` under the :guilabel:`View` section. +#. From that list view, you can see all the sessions and who initiated them under the + :guilabel:`Opened By` column. +#. Select a POS session to open a detailed session report. +#. Click the :guilabel:`Orders` smart button to display a list of all orders placed during that + session. +#. From that view, you can retrieve the following information: + + - The :guilabel:`Order Ref` + - The :guilabel:`Date` of the order. + - The :guilabel:`Point of Sale` where that order was made. + - The :guilabel:`Receipt Number`. + - The :guilabel:`Customer`. + - The :guilabel:`Employee` that placed this order. + - The :guilabel:`Total` paid amount. + - The order :guilabel:`Status`. + +To get an overview of all orders, regardless of the session, click the vertical ellipsis button +(:guilabel:`⋮`) on the POS card and select :guilabel:`Orders` from the :guilabel:`View` section. + .. toctree:: :titlesonly: point_of_sale/configuration + point_of_sale/pos_hardware point_of_sale/employee_login point_of_sale/receipts_invoices point_of_sale/preparation diff --git a/content/applications/sales/point_of_sale/configuration/pos_iot.rst b/content/applications/sales/point_of_sale/configuration/pos_iot.rst index f6287c85b8..a9cf2eee2c 100644 --- a/content/applications/sales/point_of_sale/configuration/pos_iot.rst +++ b/content/applications/sales/point_of_sale/configuration/pos_iot.rst @@ -18,7 +18,8 @@ To connect the POS with an :doc:`IoT system `: - Instructions * - Printer - Connect a supported receipt printer to a :abbr:`USB (Universal Serial Bus)` port or - to the network, and power it on. Refer to :doc:`../restaurant/kitchen_printing`. + to the network, and power it on. Refer to :ref:`Order printing + `. * - Cash drawer - The cash drawer should be connected to the printer with an RJ25 cable. * - Barcode scanner diff --git a/content/applications/sales/point_of_sale/employee_login.rst b/content/applications/sales/point_of_sale/employee_login.rst index 6f8e0aaceb..ac64bf3786 100644 --- a/content/applications/sales/point_of_sale/employee_login.rst +++ b/content/applications/sales/point_of_sale/employee_login.rst @@ -2,74 +2,155 @@ Multi-employee management ========================= -Odoo Point of Sale allows you to manage access to a specific POS by enabling the **Multi Employees -per Session** feature. When activated, :ref:`you can select which users can log into the POS -` and :ref:`keep track of the employees involved in each order -`. +Odoo Point of Sale (POS) offers a **Log in with Employees** feature, allowing multiple users to +:ref:`log into a POS session `. Activating this feature enables the +following actions: -.. _employee_login/configuration: +- Select specific users who can :ref:`log into the POS `. +- :ref:`Assign minimal, basic or advanced permissions ` to these + users. +- :ref:`Track the employees involved in each order for enhanced analytics `. + +.. _pos/employee_login/configuration: Configuration ============= -:ref:`Access the POS settings ` and select your POS, or click the vertical -ellipsis button (:guilabel:`⋮`) on a POS card and click :guilabel:`Edit`. Then, enable -:guilabel:`Multi Employees per Session`, and add the allowed employees in the :guilabel:`Allowed -Employees` field. +Access the multi-employee setting from the :guilabel:`PoS Interface` section of the :ref:`POS +settings `. Then, + +#. Activate the :guilabel:`Log in with Employees` feature. +#. Add the employees with **basic POS functionality** access in the :guilabel:`Basic rights` field. +#. Add the employees with **extended POS functionalities** in the :guilabel:`Advanced rights` field. +#. Add the employees with **minimal POS functionality** access in the :guilabel:`Minimal rights` + field. -.. image:: employee_login/setting.png +.. image:: employee_login/activate-setting.png :alt: setting to enable multiple cashiers in POS -.. _employee_login/use: +.. note:: + - Leaving the :guilabel:`Minimal rights` and :guilabel:`Basic rights` field empty allows all + employees to log in. + - Leaving the :guilabel:`Advanced rights` field empty grants extended rights to Odoo users only. + +.. tip:: + Click the :icon:`fa-ellipsis-v` (:guilabel:`vertical ellipsis`) button on the top right corner of + a POS card and :guilabel:`Edit` to access the setting from the main POS dashboard. + +.. seealso:: + :doc:`../../general/users/access_rights` + +.. tabs:: + .. tab:: Minimal rights + + Employees with minimal rights can perform the following actions within the POS: + + **Session management:** + + - Lock and unlock an open POS session. + - Reload data. + + **Sales transactions:** + + - :ref:`Process standard sales transactions `. + - :ref:`Set customers `. + - :ref:`Add notes to orders `. + + **Pricing and discounts:** + + - Enter promotional codes. + + .. tab:: Basic rights + + In addition to the minimal rights, employees with basic rights can also: + + **Session management:** + + - :ref:`Open a POS session `. + - :ref:`Perform cash-in and cash-out operations `. + + **Sales transactions:** + + - :ref:`Create customers `. + - :ref:`Process refunds `. + - :doc:`Access and handle sales orders `. + - Access past and current order history. + - Cancel orders. + + **Pricing and discounts:** + + - Manually select another :doc:`pricelist `. + - :doc:`Manually apply discounts `. + - Manually :ref:`change a product's price `. + - Give loyalty program's rewards. + - Switch between :doc:`fiscal positions `. + + .. tab:: Advanced rights + + In addition to the minimal and basic rights, employees with advanced rights can also: + + - Create products. + - Access the Odoo backend interface. + - :ref:`Close the current POS session `. + +.. _pos/employee_login/use: + +Usage guidelines +================ + +Logging in +---------- -Practical application -===================== +Once the **Log in with Employees** feature is enabled, employees must log in to :ref:`open a POS +session ` and access the POS interface. They can :ref:`scan their employee badge +`, click the :icon:`fa-users` icon (:guilabel:`users`) to select their +name from the list of authorized users, or by entering :ref:`their PIN code +` in the :guilabel:`Enter your PIN` field. -Once the feature is activated, cashiers can log in :ref:`by scanning their badge -` or selecting their name from the list of allowed employees to :ref:`open the -session `. +.. image:: employee_login/log-in.png + :alt: Login window to open a session when the multiple cashiers feature is active -.. image:: employee_login/open-session.png - :alt: window to open a session when the multiple cashiers feature is enabled +To switch between users during an :ref:`active session `, click on the currently +logged-in employee's name at the top right of the POS screen and select the user to switch to. -To switch to another user :ref:`from an open session `, click the employee name -at the top-right of the screen and select the employee to swap with from the list. +.. tip:: + In the absence of a scanner, click the :icon:`fa-barcode` icon (:guilabel:`barcode`) to scan + barcodes using the webcam. -.. image:: employee_login/switch-user.png - :alt: button to switch from one cashier to another. +.. _pos/employee_login/badge: -You can also require your employees to enter a pin code every time they log into a POS to prevent -them from logging in as someone else. To define the code, go to the **Employees** app, open the -employee form, and click the :guilabel:`HR settings` tab. Then, enter a pin code of your choice in -the :guilabel:`PIN Code` field of the :guilabel:`Attendance/Point of Sale` category. +Logging in with badges +---------------------- -.. image:: employee_login/pin-and-badgeid.png - :alt: setting on the employee form to assign a badge ID and a PIN code. +Employees can log in using their badge. To configure badge-based login, assign a unique badge ID to +the employee's profile in the **Employees** module: -.. _employee_login/badge: +#. Navigate to the **Employees** module. +#. Open the form view of the specific employee. +#. Go to the :guilabel:`Settings` tab. +#. The :guilabel:`Attendance/Point of Sale/Manufacturing` category offers two options: -Log in using badges -------------------- + - Manually enter any badge ID in the :guilabel:`Badge ID` field. + - Click :guilabel:`Generate` to create a unique badge ID automatically. +#. Click :guilabel:`Print Badge` to generate a barcode representation of the assigned badge ID. -For your employees to be able to log in by scanning their badge, they must have a badge ID assigned. -To do so, go to the **Employees** app, open the employee form, and click the :guilabel:`HR settings` -tab. Then, enter the badge ID of your choice in the :guilabel:`Badge ID` field of the -:guilabel:`Attendance/Point of Sale` category or click :guilabel:`Generate`. +To switch users within an open POS session using a badge, you must first lock the session. To do so, +click the :icon:`fa-lg fa-lock` icon (:guilabel:`lock`) to return to the login screen. Then, the new +employee can scan their badge to log in. -To switch to another user, lock the session by clicking the lock-shaped icon (:guilabel:`🔓`) at the -top-right of the screen and scan your badge. +.. _pos/employee_login/pin: -.. _employee_login/analytics: +Adding a PIN Code +----------------- -Analytics -========= +For enhanced security, employees may be forced to enter a PIN code each time they log into a POS +session. To set up a PIN code for an employee: -Once you close and post the POS session, access the comprehensive report to review all session -activities, including who initiated the session and who handled specific orders. To access the -session's report, click the vertical ellipsis button (:guilabel:`⋮`) on the POS card and select -:guilabel:`Sessions` from the :guilabel:`View` section. Then, select a specific session for more -detailed information, and click the :guilabel:`Orders` button to view a list of all orders placed -during that session. +#. Navigate to the **Employees** module. +#. Open the form view of the relevant employee. +#. Go to the :guilabel:`Settings` tab. +#. Enter a desired numerical code in the :guilabel:`PIN Code` field of the + :guilabel:`Attendance/Point of Sale/Manufacturing` category. -To get an overview of all orders, regardless of the session, click the vertical ellipsis button -(:guilabel:`⋮`) on the POS card and select :guilabel:`Orders` from the :guilabel:`View` section. +.. note:: + The PIN code must consist of a sequence of digits only. diff --git a/content/applications/sales/point_of_sale/employee_login/activate-setting.png b/content/applications/sales/point_of_sale/employee_login/activate-setting.png new file mode 100644 index 0000000000..98a9c7da70 Binary files /dev/null and b/content/applications/sales/point_of_sale/employee_login/activate-setting.png differ diff --git a/content/applications/sales/point_of_sale/employee_login/log-in.png b/content/applications/sales/point_of_sale/employee_login/log-in.png new file mode 100644 index 0000000000..2941acc46c Binary files /dev/null and b/content/applications/sales/point_of_sale/employee_login/log-in.png differ diff --git a/content/applications/sales/point_of_sale/employee_login/open-session.png b/content/applications/sales/point_of_sale/employee_login/open-session.png deleted file mode 100644 index e81e74cd09..0000000000 Binary files a/content/applications/sales/point_of_sale/employee_login/open-session.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/employee_login/pin-and-badgeid.png b/content/applications/sales/point_of_sale/employee_login/pin-and-badgeid.png deleted file mode 100644 index a0cbecf6fd..0000000000 Binary files a/content/applications/sales/point_of_sale/employee_login/pin-and-badgeid.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/employee_login/setting.png b/content/applications/sales/point_of_sale/employee_login/setting.png deleted file mode 100644 index 8d236331d7..0000000000 Binary files a/content/applications/sales/point_of_sale/employee_login/setting.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/employee_login/switch-user.png b/content/applications/sales/point_of_sale/employee_login/switch-user.png deleted file mode 100644 index f5f3e58980..0000000000 Binary files a/content/applications/sales/point_of_sale/employee_login/switch-user.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/online_food_delivery.rst b/content/applications/sales/point_of_sale/online_food_delivery.rst index 03b59e4c4f..107dca75ba 100644 --- a/content/applications/sales/point_of_sale/online_food_delivery.rst +++ b/content/applications/sales/point_of_sale/online_food_delivery.rst @@ -34,6 +34,29 @@ Supported providers: Configuration ============= +Prerequisites +------------- + +To use the UrbanPiper integration in a live production environment, ensure the following +requirements are satisfied: + +- **UrbanPiper subscription:** A valid UrbanPiper subscription is mandatory. + + .. note:: + For any concerns or queries regarding your UrbanPiper subscription, please reach out to the + account manager linked to your Odoo database. + +- **Odoo requirements:** + + - **Odoo subscription:** An active Odoo Enterprise subscription is required. Odoo Community does + not support this integration. + - **Odoo version:** Odoo Enterprise version 18.0 or above. + - **Odoo platform:** All Odoo platforms are supported, including Odoo Online, Odoo.sh, and + On-Premise installations. + +- **Delivery platform reseller account:** A registered reseller account is required with each + delivery platform to be integrated (e.g., Uber Eats, DoorDash, Careem, Deliveroo, Zomato). + .. _online_food_delivery/credentials: UrbanPiper credentials diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals.rst b/content/applications/sales/point_of_sale/payment_methods/terminals.rst index bf42249529..b995919577 100644 --- a/content/applications/sales/point_of_sale/payment_methods/terminals.rst +++ b/content/applications/sales/point_of_sale/payment_methods/terminals.rst @@ -4,48 +4,53 @@ Payment terminals ================= -Connecting and integrating a payment terminal with your POS system allows you to accept multiple -payment options, including credit and debit cards, making the payment process more efficient. +Connect and integrate a payment terminal to a :ref:`POS system ` to accept +multiple payment options, including credit and debit cards. -.. _terminals/configuration: +.. _pos/terminals/configuration: Configuration ============= -Go to the :ref:`application settings `, scroll down to the -:guilabel:`Payment Terminals` section, and tick your terminal's checkbox. +To activate a payment terminal and allow processing payments with it, follow these steps: -.. image:: terminals/payment-terminals.png - :alt: checkbox in the settings to enable a payment terminal +#. Go to :menuselection:`Point of Sale --> Configuration --> Settings` and scroll down to the + :guilabel:`Payment Terminals` section. +#. Enable the relevant terminal. +#. Click :guilabel:`Save`. +#. Go to :menuselection:`Point of Sale --> Configuration --> Payment Methods` and :doc:`create the + corresponding payment method <../payment_methods>`. +#. Set the :guilabel:`Integration` field to :guilabel:`Terminal`, select the relevant terminal, and + complete the terminal-specific configuration: -Then, follow the corresponding documentation to configure your device: + - :doc:`Adyen ` + - :doc:`Ingenico ` + - :doc:`Mercado Pago ` + - :doc:`Pine Labs ` + - :doc:`Razorpay ` + - :doc:`SIX ` + - :doc:`Stripe ` + - :doc:`Tyro ` + - :doc:`Viva.com ` + - :doc:`Worldline ` +#. Go to :menuselection:`Point of Sale --> Configuration --> Settings` and add the payment method + to the :guilabel:`Payment Methods` list to make it available in the POS interface. -- :doc:`Adyen configuration ` -- :doc:`Ingenico configuration ` -- :doc:`Mercado Pago configuration ` -- :doc:`Razorpay configuration ` -- :doc:`SIX configuration ` -- :doc:`Stripe configuration ` -- :doc:`Tyro configuration ` -- :doc:`Viva Wallet configuration ` -- :doc:`Worldline configuration ` +.. _pos/terminals/terminal-use: -Once the terminal is configured, you can :doc:`create the corresponding payment method and add it to -the POS <../payment_methods>`. +Terminal use +============ -Pay with a payment terminal -=========================== +To process a :ref:`payment ` with a :ref:`configured terminal +` for an order, select the terminal's :doc:`payment method +<../payment_methods>` on the :guilabel:`Payment` screen, then follow the instructions on the +terminal device. -When processing a payment, select the terminal's payment method. Check the amount and -click on :guilabel:`Send`. Once the payment is successful, the status changes to :guilabel:`Payment -Successful`. +Once the transaction is successful, the payment is automatically validated in Point of Sale. .. note:: - - | In case of connection issues between Odoo and the payment terminal, force the payment by - clicking on :guilabel:`Force Done`, which allows you to validate the order. - | This option is only available after receiving an error message informing you that the - connection failed. - - To cancel the payment request, click on :guilabel:`Cancel`. + - Connection issues between Odoo and the payment terminal result in transaction cancellation. + - To cancel the payment request, click :guilabel:`Cancel`. .. toctree:: :titlesonly: @@ -53,9 +58,10 @@ Successful`. terminals/adyen terminals/ingenico terminals/mercado_pago + terminals/pine_labs terminals/razorpay terminals/six terminals/stripe terminals/tyro - terminals/viva_wallet + terminals/viva_com terminals/worldline diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/adyen.rst b/content/applications/sales/point_of_sale/payment_methods/terminals/adyen.rst index 55f19c8454..9489c7a919 100644 --- a/content/applications/sales/point_of_sale/payment_methods/terminals/adyen.rst +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/adyen.rst @@ -84,3 +84,23 @@ Terminal Identifier `, and :guilabel:`Adyen Merchant Account`. Once the payment method is created, you can select it in your POS settings. To do so, go to the :ref:`POS' settings `, click :guilabel:`Edit`, and add the payment method under the :guilabel:`Payments` section. + +.. _adyen/tips: + +Tips +==== + +Odoo Point of Sale allows tipping with an Adyen terminal. To configure this option, go to the +:ref:`POS settings `, enable the :ref:`Tips ` and the +:guilabel:`Add tip through payment terminal (Adyen)` settings, then click :guilabel:`Save`. + +To process tips with an Adyen terminal, follow these steps: + +#. Go to the relevant POS and :ref:`process an order `. +#. Click :ref:`Payment ` and select the :ref:`relevant payment + method `. The :guilabel:`Adyen` terminal displays the transaction and + suggests adding tips. +#. Add a tip amount on the terminal and validate. +#. In Odoo POS, click :icon:`fa-heart` :guilabel:`Tip`, enter the tip amount, and click + :guilabel:`Ok`. +#. Click :guilabel:`Close Tab` to validate the payment and the tip. diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/ingenico.rst b/content/applications/sales/point_of_sale/payment_methods/terminals/ingenico.rst index 72368770b2..f9e218f729 100644 --- a/content/applications/sales/point_of_sale/payment_methods/terminals/ingenico.rst +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/ingenico.rst @@ -26,7 +26,8 @@ Configure the Lane/Desk/Move 5000 terminals for Ingenico BENELUX #. Press the function button (:guilabel:`F` on Lane/5000, :guilabel:`⦿` on Desk/5000 and Move/5000). -#. Go to :menuselection:`Kassa menu --> Settings Menu` and enter the settings password. +#. Go to :menuselection:`Kassa menu --> Settings Menu` and enter the settings password (default: + `2009`). #. Select :guilabel:`Change Connection` and press :guilabel:`OK` on the next screen. #. Select :guilabel:`TCP/IP` and :guilabel:`IP-address`. #. On the next screen, enter the IP address of your IoT system. diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago.rst b/content/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago.rst index 397b2273a2..ee8c972769 100644 --- a/content/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago.rst +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago.rst @@ -6,8 +6,8 @@ Connecting a payment terminal allows you to offer a fluid payment flow to your c the work of your cashiers. .. important:: - Only **Point Smart** payment terminals in **Argentina**, **Brazil**, and **Mexico** are - supported. They can be purchased on `Mercado Pago's website + Only **Point Smart** payment terminals in Argentina, Brazil, Chile, Colombia, Mexico, Peru, and + Uruguay are supported. They can be purchased on `Mercado Pago's website `_. .. seealso:: diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/payment-terminals.png b/content/applications/sales/point_of_sale/payment_methods/terminals/payment-terminals.png deleted file mode 100644 index 07fde00dc1..0000000000 Binary files a/content/applications/sales/point_of_sale/payment_methods/terminals/payment-terminals.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/pine_labs.rst b/content/applications/sales/point_of_sale/payment_methods/terminals/pine_labs.rst new file mode 100644 index 0000000000..3ece53c61d --- /dev/null +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/pine_labs.rst @@ -0,0 +1,53 @@ +========= +Pine Labs +========= + +`Pine Labs `_ offers in-store payment solutions for +customer transactions through several `physical terminals +`_. + +.. important:: + - The Odoo Pine Labs module is only available for Indian companies. + - Pine Labs terminals accept credit/debit cards (Visa, MasterCard, and RuPay) and UPI QR codes + by swiping, scanning, or tapping. + +.. _pos/pine-labs/credentials: + +Pine Labs credentials +===================== + +`Create a Pine Labs account and order at least one terminal +`_. The system then sends an email with the +following credentials: + +- Merchant ID +- Store ID +- Client ID +- Security Token + +.. _pos/pine-labs/odoo-configuration: + +Odoo configuration +================== + +To enable Pine Labs in Odoo, first :ref:`install the POS Pine Labs module ` to +make it visible in the list of payment terminals. Then, follow these steps to connect the Pine Labs +terminal with Odoo Point of Sale: + +#. Go to :menuselection:`Point of Sale --> Configuration --> Settings`, scroll down to the + :guilabel:`Payment Terminals` section, enable the relevant :ref:`payment terminal + `, and click :guilabel:`Save`. +#. Go to :menuselection:`Point of Sale --> Configuration --> Payment Methods` and :doc:`create a + payment method <../../payment_methods>`. +#. Set the :guilabel:`Journal` field to :guilabel:`Bank`. +#. Set the :guilabel:`Integration` field to :guilabel:`Terminal`. +#. Set the :guilabel:`Integrate with` field to :guilabel:`Pine Labs`. +#. Paste the copied :ref:`credentials ` in their corresponding fields. +#. Select the preferred payment mode in the :guilabel:`Pine Labs Allowed Payment Modes` field and + save. +#. Go to :menuselection:`Point of Sale --> Configuration --> Settings` and add the created payment + method to the :guilabel:`Payment Methods` list to use it in a POS. +#. Click :guilabel:`Save`. + +.. tip:: + Enable the :guilabel:`Pine Labs Test Mode` to test transaction processes with a device. diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/six.rst b/content/applications/sales/point_of_sale/payment_methods/terminals/six.rst index 3bb7b890c4..01d68b889d 100644 --- a/content/applications/sales/point_of_sale/payment_methods/terminals/six.rst +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/six.rst @@ -6,56 +6,59 @@ Connecting a SIX payment terminal allows you to offer a fluid payment flow to yo ease the work of your cashiers. .. warning:: - Even though Worldline has recently acquired SIX Payment Services and both companies use Yomani - payment terminals, the firmware they run is different. Terminals received from Worldline are - therefore not compatible with this integration. + Although Worldline has acquired SIX Payment Services and both entities utilize Yomani payment + terminals, their firmware differs. Terminals supplied by Worldline are, therefore, incompatible + with this integration. Configuration ============= -Install the POS IoT Six module ------------------------------- +Prerequisites +------------- -To activate the POS IoT Six module, go to :guilabel:`Apps`, remove the :guilabel:`Apps` filter, and -search for **POS IoT Six**. This module adds the necessary driver and interface to your database to -detect Six terminals. +#. Install the POS IoT Six module: :doc:`Activate the POS IoT Six module module + <../../../../general/apps_modules>` to enable the payment terminal. -.. note:: - This module replaces the **POS Six** module. + .. note:: + This module replaces the **POS Six** module. +#. Connect an IoT system: :doc:`A Raspberry Pi or a virtual IoT system (for Windows OS only) + ` is required to connect a SIX payment terminal to Odoo. -Connect an IoT system ---------------------- +.. _six/configure: -Connecting a Six payment terminal to Odoo is requires :doc:`using an IoT system -`. +Configure the payment method +---------------------------- -Configure the terminal ID -------------------------- +#. Enable the payment terminal :ref:`in the application settings ` and + :doc:`create a payment method for SIX terminals <../../payment_methods>`. +#. Set the journal type as :guilabel:`Bank`. +#. Fill in the :guilabel:`Outstanding Account` field. +#. Select :guilabel:`Terminal` in the :guilabel:`Integration` field. +#. Select :guilabel:`SIX IOT` in the :guilabel:`Integrate with` field. +#. Click :guilabel:`Setup Six Terminal`. -Navigate to the IoT system's homepage, where you can find the :guilabel:`Six payment terminal` -field once your database server is connected to the IoT system. Click :guilabel:`Configure`, fill -in the :guilabel:`Terminal ID` field with the ID received from Six, and click :guilabel:`Connect`. -Your Six terminal ID should appear in the :guilabel:`Current Terminal Id` section. +.. image:: six/new-payment-method.png + :alt: Creating a new payment method for the SIX payment terminal + :scale: 45 % -.. image:: six/terminal-id.png - :alt: Setting the Six terminal ID +In the modal window, -Odoo automatically restarts the IoT system when the Six terminal ID is configured. If your Six -terminal is online, it will be automatically detected and connected to the database. Check the IoT -system's homepage under the :guilabel:`Payments` section to confirm the connection. +#. Click the :guilabel:`IoT Box` field and select the IoT system from the dropdown menu. +#. Enter the :guilabel:`Six Terminal ID (TID)` provided by SIX. +#. Select the :guilabel:`Terminal Device` from dropdown menu. +#. Finally, click :guilabel:`Add Terminal`. -.. image:: six/id-configured.png - :alt: Confirming the connection to the Six payment terminal +.. image:: six/terminal-wizard.png + :alt: Configuring the Terminal ID for the SIX payment terminal -.. _six/configure: +.. note:: + Ensure the SIX terminal is online and connected to the same network as the IoT system. -Configure the payment method ----------------------------- +Link the payment method to a POS +-------------------------------- -Enable the payment terminal :ref:`in the application settings ` and -:doc:`create the related payment method <../../payment_methods>`. Set the journal type as -:guilabel:`Bank` and select :guilabel:`SIX IOT` in the :guilabel:`Use a Payment Terminal` field. -Then, select your terminal device in the :guilabel:`Payment Terminal Device` field. +Once the payment method is created, it can be selected in the POS settings. To do so, -.. image:: six/new-payment-method.png - :alt: Creating a new payment method for the SIX payment terminal +#. Go to the :ref:`POS' settings `. +#. Add the payment method under the :guilabel:`Payment methods` field within the :guilabel:`Payment` + section. diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/six/id-configured.png b/content/applications/sales/point_of_sale/payment_methods/terminals/six/id-configured.png deleted file mode 100644 index 0f31aeab85..0000000000 Binary files a/content/applications/sales/point_of_sale/payment_methods/terminals/six/id-configured.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/six/new-payment-method.png b/content/applications/sales/point_of_sale/payment_methods/terminals/six/new-payment-method.png index d08588e834..2745be2d6e 100644 Binary files a/content/applications/sales/point_of_sale/payment_methods/terminals/six/new-payment-method.png and b/content/applications/sales/point_of_sale/payment_methods/terminals/six/new-payment-method.png differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/six/terminal-id.png b/content/applications/sales/point_of_sale/payment_methods/terminals/six/terminal-id.png deleted file mode 100644 index 945ba29169..0000000000 Binary files a/content/applications/sales/point_of_sale/payment_methods/terminals/six/terminal-id.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/six/terminal-wizard.png b/content/applications/sales/point_of_sale/payment_methods/terminals/six/terminal-wizard.png new file mode 100644 index 0000000000..8d8a071179 Binary files /dev/null and b/content/applications/sales/point_of_sale/payment_methods/terminals/six/terminal-wizard.png differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_com.rst b/content/applications/sales/point_of_sale/payment_methods/terminals/viva_com.rst new file mode 100644 index 0000000000..782dd3ad62 --- /dev/null +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/viva_com.rst @@ -0,0 +1,80 @@ +======== +Viva.com +======== + +**Viva.com** is a payment service that offers payment solutions through the **viva.com Terminal** +app for :doc:`physical <../terminals>` and virtual terminals. + +.. note:: + - Viva.com payment terminals do not require an :doc:`IoT Box ` to + operate. + - `Many European countries `_ support the use of Viva.com + payment terminals. + - The viva.com Terminal app turns a smartphone with an NFC chip into a `payment terminal + `_. + +.. important:: + Odoo only supports the Euro currency with viva.com. + +.. seealso:: + - `List of supported terminals `_ + - `List of supported payment methods `_ + +.. _viva/configuration: + +Viva.com configuration +====================== + +To configure a viva.com terminal, go to the `Viva.com website `_, create an +account, and then follow these steps: + +#. On the viva.com dashboard, go to :menuselection:`Settings --> API Access --> General`. +#. Copy the `Merchant ID and API key + `_. +#. Copy the `Client ID and the generated Client secret (POS API credentials) + `_. +#. Download the viva.com Terminal app on a device, then generate and copy the `activation code + `_. +#. On the viva.com dashboard, go to :menuselection:`Sales --> Sales Transactions --> Physical + Payments --> Card Terminals`. +#. Create a new `card terminal and paste the activation code + `_. +#. Copy the :guilabel:`Terminal ID` generated by the terminal activation. + +.. warning:: + The POS API credentials are only displayed once. Make sure to keep a copy to secure them. + +.. note:: + - The POS API credentials are for APIs that use Basic Authentication, including those for Android + and iOS POS activation and the `Cloud Terminal API + `_. + +Odoo POS configuration +====================== + +To connect the viva.com terminal with Odoo Point of Sale, follow these steps: + +#. Go to :menuselection:`Point of Sale --> Configuration --> Settings`, scroll down to the + :guilabel:`Payment Terminals` section, enable the :guilabel:`Viva.com` terminal, and click + :guilabel:`Save`. +#. Go to :menuselection:`Point of Sale --> Configuration --> Payment Methods` and :doc:`create a + payment method <../../payment_methods>`. +#. Set the :guilabel:`Journal` field to :guilabel:`Bank`. +#. Select the desired point of sale in the :guilabel:`Point of Sale` field. +#. Set the :guilabel:`Integration` field to :guilabel:`Terminal`. +#. Set the :guilabel:`Integrate with` field to :guilabel:`Viva.com`. +#. Paste the copied information from :ref:`viva.com ` into the corresponding + fields: + + - :guilabel:`Merchant ID` + - :guilabel:`API Key` + - :guilabel:`Client ID` + - :guilabel:`Client secret` + - :guilabel:`Terminal ID` + +#. Save the form and copy the generated webhook URL from the :guilabel:`Viva Com Webhook + Endpoint` field. +#. Go to the :ref:`viva.com ` account and paste the webhook URL into the + `corresponding field + `_. +#. Click :guilabel:`Save`. diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet.rst b/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet.rst deleted file mode 100644 index 140d1d8e7a..0000000000 --- a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet.rst +++ /dev/null @@ -1,120 +0,0 @@ -=========== -Viva Wallet -=========== - -Connecting a **Viva Wallet** :doc:`payment terminal <../terminals>` allows you to offer a fluid -payment flow to your customers and ease the work of your cashiers. - -.. note:: - Viva Wallet lets you turn your phone into a mobile card reader: `Tap On Phone - `_. - -Configuration -============= - -Start by creating your Viva Wallet account on `Viva Wallet's website `_. - -Locate your Viva Wallet credentials ------------------------------------ - -When configuring Viva Wallet in Point of Sale, you need to use specific credentials that are -available in your Viva Wallet account. These credentials include your :ref:`Merchant ID -`, :ref:`API key `, :ref:`POS API credentials -`, and :ref:`Terminal ID ` number. - -.. _viva_wallet/id-key: - -Merchant ID and API key -~~~~~~~~~~~~~~~~~~~~~~~ - -Locate your `Merchant ID and API key following the Viva documentation -`_. -Then, save the keys and paste them into the Odoo :guilabel:`Merchant ID` and :guilabel:`API Key` -fields :ref:`when creating the payment method `. - -.. image:: viva_wallet/access-cred.png - :alt: merchant ID and API key fields - -.. note:: - These credentials are used for APIs that authenticate with Basic Auth. - -.. _viva_wallet/pos-api: - -POS API credentials -~~~~~~~~~~~~~~~~~~~ - -Locate and generate your `POS API credentials following the Viva documentation -`_. -Then, save the keys and paste them in the Odoo :guilabel:`Client secret` and :guilabel:`Client ID` -fields :ref:`when creating the payment method `. - -.. warning:: - These credentials are only displayed once. Ensure you keep a copy to secure them. - -.. image:: viva_wallet/api-cred.png - :alt: Client secret and client ID fields - -.. note:: - These credentials are used for Android and iOS POS Activation requests, as well as the Cloud - Terminal API. - -.. _viva_wallet/identifier: - -Terminal ID -~~~~~~~~~~~ - -Your terminal ID number is used to identify your terminal. To find it: - -#. Go to your Viva Wallet account and select the relevant account. -#. Go to :menuselection:`Sales --> Physical payments --> Card terminals` in the navigation menu. - -The terminal ID number is located under the :guilabel:`Terminal ID (TID)` column. Save it to paste -it into the :guilabel:`Terminal ID` field :ref:`when creating the payment method -`. - -.. image:: viva_wallet/terminal-id.png - :alt: Viva terminal ID - -.. _viva_wallet/method-creation: - -Configure the payment method ----------------------------- - -#. :doc:`Activate the POS Viva Wallet module <../../../../general/apps_modules>` to enable the - payment terminal. -#. :doc:`Create the related payment method <../../payment_methods>` by going to - :menuselection:`Point of Sale --> Configuration --> Payment Methods` and clicking - :guilabel:`New`. -#. Set the journal type as :guilabel:`Bank`. -#. Select :guilabel:`Viva Wallet` in the :guilabel:`Use a Payment Terminal` field. -#. Fill in the mandatory fields with your: - - - :ref:`Merchant ID and API key ` - - :ref:`Client ID and Client secret ` - - :ref:`Terminal ID ` - -#. Save the form and copy the generated webhook URL from the :guilabel:`Viva Wallet Webhook - Endpoint` field. This URL is necessary :ref:`when configuring the webhook `. - -.. image:: viva_wallet/create-method-viva-wallet.png - :alt: payment method creation form - :scale: 75% - -.. _viva_wallet/webhook: - -Configure the webhook ---------------------- - -Webhooks allow you to receive real-time notifications whenever a transaction occurs within your Viva -Wallet account. Set them up for `payment transactions following the Viva documentation -`_. - -.. seealso:: - `Setting up webhooks `_ - -Link the payment method to a POS --------------------------------- - -You can select the payment method in your POS settings once the payment method is created. To do so, -go to the :ref:`POS' settings ` and add the payment method under the -:guilabel:`Payment methods` field of the :guilabel:`Payment` section. diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/access-cred.png b/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/access-cred.png deleted file mode 100644 index 1d15a781a2..0000000000 Binary files a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/access-cred.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/api-cred.png b/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/api-cred.png deleted file mode 100644 index ce6c3b6d95..0000000000 Binary files a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/api-cred.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/create-method-viva-wallet.png b/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/create-method-viva-wallet.png deleted file mode 100644 index c4255db4ee..0000000000 Binary files a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/create-method-viva-wallet.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/terminal-id.png b/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/terminal-id.png deleted file mode 100644 index 7c60ed03e0..0000000000 Binary files a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/terminal-id.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/worldline.rst b/content/applications/sales/point_of_sale/payment_methods/terminals/worldline.rst index dadc9d50ae..fdd14efd47 100644 --- a/content/applications/sales/point_of_sale/payment_methods/terminals/worldline.rst +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/worldline.rst @@ -2,92 +2,80 @@ Worldline ========= -Connecting a payment terminal allows you to offer a fluid payment flow to your customers and ease -the work of your cashiers. +`Worldline `_ offers payment solutions through :doc:`payment terminals +<../terminals>` to handle customer transactions. .. important:: - - Worldline payment terminals require an :doc:`IoT Box `. - - Worldline is currently only available in Belgium, the Netherlands and Luxembourg. - - Odoo is compatible with Worldline terminals that use the CTEP protocol (e.g., the Yomani XR and - Yoximo terminals). If you have any doubts, contact your payment provider to ensure your - terminal's compatibility. + - Connecting a Worldline payment terminal to Odoo requires an :doc:`IoT system + `. + - Worldline is only available in **Belgium**, **the Netherlands**, and **Luxembourg** with Odoo. + - Odoo is compatible with Worldline terminals that use the CTEP protocol (e.g., the **Yomani XR** + and **Yoximo** terminals). Contact the payment provider to confirm the terminal's + compatibility if necessary. + +.. _pos/worldline/configuration: + +Worldline configuration +======================= + +First, enable the Worldline payment terminal in the :ref:`POS settings ` +under :guilabel:`Payment Terminals`. Then :doc:`connect the IoT system to Odoo +` and follow these steps on the terminal: + +#. **Configure the ECR protocol**: + + #. Press :menuselection:`"." --> 3 --> Stop --> 3 --> 0 --> 9`. + #. Enter the technician password **1235789** and press **OK**. + #. Press :menuselection:`4 --> 2 --> CTEP (ECR protocol)`. Press **OK** to confirm each of the + following checks: **CTEP ticket ECR**, **ECR ticket width**, and **Character set**. + #. Press **Stop** three times; the terminal restarts automatically. +#. **Set the hostname**: + + #. Press :menuselection:`"." --> 3 --> Stop --> 3 --> 0 --> 9`. + #. Enter the technician password **1235789** and press **OK**. + #. Press :menuselection:`4 --> 9 --> TCP/IP (ECR physical conf.)` and **OK** twice. + #. Enter the :ref:`IoT's IP address ` on the **Hostname** screen by + confirming each number with **OK** until the colon symbol, then confirm the step with **OK**. + For example, if the IP address is `10.30.19.4:8069`, press :menuselection:`10 --> OK --> 30 + --> OK --> 19 --> OK --> 4 --> OK --> OK`. +#. **Set the port number**: + + #. Enter **9001** (if using an :doc:`IoT box `) or **9050** + (if using a :doc:`Windows virtual IoT `) on the + **Network domain name** screen and press **OK** twice. + #. Press **Stop** three times; the terminal restarts automatically. + +The terminal is now active and displays the **Read card** screen. -Configuration -============= - -Connect an IoT system ---------------------- - -Connecting a Worldline Payment Terminal to Odoo is a feature that requires an IoT system. For more -information on how to connect one to your database, please refer to the -:doc:`IoT documentation `. - -Configure the protocol ----------------------- - -From your terminal, click on :menuselection:`"." --> 3 --> stop --> 3 --> 0 --> 9`. Enter the -technician password **"1235789"** and click on :menuselection:`OK --> 4 --> 2`. Then, click on -:menuselection:`Change --> CTEP (as Protocole ECR) --> OK`. Click on **OK** thrice on the subsequent -screens (*CTEP ticket ECR*, *ECR ticket width*, and *Character set*). Finally, press **Stop** three -times; the terminal automatically restarts. - -Set the IP address ------------------- - -From your terminal, click on :menuselection:`"." --> 3 --> stop --> 3 --> 0 --> 9`. Enter the -technician password **"1235789"** and click on :menuselection:`OK --> 4 --> 9`. Then, click on -:menuselection:`Change --> TCP/IP` (*TCP physical configuration* screen) :menuselection:`--> OK --> -OK` (*TCP Configuration client* screen). - -Finally, set up the hostname and port number. - -Hostname -~~~~~~~~ - -| To set up the hostname, enter your IoT system's IP address' sequence numbers and press **OK** at - each "." until you reach the colon symbol. -| Then, press **OK** twice. - -.. example:: - | Here's an IP address sequence: `10.30.19.4:8069`. - | On the *Hostname screen*, type :menuselection:`10 --> OK --> 30 --> OK --> 19 --> OK --> 4 - --> OK --> OK`. +.. important:: + The `9050` port must be added as a :ref:`Windows Firewall exception ` + for the :doc:`Windows virtual IoT `. .. tip:: - Your IoT system's IP address is available on the :ref:`IoT system's card in the IoT app - `. - -Port number -~~~~~~~~~~~ - -On the *Port number* screen, enter **9001** (or **9050** for Windows) and click on -:menuselection:`OK` (*ECR protocol SSL no*) :menuselection:`--> OK`. Click on **Stop** three times; -the terminal automatically restarts. - -.. warning:: - For the :doc:`Windows virtual IoT `, the `9050` port must be added - as a :ref:`Windows Firewall exception `. + To check the terminal's connection status, open the IoT app and click the :ref:`IoT system's + card `. -Configure the payment method ----------------------------- +.. _pos/worldline/odoo-configuration: -Enable the payment terminal :ref:`in the application settings ` and -:doc:`create the related payment method <../../payment_methods>`. Set the journal type as -:guilabel:`Bank` and select :guilabel:`Worldline` in the :guilabel:`Use a Payment Terminal` field. -Then, select your terminal device in the :guilabel:`Payment Terminal Device` field. +Odoo configuration +================== -.. image:: worldline/worldline-payment-terminals.png +To connect the Worldline terminal with Odoo Point of Sale, follow these steps: -Once the payment method is created, you can select it in your POS settings. To do so, go to the -:ref:`POS' settings `, click :guilabel:`Edit`, and add the payment method -under the :guilabel:`Payments` section. +#. Go to :menuselection:`Point of Sale --> Configuration --> Payment Methods` and :doc:`create a + payment method <../../payment_methods>`. +#. Set the :guilabel:`Journal` field to :guilabel:`Bank`. +#. Set the :guilabel:`Integration` field to :guilabel:`Terminal`. +#. Set the :guilabel:`Integrate with` field to :guilabel:`Worldline`. +#. Select the configured device in the :guilabel:`Payment Terminal Device` field and save. +#. Go to :menuselection:`Point of Sale --> Configuration --> Settings` and add the created payment + method to the :guilabel:`Payment Methods` list to make it available in the POS interface. +#. Click :guilabel:`Save`. .. _worldline/yomani-info: .. tip:: - - Technician password: `1235789` - - To reach Wordline's technical assistance, call `02 727 61 11` and choose "merchant". Your call - is automatically transferred to the desired service. - - Configure the cashier terminal if you have both a customer and a cashier terminal. - - To avoid blocking the terminal, check the initial configuration beforehand. - - Set a fixed IP to your IoT Box’s router to prevent losing the connexion. + - If a setup uses separate cashier and customer payment terminals, :ref:`configure + ` the cashier terminal first. + - To prevent connection loss, set a fixed IP address on the IoT Box’s router or :ref:`restart + the virtual IoT server `. diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/worldline/worldline-payment-terminals.png b/content/applications/sales/point_of_sale/payment_methods/terminals/worldline/worldline-payment-terminals.png deleted file mode 100644 index c3c28ea2c6..0000000000 Binary files a/content/applications/sales/point_of_sale/payment_methods/terminals/worldline/worldline-payment-terminals.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/pos_hardware.rst b/content/applications/sales/point_of_sale/pos_hardware.rst new file mode 100644 index 0000000000..8ff6f1d421 --- /dev/null +++ b/content/applications/sales/point_of_sale/pos_hardware.rst @@ -0,0 +1,176 @@ +======== +Hardware +======== + +Odoo Point of Sale supports integration with a variety of hardware, including :doc:`payment +terminals ` and cash drawers, as well as :ref:`customer displays +`, :ref:`scales `, :doc:`barcode scanners `, +:doc:`ePOS printers `, and in-store :doc:`electronic shelf labels +`. + +.. _pos/display: + +Customer display +================ + +The **customer display** feature provides real-time updates on a secondary screen for customers +during the checkout process. This screen shows the :ref:`items in the cart `, the subtotal +as items are added, and details throughout the payment process. It also displays the total amount, +the selected :doc:`payment method `, and any change to be returned. + +.. image:: pos_hardware/display.png + :alt: customer screen + :scale: 50 % + +.. note:: + Both the customer and POS displays must have a minimum diagonal size of 6 inches. For optimal + readability, larger screens are recommended. + +Configuration +------------- + +Depending on the POS setup, the feature can be displayed directly on a secondary screen connected +via USB-C or HDMI or on a screen connected through an IoT system. + +The feature is activated by default, but its background image can still be configured. To do so, +navigate to the :ref:`POS settings ` and scroll down to the +:guilabel:`Connected Devices` section. Then, click :guilabel:`Upload your file` to set a background +image. + +For displays connected using an :doc:`IoT system <../../general/iot>`: + +#. Navigate to the :ref:`POS settings `. +#. Enable the :guilabel:`IoT Box` option to activate the IoT system in POS. +#. Click :guilabel:`Save`, which activates the IoT app in Odoo. +#. :doc:`Connect and configure an IoT system <../../general/iot/connect>` for a :doc:`display + <../../general/iot/devices/screen>`. +#. Return to the :ref:`POS settings ` and select an IoT-connected screen + using the :guilabel:`Customer Display` field. + +Opening the customer display +---------------------------- + +To open the customer display, follow these steps: + +#. :ref:`Open the POS register `. +#. Click the :icon:`fa-bars` (:guilabel:`hamburger menu`) icon. +#. Click the :icon:`fa-desktop` (:guilabel:`Customer Display`) icon, which opens the customer + display either in a new window to drag onto the second screen or directly onto the IoT-connected + screen. + +.. note:: + For IoT-connected screens, both devices need to be connected to the same local network. + +.. seealso:: + - :doc:`configuration/pos_iot` + - :doc:`../../general/iot` + +For POS terminals running the Odoo Android app with dual-screen support, + +#. :doc:`Activate the Point of Sale Mobile module <../../general/apps_modules>` to enable the + customer display. +#. :ref:`Open the POS register `. +#. Click the :icon:`fa-bars` (:guilabel:`hamburger menu`) icon. +#. Click the :icon:`fa-desktop` (:guilabel:`Customer Display`) icon, which opens the customer + display on the terminal's secondary screen. + +.. _pos/scale: + +Scale +===== + +.. important:: + In EU member states, `certification is legally required + `_ + to use a scale as an integrated device. + +Prerequisite +------------ + +Connecting a scale requires the use of an **IoT System**. + +.. seealso:: + - :doc:`../../general/iot/connect` + - :doc:`../../general/iot/devices/scale` + +Configuration +------------- + +Scale connection +~~~~~~~~~~~~~~~~ + +#. :ref:`Access the POS settings `. +#. Scroll down to the :guilabel:`Connected Devices` section and enable :guilabel:`IoT Box`. +#. Select the scale in the :guilabel:`Electronic Scale` field. +#. Click :guilabel:`Save`. + +.. tip:: + Alternatively, click the :icon:`fa-ellipsis-v` (:guilabel:`Dropdown menu`) icon on a POS card and + click :guilabel:`Edit` to access this setting. + +Product configuration +~~~~~~~~~~~~~~~~~~~~~ + +In order to weigh products using an integrated scale, go to :menuselection:`Point of Sale --> +Products --> Products`, create a product or open an existing product form, and configure it as +follows: + +#. Ensure the :guilabel:`Point of Sale` checkbox is activated for the product to be available in + POS. +#. On the :guilabel:`General Information` tab, define a :guilabel:`Sales Price` per :guilabel:`kg`. + + .. note:: + This step requires to enable the :doc:`Units of Measure + <../../inventory_and_mrp/inventory/product_management/configure/uom>` feature. To activate it: + + #. Go to :menuselection:`Inventory --> Configuration --> Settings`. + #. Scroll down to the :guilabel:`Products` section and activate :guilabel:`Units of Measure`. +#. Go to the :guilabel:`Point of Sale` tab and activate :guilabel:`To Weigh With Scale`. This + enables the product to be weighed directly on the connected scale at the POS. + +.. important:: + The selected unit of measure for weighable products must be :guilabel:`kg` to ensure compliance + with **European regulations**. + +.. seealso:: + :doc:`../../inventory_and_mrp/inventory/product_management/configure/uom` + +European regulations +-------------------- + +When using scales in commercial transactions, the database integrated with a scale must be +configured to meet specific European requirements. This includes supporting at least three decimal +places for accuracy and using proper rounding for units of measure, such as `kg` instead of generic +`units`. + +If the database is not compliant, a red :icon:`fa-balance-scale` (:guilabel:`scale`) icon displays +as a warning. Click this icon to view the reasons for non-compliance and then select +:guilabel:`Apply changes` to automatically apply the necessary changes to the settings. Once the +database meets all regulatory requirements, the :icon:`fa-balance-scale` (:guilabel:`scale`) icon +turns green. + +.. image:: pos_hardware/legal-requirements.png + :scale: 75 % + +.. admonition:: Additional guidelines + + Both the :ref:`customer ` and POS displays must have a minimum diagonal + size of 6 inches. For optimal readability, larger screens are recommended. + +Using a scale in PoS +-------------------- + +#. :ref:`Open the POS register `. +#. Select the product to weigh on the order screen or scan its barcode. +#. Place the product on the scale and wait for the weight to be displayed in the popup window. +#. Once the weight is determined, the price is automatically computed. +#. Click :guilabel:`Order` :icon:`fa-angle-double-right` to add the product to the cart. +#. Remove the previous product from the scale. + +.. image:: pos_hardware/weigh.png + :alt: weighing window + :scale: 85 % + +.. important:: + Make sure the scale returns to `zero` before weighing a new product. If it does not, the + :guilabel:`Order` :icon:`fa-angle-double-right` button remains unclickable until it is reset. diff --git a/content/applications/sales/point_of_sale/pos_hardware/display.png b/content/applications/sales/point_of_sale/pos_hardware/display.png new file mode 100644 index 0000000000..83982ebc95 Binary files /dev/null and b/content/applications/sales/point_of_sale/pos_hardware/display.png differ diff --git a/content/applications/sales/point_of_sale/pos_hardware/legal-requirements.png b/content/applications/sales/point_of_sale/pos_hardware/legal-requirements.png new file mode 100644 index 0000000000..c45c9e4d1f Binary files /dev/null and b/content/applications/sales/point_of_sale/pos_hardware/legal-requirements.png differ diff --git a/content/applications/sales/point_of_sale/pos_hardware/weigh.png b/content/applications/sales/point_of_sale/pos_hardware/weigh.png new file mode 100644 index 0000000000..48d9a8efcb Binary files /dev/null and b/content/applications/sales/point_of_sale/pos_hardware/weigh.png differ diff --git a/content/applications/sales/point_of_sale/pricing/discounts.rst b/content/applications/sales/point_of_sale/pricing/discounts.rst index 223b1465f3..11eaa87938 100644 --- a/content/applications/sales/point_of_sale/pricing/discounts.rst +++ b/content/applications/sales/point_of_sale/pricing/discounts.rst @@ -13,7 +13,7 @@ Apply manual discounts ====================== If you seldom use discounts, applying manual ones might be the easiest -solution for your Point of Sale. +solution for your point of sale. You can either apply a discount on the whole order or on specific products inside an order. @@ -34,7 +34,7 @@ Apply a global discount ----------------------- To apply a discount on the whole order, go to :menuselection:`Point of -Sales --> Configuration --> Point of Sale` and select your PoS. +Sale --> Configuration --> Point of Sale` and select your PoS. Once on your PoS form, select *Global Discounts*, under the *Pricing* category. @@ -62,7 +62,7 @@ Apply time-limited discounts ============================ To activate time-limited discounts, you must activate the *Pricelists* -feature. To do so, go to :menuselection:`Point of Sales --> +feature. To do so, go to :menuselection:`Point of Sale --> Configuration --> Point of Sale` and open your PoS. Then, enable the pricelist feature. @@ -98,4 +98,5 @@ pricelist. :align: center :alt: View of the button to use for time-limited discounts via the pos interface -Click on it to instantly update the prices with the selected pricelist. Then, you can finalize the order. +Click on it to instantly update the prices with the selected pricelist. Then, you can finalize the +order. diff --git a/content/applications/sales/point_of_sale/pricing/fiscal_position.rst b/content/applications/sales/point_of_sale/pricing/fiscal_position.rst index 759847adff..481518d7f3 100644 --- a/content/applications/sales/point_of_sale/pricing/fiscal_position.rst +++ b/content/applications/sales/point_of_sale/pricing/fiscal_position.rst @@ -27,7 +27,7 @@ Then, set a default fiscal position that should be applied to all sales in the s According to the :doc:`fiscal localization package <../../../finance/fiscal_localizations>` activated, several fiscal positions are preconfigured and can be set and used in POS. However, you -can also :ref:`create new fiscal positions `. +can also :ref:`create new fiscal positions `. .. note:: If you do not set a fiscal position, the tax remains as defined in the **customer taxes** field diff --git a/content/applications/sales/point_of_sale/receipts_invoices.rst b/content/applications/sales/point_of_sale/receipts_invoices.rst index ab94bad12e..fc681878b4 100644 --- a/content/applications/sales/point_of_sale/receipts_invoices.rst +++ b/content/applications/sales/point_of_sale/receipts_invoices.rst @@ -19,7 +19,7 @@ Receipt Printing` setting. :alt: POS receipt .. seealso:: - - :doc:`restaurant/bill_printing` + - :ref:`pos/restaurant/bills` - :doc:`configuration/epos_printers` Reprint a receipt diff --git a/content/applications/sales/point_of_sale/restaurant.rst b/content/applications/sales/point_of_sale/restaurant.rst index 216a8f2486..cc2e7c359b 100644 --- a/content/applications/sales/point_of_sale/restaurant.rst +++ b/content/applications/sales/point_of_sale/restaurant.rst @@ -1,55 +1,335 @@ -:show-content: - =================== Restaurant features =================== -Managing a restaurant or a bar comes with specific needs. The Point of Sale application provides -various features that allow performing all the required tasks in such businesses. +Odoo Point of Sale provides various features to manage a restaurant or a bar: + +- :ref:`Organizing the floors and tables `; +- :ref:`Taking orders `; +- :ref:`Communicating with the kitchen or bar through the POS `; +- :ref:`Printing and splitting bills `; +- :ref:`Collecting tips `; +- :doc:`Setting different taxes for takeaway food `. + +Three main buttons in the POS register allow for navigating between the :ref:`Floor plan +` view, tables, and :ref:`orders `: + +- :guilabel:`Plan`: Access the :ref:`Floor plan ` view. +- :guilabel:`Table`: Enter a table or order number, then click :guilabel:`Jump` to access them. The + button's label updates to display the selected number. When applicable, click :guilabel:`Book + table` to confirm the table's occupancy. +- :icon:`fa-plus-circle` (:guilabel:`order`): :ref:`Create a direct sales order ` + that is not linked to any table. Each click generates the next order in the sequence. Click + :guilabel:`Release Order` to cancel the order (if no products have been added) and return to the + :ref:`Floor plan ` view. + +.. note:: + - When :guilabel:`Table Booking` is enabled in the :ref:`POS settings `, + a :guilabel:`Booking` button appears on the main interface for viewing and managing bookings. + - Entering a number through the :guilabel:`Table` button that does not match an existing table + number creates a direct sales order. + +.. important:: + To configure restaurant-specific settings, the :guilabel:`Is a Bar/Restaurant` setting under the + :guilabel:`Restaurant Mode` section must be enabled in the :ref:`POS settings + `. + +.. _pos/restaurant/floors: -Once the POS is set to be used in a restaurant or a bar, you can: +Floors and tables +================= -- :doc:`organize your floors and tables to reflect your interior `; -- :ref:`take orders `; -- :doc:`communicate with the kitchen or the bar through the POS `; -- :doc:`print bills in advance and split them `; -- :doc:`collect tips `; and -- :doc:`set different taxes for takeaway food `. +The :guilabel:`Floor plan` view is the first screen displayed when :ref:`accessing the POS register +`. It enables managing restaurant floors and tables, and monitoring +table status in real time (occupancy, reservations, and kitchen orders). -.. _restaurant/configuration: +.. example:: + .. image:: restaurant/plan-understand.png + :alt: example of a floor plan view with visual keys to understand it. + :scale: 90 % + + - Table 101: The table is currently available but booked for 15:00. + - Table 102: The table is booked, and an order is sent to the kitchen. + - Table 103: The 12:00 table is running late. + - Table 104: The table has a pending order. + - Table 105: The table is available. Configuration -============= +------------- -To enable the restaurant and bar-specific features, go to :menuselection:`Point of Sale --> -Configuration --> Settings`, select the POS, and activate :guilabel:`Is a Bar/Restaurant`. +Creating floors and tables allows managing table selection and :ref:`orders +`. -These features are displayed in the :guilabel:`Restaurant & Bar` section. +.. _pos/restaurant/floors/backend: -.. image:: restaurant/restaurant-bar-section.png - :align: center - :alt: restaurant and bar-specific features +From the POS backend +~~~~~~~~~~~~~~~~~~~~ -.. _restaurant/orders: +To create floors and tables from the backend, go to :menuselection:`Point of Sale --> Configuration +--> Floor Plans`, and click :guilabel:`New`. Follow the next steps to configure the :guilabel:`Floor +plan`: -Take orders -=========== +#. Enter a :guilabel:`Floor Name`. +#. Select the related :guilabel:`Point of Sales`. +#. Optionally, hover the mouse over the placeholder image and click the :icon:`fa-pencil` + (:guilabel:`Edit`) icon to add a background image to the restaurant layout. +#. Click :guilabel:`Add a line` to create and configure a table: -Click a table to access the POS interface and start taking your customer's order. The system -automatically associates the orders and the table, allowing you to add more items later and generate -a bill specifically for that table's orders. + - Enter a :guilabel:`Table Number`. + - Fill in the number of :guilabel:`Seats`. + - Set the table's :guilabel:`Shape`. +#. Optionally, activate additional settings by clicking the :icon:`oi-settings-adjust` + (:guilabel:`settings`) icon: -Once you have taken an order, click :guilabel:`Change table` to return to the floor plan view. + - Adjust the :guilabel:`Height`, :guilabel:`Width`, and :guilabel:`Color`. + - Tick the :guilabel:`Active` checkbox to make a table available or not. +#. Save. .. note:: - As soon as you click a table, the number of guests is automatically set to one. If you - mistakenly select a table, click :guilabel:`Release table` to free it or :ref:`transfer the - customer ` to another table. + - Enable the :guilabel:`Table Booking` setting to assign an :guilabel:`Appointment resource` and + make a table bookable. + - Click the :icon:`fa-trash-o` (:guilabel:`trash`) icon to delete a table. + +.. tip:: + To create a :guilabel:`Floor plan` quickly, go to the :guilabel:`Restaurant Mode` section of the + :ref:`POS settings `. Under :guilabel:`Floors & Tables Map`, type the + floor name in the :guilabel:`Floors` field, and press `Enter`. + +.. _pos/restaurant/floors/frontend: + +From the POS frontend +~~~~~~~~~~~~~~~~~~~~~ + +To create floors and tables from the frontend, :ref:`open the POS register `, +click the :icon:`fa-bars` (:guilabel:`hamburger menu`) icon in the top right corner of the +:guilabel:`Floor plan` view, then :guilabel:`Edit Plan`. To configure the :guilabel:`Floor plan`, +follow the next steps: + +#. Click the :icon:`fa-plus` (:guilabel:`Add Floor`) icon to add a floor. +#. Enter a :guilabel:`Floor name` and click :guilabel:`Apply`. +#. Click the :icon:`fa-paint-brush` (:guilabel:`Change Floor Background`) icon to select a + background color, or click :icon:`fa-camera` :guilabel:`File` to upload an image. +#. Optionally, click the :icon:`fa-pencil-square-o` (:guilabel:`Rename`) icon to rename the + :guilabel:`Floor plan`, the :icon:`fa-files-o` (:guilabel:`Clone`) icon to create a copy, or + the :icon:`fa-trash` (:guilabel:`Delete`) icon to delete it. +#. Click :icon:`fa-plus-circle` :guilabel:`Table` to add a new table. To edit a table, select it + and click one of the following icons: + + - :icon:`fa-user` (:guilabel:`Seats`): Add or change the number of seats. + - :icon:`fa-square-o` (:guilabel:`Square`) or :icon:`fa-circle-o` (:guilabel:`Round`): Change + the table's shape. + - :icon:`fa-paint-brush` (:guilabel:`Change Floor Background`): Change the table's color. + - :icon:`fa-pencil-square-o` (:guilabel:`Rename`): Change the table number. + - :icon:`fa-copy` (:guilabel:`Clone`): Clone the table's attributes using the following table + number. + - :icon:`fa-trash` (:guilabel:`Delete`): Remove the table. +#. Click :guilabel:`Save`. + +.. warning:: + Removing a table or a floor is permanent. + +.. _pos/restaurant/orders: + +Order management +================ + +To take an order, :ref:`open the POS register ` and follow these steps: + +#. Select a :ref:`floor plan ` and click a table or click the + :icon:`fa-plus-circle` (:guilabel:`order`) button at the top to create a direct sales order. +#. Add products to the order. +#. Click :guilabel:`Order` to validate the order. + +When ready, :ref:`process the order payment `. + +.. tip:: + - To cancel a processed order, click :guilabel:`Actions`, then :guilabel:`Cancel Order`. If an + :ref:`order printer is configured `, a cancellation ticket is + automatically printed. + - To switch to another table order, click the button with the table number at the top of the POS + interface, enter a table number, and click :guilabel:`Jump`. + - Click :guilabel:`Release table` to cancel a table's occupancy. + - :ref:`Configure a printer ` to send an order to the kitchen + printer when clicking :guilabel:`Order`. + +.. _pos/restaurant/floors/transfer: + +Order transfer +-------------- + +To transfer an order to another table from the :ref:`POS interface `, click +:guilabel:`Actions`, then :guilabel:`Transfer/Merge`, and choose the target table in the +:ref:`Floor plan ` view: + + - Select an available table to transfer customers and their orders. + - Select an occupied table to merge customers and their orders. + +.. _pos/restaurant/orders-printing: + +Order printing +============== + +Configuration +------------- + +To enable sending orders to a kitchen or a bar printer, :doc:`connect a printer +` to Odoo, go to the :ref:`POS settings `, and +follow these steps: + +#. Scroll down to the :guilabel:`Preparation` section and enable the :guilabel:`Preparation + Printers` setting. +#. Type the printer's name in the :guilabel:`Printers` field and click :guilabel:`Create and edit`. +#. On the printer setup form, select the :guilabel:`Printer Type`: + + - If the printer is connected to an :doc:`IoT system `, select + :guilabel:`Use a printer connected to the IoT`, and choose the relevant :doc:`device + `. This process requires the IoT app and an IoT + system. + - If using an :doc:`Epson printer that does not require an IoT system connection + `, select :guilabel:`Use an Epson printer` and enter the + :guilabel:`Epson Printer IP Address`. +#. Define the product categories to be printed by clicking :guilabel:`Add a line` in the + :guilabel:`Printed Product Categories` field and selecting the preferred category from the + popover. +#. Click :guilabel:`Save & Close`. +#. In the :ref:`POS settings `, click :guilabel:`Save`. + +The printer is then connected to the point of sale and can print kitchen orders and order receipts. + +.. note:: + - Printing kitchen orders requires assigning a :guilabel:`PoS Product Category`. + - To create a :guilabel:`Printed Product Category` on the :guilabel:`Add: Printed Product + Categories` popover, click :guilabel:`New`. Enter a name, select a :guilabel:`Parent Category`, + choose a :guilabel:`Color`, click the :icon:`fa-pencil` (:guilabel:`Edit`) icon to add an + image, determine the product availability, then click :guilabel:`Save & Close`. + +.. tip:: + To access all preparation printers from the :ref:`POS settings `, scroll + down to the :guilabel:`Preparation` section, and click :icon:`oi-arrow-right` + :guilabel:`Printers`. Alternatively, go to :menuselection:`Point of Sale --> Orders --> + Preparations Printers`. + +.. seealso:: + - :doc:`Connect an IoT system to a POS ` + - :doc:`/applications/general/iot/devices/printer` + - :doc:`/applications/general/iot/connect` + - :doc:`/applications/sales/point_of_sale/preparation` + +.. _pos/restaurant/bills: + +Bills and payment +================= + +.. _pos/restaurant/bills/splitting: + +Bill splitting +-------------- + +To allow bill splitting, go to :menuselection:`Point of Sale --> Configuration --> Settings`, and +enable :guilabel:`Allow Bill Splitting` under the :guilabel:`Restaurant Mode` section. + +To split a bill from the :ref:`POS interface `, follow these steps: + +#. Click :guilabel:`Actions`, then :guilabel:`Split`. +#. Select at least one product and click :guilabel:`Split Order`. +#. Proceed with the :ref:`payment `. +#. Click :icon:`fa-chevron-right` :guilabel:`Continue` and repeat the process for each guest. + +.. note:: + - Splitting a bill requires ordering at least two products and creates a sub-order, which must + be paid before returning to the main order. + - Clicking :guilabel:`Split Order` without selecting any product creates an empty sub-order. + +.. _pos/restaurant/bills/payment: + +Order payment +------------- + +To proceed with the order payment from the :ref:`POS interface `, follow +these steps: + +#. Click :guilabel:`Payment`. +#. Select a :doc:`payment method `. +#. Optionally, select a customer and send an invoice to them: + + - Click :icon:`fa-user` :guilabel:`Customer` to select or create a customer account. + - Enable :icon:`fa-file-text-o` :guilabel:`Invoice` to allow sending an invoice to the + customer. +#. Click :guilabel:`Validate`. + +.. _pos/restaurant/bills/printing: + +Receipt printing +---------------- + +To allow receipt printing, go to :menuselection:`Point of Sale --> Configuration --> Settings`, and +enable :guilabel:`Early Receipt Printing` under the :guilabel:`Restaurant Mode` section. + +After a successful :ref:`order payment `, click :icon:`fa-print` +:guilabel:`Print Full Receipt` to generate and print a bill. + +.. important:: + If a printer is :doc:`configured and linked ` to a point of sale, + the receipt is automatically printed upon payment confirmation. + +.. seealso:: + :doc:`/applications/sales/point_of_sale/receipts_invoices` + +.. _pos/restaurant/tips: + +Tips +==== + +Configuration +------------- + +To allow tipping in a POS, go to the :ref:`POS settings `, scroll down to +the :guilabel:`Payment` section, enable :guilabel:`Tips`, and click :guilabel:`Save`. + +.. important:: + - The :guilabel:`Add tip after payment` setting only works for a POS in the United States + of America with an :doc:`Adyen ` or a :doc:`Stripe + ` :ref:`payment terminal `. + - The :guilabel:`Add tip through payment terminal (Adyen)` setting only works with an + :ref:`Adyen ` terminal. + +.. note:: + - Saving the :guilabel:`Tips` setting automatically fills the :guilabel:`Tip product` field + with the preconfigured :guilabel:`[TIPS] Tips` product, which is only used for tips. When + selecting another product in the :guilabel:`Tip product` field, the chosen product is no + longer available on the :ref:`POS interface `. + - Choose only one tip product per POS. + +.. _pos/restaurant/tips/add-tips: + +Tip and payment +--------------- + +To process a tip during :ref:`payment `, follow these steps: + +#. Click :icon:`fa-heart` :guilabel:`Tip`, add the amount, then click :guilabel:`Ok`. +#. Select a :doc:`payment method ` for the order and the tip. +#. Click :guilabel:`Validate`. + +.. tip:: + If the order and the tip are paid using different payment methods, select a :doc:`payment method + ` for the order, click :icon:`fa-heart` :guilabel:`Tip`, add the tip amount, and + click :guilabel:`Ok`. Then, select a payment method for the tip and :guilabel:`Validate` the + payment. + +Tip after payment (US only) +--------------------------- + +To allow tipping after payment for a POS in the United States of America, ensure the :guilabel:`Add +tip after payment` setting is enabled in the :ref:`POS settings `. To +process tips after payment, follow these steps: -.. toctree:: - :titlesonly: +#. On the :guilabel:`Payment` screen, select a :guilabel:`Card` payment method linked to a + :doc:`Stripe ` or :doc:`Adyen + ` terminal. +#. Click :guilabel:`Close Tab` and select the relevant option in the :guilabel:`Add a tip` screen: - restaurant/floors_tables - restaurant/kitchen_printing - restaurant/bill_printing - restaurant/tips + - :guilabel:`15%`, :guilabel:`20%`, or :guilabel:`25%`: Tip rates based on order total. + - :guilabel:`No Tip`. + - :guilabel:`Tip Amount`: Enter the relevant amount in the field. +#. Click :guilabel:`Settle` to validate. diff --git a/content/applications/sales/point_of_sale/restaurant/bill_printing.rst b/content/applications/sales/point_of_sale/restaurant/bill_printing.rst deleted file mode 100644 index 4c52bb07e5..0000000000 --- a/content/applications/sales/point_of_sale/restaurant/bill_printing.rst +++ /dev/null @@ -1,41 +0,0 @@ -===== -Bills -===== - -Typical practices in restaurants or bars are to request the bill before proceeding to payment or -splitting it based on the items ordered. Odoo POS provides two features to perform these tasks -seamlessly: **Bill Printing** and **Bill Splitting**. - -Configuration -============= - -To activate the features, go to :menuselection:`Point of Sale --> Configuration --> Settings`, -select the POS, and activate :guilabel:`Early Receipt Printing` and :guilabel:`Allow Bill Splitting` -in the :guilabel:`Restaurant & Bar` section. - -.. image:: bill_printing/settings.png - :align: center - :alt: activate the bill printing and bill splitting features in the POS settings - -Bill printing -============= - -From an open session, click :menuselection:`Bill --> Print` at any moment to generate and print a -bill. - -.. note:: - The printed bill is **not** final and will be updated to reflect any changes to the order. - -Bill splitting -============== - -From an open session, click :guilabel:`Split` to select the items to regroup. Once everything is -selected, click :guilabel:`Payment` and proceed to checkout for these items. Repeat for each guest. - -.. note:: - - Once you return to the table, the selected items are no longer on order, as they have been paid - for. - - The feature is available as soon as at least two items are ordered. - -.. seealso:: - - :doc:`floors_tables` diff --git a/content/applications/sales/point_of_sale/restaurant/bill_printing/settings.png b/content/applications/sales/point_of_sale/restaurant/bill_printing/settings.png deleted file mode 100644 index 32c1759400..0000000000 Binary files a/content/applications/sales/point_of_sale/restaurant/bill_printing/settings.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/restaurant/floors_tables.rst b/content/applications/sales/point_of_sale/restaurant/floors_tables.rst deleted file mode 100644 index a01a9a7921..0000000000 --- a/content/applications/sales/point_of_sale/restaurant/floors_tables.rst +++ /dev/null @@ -1,98 +0,0 @@ -================= -Floors and tables -================= - -The **Floor plan view** enables you to manage restaurant floors and table arrangements and monitor -table status in real time — including occupancy, reservations, and kitchen orders. - -.. image:: floors_tables/plan-understand.png - :alt: example of a floor plan view with visual keys to understand it. - :scale: 90 % - -- Table 101: The table is available now but booked at 15:00. -- Table 102: An order has been placed and sent to the kitchen. -- Table 103: The table was booked at 12:00, but customers are late. -- Table 104: Two items are waiting to be sent to the kitchen. -- Table 105: The table is available. - -Configuration -============= - -From the POS backend --------------------- - -To create floors and tables from the backend, go to :menuselection:`Point of Sale --> Configuration ---> Floor Plans`, and click :guilabel:`New` to create a floor. Optionally, activate additional -settings by clicking the :icon:`oi-settings-adjust` (:guilabel:`adjust settings`) icon. Then, - -#. Enter a :guilabel:`Floor Name`. -#. Select the related :guilabel:`Point of Sales`. -#. Hover over the placeholder image and click the :icon:`fa-pencil` (:guilabel:`pencil`) icon to add - a background image (e.g., your restaurant layout). -#. Click :guilabel:`Add a line` to create a table and set it up: - - - Enter a :guilabel:`Table Number`. - - Fill in the number of :guilabel:`Seats`. - - Select a :guilabel:`Square` or :guilabel:`Round` :guilabel:`Shape`. - - Assign an :guilabel:`Appointment resource` to make the table bookable. - - Adjust the :guilabel:`Height`, :guilabel:`Width`, and :guilabel:`Color`. -#. Click the :icon:`fa-trash-o` (:guilabel:`delete`) icon to delete a table. - -.. image:: floors_tables/add-floor-backend.png - :alt: window to create a table in the POS backend - -.. tip:: - Create floors on the spot: :ref:`access your POS settings `, type your - floor name in the :guilabel:`Floors` field of the :guilabel:`Floors & Tables Map` section, and - press *enter* or click :guilabel:`Create and edit...` to set it up. - -.. _floors_tables/frontend: - -From the POS front end ----------------------- - -To create floors and tables from the front end, :ref:`open a POS session `, click -the :icon:`fa-bars` (:guilabel:`hamburger menu`) icon in the upper right corner, then -:guilabel:`Edit Plan`. - -#. Add a floor by clicking the :icon:`fa-plus` (:guilabel:`plus`) icon, then enter a name in the - modal window. -#. Click the :icon:`fa-paint-brush` (:guilabel:`paintbrush`) icon to change the background color or - image. -#. Click :icon:`fa-plus-circle` :guilabel:`Table` to add a new table. - -To adjust a specific table, select it and click: - -- The :icon:`fa-user` (:guilabel:`user`) icon to change the number of seats. -- The :icon:`fa-square` (:guilabel:`square`) or :icon:`fa-circle` (:guilabel:`round`) - icon to switch the shape from round to square, and vice versa. -- The :icon:`fa-paint-brush` (:guilabel:`paintbrush`) icon to change the table's color. -- The :icon:`fa-pencil-square-o` (:guilabel:`rename`) icon to change the table number. -- The :icon:`fa-copy` (:guilabel:`clone`) icon to duplicate the table. -- The :icon:`fa-trash` (:guilabel:`bin`) icon to remove the table. - -After making all the necessary modifications, click :guilabel:`Save` or the :icon:`fa-floppy-o` -(:guilabel:`floppy disk`) icon to save. - -.. image:: floors_tables/edit-plan-frontend.png - :alt: the floor plan view in edit mode. - :scale: 85 % - -.. warning:: - Removing a table or a floor cannot be undone. - -.. _pos/floors_tables/transfer: - -Table transfer -============== - -Select a table to move customers to another table, then click :icon:`fa-ellipsis-v` -(:guilabel:`ellipsis`) and :icon:`oi-arrow-right` :guilabel:`Transfer/Merge`. - -In the floor plan view, choose the target table: - -- Select a free table to transfer customers and their orders. -- Select an occupied table to merge customers and their orders. - -.. seealso:: - :doc:`../restaurant` diff --git a/content/applications/sales/point_of_sale/restaurant/floors_tables/add-floor-backend.png b/content/applications/sales/point_of_sale/restaurant/floors_tables/add-floor-backend.png deleted file mode 100644 index 260ab98f29..0000000000 Binary files a/content/applications/sales/point_of_sale/restaurant/floors_tables/add-floor-backend.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/restaurant/floors_tables/edit-plan-frontend.png b/content/applications/sales/point_of_sale/restaurant/floors_tables/edit-plan-frontend.png deleted file mode 100644 index 4f2f323ac6..0000000000 Binary files a/content/applications/sales/point_of_sale/restaurant/floors_tables/edit-plan-frontend.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/restaurant/kitchen_printing.rst b/content/applications/sales/point_of_sale/restaurant/kitchen_printing.rst deleted file mode 100644 index f0e05cda51..0000000000 --- a/content/applications/sales/point_of_sale/restaurant/kitchen_printing.rst +++ /dev/null @@ -1,66 +0,0 @@ -=============== -Orders printing -=============== - -Integrating printers in a restaurant or bar's workflow can enhance communication and collaboration -between the front-of-house and back-of-house teams, leading to a more streamlined and efficient -service. - -Configuration -============= - -.. _kitchen_printing/enable: - -Enable and create printers --------------------------- - -To enable sending orders to a kitchen or bar printer, go to :menuselection:`Point of Sale --> -Configuration --> Settings`, scroll down to the :guilabel:`Restaurant & Bar` section, and enable -:guilabel:`Kitchen Printers`. Type in a name for the printer in the :guilabel:`Printers` field and -click :guilabel:`Create and edit...` to open a setup form. - -To get a list of all the printers already created or to modify an already created printer, click -:guilabel:`--> Printers` and select the desired printer to open the setup form. - -.. image:: kitchen_printing/printers-settings.png - :align: center - :alt: settings to enable the kitchen printers - -.. _kitchen_printing/setup-form: - -Setup form ----------- - -From the :ref:`setup form `, select the :guilabel:`Printer Type` according -to your installation: - -- If your printer is connected to an IoT system, select :guilabel:`Use a printer connected to the - IoT Box` and select the device in the :guilabel:`IoT Device` field. -- If you use an Epson printer that does not require an IoT system, select :guilabel:`Use an Epson - printer` and enter the printer's IP address in the :guilabel:`Epson Printer IP Address` field. - -.. seealso:: - - :doc:`/applications/general/iot/connect` - - :doc:`/applications/general/iot/devices/printer` - - :doc:`../configuration/epos_ssc` - -Set your printer to print specific products based on their POS category. To do so, click -:guilabel:`Add a line` in the :guilabel:`Printed Product Categories` field. If you leave this field -empty, all products are sent to the printer regardless of their POS category. - -.. image:: kitchen_printing/printer-setup.png - :align: center - :alt: setup form to configure a kitchen printer - -Print orders -============ - -From an open session, start taking an order and click :guilabel:`Order` to send it to the bar or the -kitchen. - -.. image:: kitchen_printing/order-button.png - :align: center - :alt: order button from the POS UI to send orders to a kitchen or a bar - -.. note:: - When products can be printed, they appear in green in the cart, and the order button turns green. diff --git a/content/applications/sales/point_of_sale/restaurant/kitchen_printing/order-button.png b/content/applications/sales/point_of_sale/restaurant/kitchen_printing/order-button.png deleted file mode 100644 index 73b3f1abcb..0000000000 Binary files a/content/applications/sales/point_of_sale/restaurant/kitchen_printing/order-button.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/restaurant/kitchen_printing/printer-setup.png b/content/applications/sales/point_of_sale/restaurant/kitchen_printing/printer-setup.png deleted file mode 100644 index 2d5ab131dd..0000000000 Binary files a/content/applications/sales/point_of_sale/restaurant/kitchen_printing/printer-setup.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/restaurant/kitchen_printing/printers-settings.png b/content/applications/sales/point_of_sale/restaurant/kitchen_printing/printers-settings.png deleted file mode 100644 index 4c526830b5..0000000000 Binary files a/content/applications/sales/point_of_sale/restaurant/kitchen_printing/printers-settings.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/restaurant/floors_tables/plan-understand.png b/content/applications/sales/point_of_sale/restaurant/plan-understand.png similarity index 100% rename from content/applications/sales/point_of_sale/restaurant/floors_tables/plan-understand.png rename to content/applications/sales/point_of_sale/restaurant/plan-understand.png diff --git a/content/applications/sales/point_of_sale/restaurant/restaurant-bar-section.png b/content/applications/sales/point_of_sale/restaurant/restaurant-bar-section.png deleted file mode 100644 index 608cae1a9b..0000000000 Binary files a/content/applications/sales/point_of_sale/restaurant/restaurant-bar-section.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/restaurant/tips.rst b/content/applications/sales/point_of_sale/restaurant/tips.rst deleted file mode 100644 index 08467fbbd1..0000000000 --- a/content/applications/sales/point_of_sale/restaurant/tips.rst +++ /dev/null @@ -1,92 +0,0 @@ -==== -Tips -==== - -Tipping is customary in multiple countries. Point of Sale allows tipping in :ref:`shops `, -:doc:`bars <../restaurant>`, or :doc:`restaurants <../restaurant>`. - -.. _configuration: - -Configuration -============= - -To allow tipping in your POS, activate the :guilabel:`Tips` feature in :menuselection:`Point of Sale ---> Configuration --> Settings`. At the top of the page, select the POS in which you wish to allow -**tipping**, scroll down to the :guilabel:`Payment` section and check :guilabel:`Tips`. Once -enabled, add a :guilabel:`Tip Product` in the corresponding field, and save. The designated product -will be used as a reference on customers' receipts. - -.. image:: tips/tips-setup.png - :alt: enable tips in a POS - -.. _tip-product: - -Tip products ------------- - -**Tip products** can be created on the spot. To do so, enter a product's name in the :ref:`Tip -Product ` field and click :guilabel:`Create` or press **enter**. The product is -automatically configured to be used as a tip at the payment screen. - -However, if you wish to be able to select the tip product in a POS session, you must activate the -**Available in POS** setting. To do so, click :guilabel:`Create and edit...` to open the product -configuration form. Then, go to the :guilabel:`Sales` tab, tick the :guilabel:`Available in POS` -checkbox, and click :guilabel:`Save & Close`. - -.. note:: - - When you create a product to use as a tip, leave the **product type** as :guilabel:`Consumable` - to avoid unnecessary inventory movements. - - You can only select one tip product per POS, but you can choose a different one for each. - -Tip using an Adyen terminal ---------------------------- - -If you use an :doc:`Adyen <../payment_methods/terminals/adyen>` payment terminal and wish to enable -**tips** using the terminal, check :guilabel:`Add tip through payment terminal (Adyen)` below the -:ref:`tip settings `. - -Tip after payment ------------------ - -If you use a POS system in a bar or a restaurant, you can enable :guilabel:`Add tip after payment -(North America specific)`. Doing so generates a bill to print and complete manually by the customer -and the waiter. That bill indicates the tip value the customer chooses to give after the payment. - -.. important:: - To use this feature, the selected payment method must have a bank journal attributed. - -Add tips -======== - -To add tips to an order, :ref:`access the payment screen ` and click :guilabel:`♥ Tip`. -Then, enter the tipping amount, click :guilabel:`Confirm` to validate, and process the payment. - -.. image:: tips/add-tip.png - :alt: tip popup window - -Alternatively, you can select the :ref:`tip product ` on the POS interface to add it to -the cart. When selected, the product is automatically set as a tip, and its default value equals its -**Sales Price**. - -Tip using an Adyen terminal ---------------------------- - -During checkout, select **Adyen** as the payment terminal, and send the payment request to the -device by clicking :guilabel:`Send`. The customers are asked to enter the desired tipping amount on -the terminal's screen before proceeding to the payment. - -Tip after payment ------------------ - -At checkout, select a card payment method and click :guilabel:`Close Tab`. Doing so generates a bill -to complete by the customer. - -.. image:: tips/tipping-bill.png - :alt: tipping bill after payment to complete by customers - -On the following screen, click the percentage (:guilabel:`15%`, :guilabel:`20%`, :guilabel:`25%`), -:guilabel:`No Tip`, or enter the tipping amount the customer chose to give. Then, click -:guilabel:`Settle` to move to the following order. - -.. image:: tips/tip-after-payment.png - :alt: screen to select a tip amount to collect after payment diff --git a/content/applications/sales/point_of_sale/restaurant/tips/add-tip.png b/content/applications/sales/point_of_sale/restaurant/tips/add-tip.png deleted file mode 100644 index f5884272f2..0000000000 Binary files a/content/applications/sales/point_of_sale/restaurant/tips/add-tip.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/restaurant/tips/tip-after-payment.png b/content/applications/sales/point_of_sale/restaurant/tips/tip-after-payment.png deleted file mode 100644 index ba73f77d34..0000000000 Binary files a/content/applications/sales/point_of_sale/restaurant/tips/tip-after-payment.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/restaurant/tips/tipping-bill.png b/content/applications/sales/point_of_sale/restaurant/tips/tipping-bill.png deleted file mode 100644 index e64f880252..0000000000 Binary files a/content/applications/sales/point_of_sale/restaurant/tips/tipping-bill.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/restaurant/tips/tips-setup.png b/content/applications/sales/point_of_sale/restaurant/tips/tips-setup.png deleted file mode 100644 index a6fb61b5f2..0000000000 Binary files a/content/applications/sales/point_of_sale/restaurant/tips/tips-setup.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/shop.rst b/content/applications/sales/point_of_sale/shop.rst index 5d957a7c2c..c1a61d8dd6 100644 --- a/content/applications/sales/point_of_sale/shop.rst +++ b/content/applications/sales/point_of_sale/shop.rst @@ -11,4 +11,3 @@ Shop features shop/barcode shop/serial_numbers shop/ship_later - shop/customer_display diff --git a/content/applications/sales/point_of_sale/shop/barcode.rst b/content/applications/sales/point_of_sale/shop/barcode.rst index a350d1fe99..74b0f61856 100644 --- a/content/applications/sales/point_of_sale/shop/barcode.rst +++ b/content/applications/sales/point_of_sale/shop/barcode.rst @@ -58,5 +58,5 @@ Log employees ------------- You can also use a barcode scanner to log your employees. To do so, :ref:`restrict access -` to the POS and :ref:`use barcodes to log your employees in -` your POS. +` to the POS and :ref:`use barcodes to log your employees in +` your POS. diff --git a/content/applications/sales/point_of_sale/shop/customer_display.rst b/content/applications/sales/point_of_sale/shop/customer_display.rst deleted file mode 100644 index 4b8f81fefd..0000000000 --- a/content/applications/sales/point_of_sale/shop/customer_display.rst +++ /dev/null @@ -1,61 +0,0 @@ -================ -Customer display -================ - -The **customer display** feature provides customers with real-time checkout updates on a secondary -display. - -.. image:: customer_display/display.png - :alt: customer screen - -Configuration -============= - -Depending on your POS setup, the feature can be displayed :ref:`locally on a secondary screen -`, :ref:`remotely on another device `, or -:ref:`another monitor connected to an IoT Box `. - -To activate the feature, go to the POS settings, scroll down to the :guilabel:`Connected Devices` -section, and tick the :guilabel:`Customer Display` checkbox. - -.. image:: customer_display/feature-setting.png - :alt: customer display setting checkbox - -.. _customer_display/local: - -Local ------ - -Connect a second screen to your POS and :ref:`open a POS session `. Then, click -:guilabel:`Customer Screen` to open a new window to drag and drop onto the second screen. - -.. _customer_display/remote: - -Remote ------- - -Access your database from another device (any computer, tablet, or smartphone), go to the POS -application, click the vertical ellipsis button (:guilabel:`⋮`) on a POS card, and then -:guilabel:`Customer Display` to open the display remotely. - -.. note:: - The two devices are not required to share the same network. - -.. _customer_display/iot: - -IoT system ----------- - -Connect an IoT box to your database and the second screen to the IoT box. Then, go to -:menuselection:`Point of Sale --> Configuration --> Settings`, scroll down to the -:guilabel:`Connected Devices` section, tick the :guilabel:`IoT Box` checkbox, and select the second -monitor in the :guilabel:`Customer Display` field. - -.. image:: customer_display/iot-setting.png - :alt: iot setting to connect a customer display - -.. note:: - Both devices need to be connected to the same local network. - -.. seealso:: - :doc:`../configuration/pos_iot` diff --git a/content/applications/sales/point_of_sale/shop/customer_display/display.png b/content/applications/sales/point_of_sale/shop/customer_display/display.png deleted file mode 100644 index 4a93f18991..0000000000 Binary files a/content/applications/sales/point_of_sale/shop/customer_display/display.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/shop/customer_display/feature-setting.png b/content/applications/sales/point_of_sale/shop/customer_display/feature-setting.png deleted file mode 100644 index 5290a0b629..0000000000 Binary files a/content/applications/sales/point_of_sale/shop/customer_display/feature-setting.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/shop/customer_display/iot-setting.png b/content/applications/sales/point_of_sale/shop/customer_display/iot-setting.png deleted file mode 100644 index d9676d11e6..0000000000 Binary files a/content/applications/sales/point_of_sale/shop/customer_display/iot-setting.png and /dev/null differ diff --git a/content/applications/sales/rental.rst b/content/applications/sales/rental.rst index 6a0e40f4ee..5b521618c9 100644 --- a/content/applications/sales/rental.rst +++ b/content/applications/sales/rental.rst @@ -1,3 +1,5 @@ +:show-content: + ====== Rental ====== @@ -11,7 +13,13 @@ returned, and invoice customers from this single platform. - `Odoo Rental: product page `_ - `Odoo Tutorials: Rental `_ -.. _rental/pricing: +.. cards:: + + .. card:: Manage deposits + :target: rental/manage_deposits + :large: + + Learn how to create a refundable deposit for rental products. Dashboard ========= @@ -66,6 +74,11 @@ Products`. By default, the :guilabel:`Can be Rented` search filter appears in th Each product kanban card displays that product's name, rental price, and product image (if applicable). +.. seealso:: + :doc:`rental/manage_deposits` + +.. _rental/pricing: + Rental pricing ============== @@ -136,7 +149,7 @@ Odoo always uses two rules to compute the price of a product when a rental order After an order is created, Odoo selects the second line as this is the cheapest option. The customer has to pay three times '3 days' to cover the rental's eight days, for a total of $750. -.. _rental/customer-signature: +.. _rental/order: Rental orders ============= @@ -185,6 +198,8 @@ Once all the information has been entered correctly on the rental order form, cl :guilabel:`Send by Email` button to send the quotation to the customer, or click the :guilabel:`Confirm` button to confirm the order. +.. _rental/customer-signature: + Customer signature ================== @@ -255,6 +270,8 @@ pop-up form that appears. Doing so places a :guilabel:`Picked-up` status banner on the rental order. +.. _rental/return: + Return products =============== @@ -282,3 +299,6 @@ From this drop-down menu, hover over the :guilabel:`Print` option to reveal a su Odoo generates and downloads a PDF, detailing all information about the current status of the rented item(s). + +.. toctree:: + rental/manage_deposits diff --git a/content/applications/sales/rental/manage_deposits.rst b/content/applications/sales/rental/manage_deposits.rst new file mode 100644 index 0000000000..4a5d36e587 --- /dev/null +++ b/content/applications/sales/rental/manage_deposits.rst @@ -0,0 +1,72 @@ +=============== +Manage deposits +=============== + +Requiring fixed deposits is common in many rental scenarios; such as collecting security deposits. + +This document covers the standard options for :ref:`configuring `, +:ref:`collecting ` and :ref:`refunding +` deposits within the **Rentals** app. + +.. _rental/manage_deposits/config: + +Configuration +------------- + +First, create a *deposit service product* for each rental product that requires a deposit. + +To do so, go to :menuselection:`Rental --> Products` and create a :guilabel:`New` product. + +On the product form, give the product a name that indicates it is a deposit. + +.. example:: + If this deposit service product is intended for the *Digital Camera* rental product, the name may + be entered as `Digital Camera Deposit`. + +Next, set the :guilabel:`Product Type` to :guilabel:`Service`, the :guilabel:`Invoicing Policy` to +:guilabel:`Delivered quantities` and then assign a :guilabel:`Sales Price` with the amount to +collect for the deposit. Choose whether or not to include :guilabel:`Sales Taxes` for this deposit +service product. + +Finally, :icon:`fa-cloud-upload` :guilabel:`(save)` the deposit service product. + +.. _rental/manage_deposits/product: + +Collect deposits from an optional product +----------------------------------------- + +On the rental product's form, go to the :guilabel:`Sales` tab and add the :ref:`deposit service +product ` to the :guilabel:`Optional Products`. + +Be sure to configure the rental product's prices on the :ref:`Rental prices ` tab. + +With the above configuration, a :ref:`rental order ` can be created. + +.. important:: + After selecting the rental product in the :guilabel:`Order Lines` tab, be sure to :icon:`fa-plus` + :guilabel:`Add` the deposit service product in the :guilabel:`Configure your product` pop-up. + + The :guilabel:`Configure your product` pop-up only appears if the optional product is set on the + rental product. + +.. tip:: + If :doc:`eCommerce <../../websites/ecommerce>` is installed, add an :guilabel:`Ecommerce + Description` stating the deposit is required in the rental product's :guilabel:`Sales` tab. + + When a customer adds the rental product to their cart, a :guilabel:`Configure your product` + pop-up displays the deposit service product under :guilabel:`Available options`. + + Once the customer clicks :icon:`fa-shopping-cart` :guilabel:`Add` the rental product and the + deposit service product are added to their cart. + +.. image:: manage_deposits/optional-product.png + :alt: A deposit service product listed in the rental quotation. + +.. _rental/manage_deposits/refund: + +Refund deposits upon return +--------------------------- + +Once a customer :ref:`returns the rented product `, reimburse their deposit with a +:doc:`credit note <../../finance/accounting/customer_invoices/credit_notes>` from the invoice, and +change the *delivered quantity* to `0` on the linked sales order. diff --git a/content/applications/sales/rental/manage_deposits/optional-product.png b/content/applications/sales/rental/manage_deposits/optional-product.png new file mode 100644 index 0000000000..8bf695b191 Binary files /dev/null and b/content/applications/sales/rental/manage_deposits/optional-product.png differ diff --git a/content/applications/sales/sales/commissions.rst b/content/applications/sales/sales/commissions.rst index f5a4a333a7..b9806ab123 100644 --- a/content/applications/sales/sales/commissions.rst +++ b/content/applications/sales/sales/commissions.rst @@ -152,3 +152,6 @@ the :guilabel:`Draft` stage into the :guilabel:`Approved` stage. After a plan is approved, Odoo automatically tracks performance and calculates commissions based on the established parameters. + +.. seealso:: + :doc:`Commissions <../../hr/payroll/commissions>` diff --git a/content/applications/sales/sales/products_prices/prices/pricing.rst b/content/applications/sales/sales/products_prices/prices/pricing.rst index 6d31db2dc6..c02d5186e3 100644 --- a/content/applications/sales/sales/products_prices/prices/pricing.rst +++ b/content/applications/sales/sales/products_prices/prices/pricing.rst @@ -9,8 +9,8 @@ time periods, etc., and is useful for creating pricing strategies and optimizing Odoo **Sales** has a useful pricelist feature that can be tailored to fit any unique pricing strategy. Pricelists suggest certain prices, but they can always be overridden on the sales order. -Pricelists configuration -======================== +Configuration +============= To enable pricelists in the Odoo **Sales** app, first navigate to :menuselection:`Sales app --> Configuration --> Settings`. In the :guilabel:`Pricing` section, tick the checkbox next to the @@ -147,12 +147,11 @@ From here, there are several configuration options: Recurring Prices tab -------------------- -Recurring prices are specifically used with :doc:`subscription products -<../../../subscriptions/products>`. When configuring price rules in this tab, keep in mind that -they will only apply to subscription products, or products with recurring prices enabled. +Time-based rules are used specifically with subscription products. Be sure to check out the Odoo +:doc:`Subscriptions ` documentation for more information. In the :guilabel:`Recurring Prices` tab, pricelists are configured with the same options as in the -:guilabel:`Price Rules` tab, with additional columns for :guilabel:`Product Variants` add +:guilabel:`Price Rules` tab, with additional columns for :guilabel:`Product Variants` and :guilabel:`Recurring Plan`. :guilabel:`Product Variants` are configured under products that have one or more values, such as @@ -213,8 +212,13 @@ The :guilabel:`Selectable` can be enabled to allow the customer to choose this p Finally, promotional and loyalty codes can be added to the :guilabel:`E-commerce Promotional Code` field. -.. image:: pricing/sales-pricelist-ecommerce.png - :alt: The Ecommerce tab in a pricelist configuration form. +Tick the :guilabel:`Selectable` checkbox to have this pricelist as a selectable option for customers +to choose as they shop. If the :guilabel:`Selectable` box is left unticked, customers **cannot** +select this pricelist for themselves. + +Lastly, there is the option to add an :guilabel:`E-commerce Promotional Code`. To add a code, type +in the desired promo code that, when entered during the checkout process, applies the pricelist to +the customer, even if the customer does not fall into the previously-specified criteria. Customer pricelist application ============================== diff --git a/content/applications/sales/sales/products_prices/products/variants.rst b/content/applications/sales/sales/products_prices/products/variants.rst index 43bdca4734..6561ead55e 100644 --- a/content/applications/sales/sales/products_prices/products/variants.rst +++ b/content/applications/sales/sales/products_prices/products/variants.rst @@ -147,27 +147,34 @@ Then, enter the name of the value in the :guilabel:`Value` column. Next, check t :guilabel:`Is custom value` column, if the value is custom (i.e. the customer gets to provide unique specifications that are specific to this particular value). -.. note:: - If the :guilabel:`Display Type` - :guilabel:`Color` option is selected, the option to add an HTML - color code will appear to the far-right of the value line, to make it easier for salespeople and - customers to know exactly what color option they're choosing. +Colors +~~~~~~ - .. image:: variants/attribute-value-add-a-line.png - :align: center - :alt: Attribute values tab when add a line is clicked, showing the custom columns. +Next to :guilabel:`Display Type`, select the :guilabel:`Color` option. Go to the +:guilabel:`Attribute Values` tab to modify the value settings. - To choose a color, click the blank circle in the :guilabel:`Color` column, which reveals an HTML - color selector pop-up window. +.. image:: variants/attribute-value-add-image.png + :alt: Add an image of the pattern to an attribute. - .. image:: variants/picking-a-color.png - :align: center - :alt: Selecting a color from the HTML color pop-up window that appears on attribute form. +To choose a color, click the blank circle in the :guilabel:`Color` column, which reveals an HTML +color selector pop-up window. + +.. image:: variants/picking-a-color.png + :alt: Selecting a color from the HTML color pop-up window that appears on attribute form. + +In this pop-up window, select a specific color by dragging the color slider to a particular hue, +and clicking on the color portion directly on the color gradient window. + +Or, choose a specific color by clicking the *dropper* icon, and selecting a desired color that's +currently clickable on the screen. - In this pop-up window, select a specific color by dragging the color slider to a particular hue, - and clicking on the color portion directly on the color gradient window. +If you sell products with specific patterns, you can also add an image to display the +pattern of the product. To do so, click the :icon:`fa-camera` :guilabel:`(camera)` icon, +then click the :icon:`fa-pencil` :guilabel:`(pencil)` icon and select an image from your local +drive. This pattern will appear as a color option on the ecommerce product page. - Or, choose a specific color by clicking the *dropper* icon, and selecting a desired color that's - currently clickable on the screen. +.. image:: variants/ecommerce-pattern-option.png + :alt: Pattern as color option on the ecommerce page. .. tip:: Attributes can also be created directly from the product template by adding a new line and diff --git a/content/applications/sales/sales/products_prices/products/variants/attribute-value-add-a-line.png b/content/applications/sales/sales/products_prices/products/variants/attribute-value-add-a-line.png deleted file mode 100644 index f7f540237f..0000000000 Binary files a/content/applications/sales/sales/products_prices/products/variants/attribute-value-add-a-line.png and /dev/null differ diff --git a/content/applications/sales/sales/products_prices/products/variants/attribute-value-add-image.png b/content/applications/sales/sales/products_prices/products/variants/attribute-value-add-image.png new file mode 100644 index 0000000000..87545db3fc Binary files /dev/null and b/content/applications/sales/sales/products_prices/products/variants/attribute-value-add-image.png differ diff --git a/content/applications/sales/sales/products_prices/products/variants/ecommerce-pattern-option.png b/content/applications/sales/sales/products_prices/products/variants/ecommerce-pattern-option.png new file mode 100644 index 0000000000..9e6906780c Binary files /dev/null and b/content/applications/sales/sales/products_prices/products/variants/ecommerce-pattern-option.png differ diff --git a/content/applications/sales/sales/sales_quotations/quote_template.rst b/content/applications/sales/sales/sales_quotations/quote_template.rst index 6368fca06b..e27fec7c6e 100644 --- a/content/applications/sales/sales/sales_quotations/quote_template.rst +++ b/content/applications/sales/sales/sales_quotations/quote_template.rst @@ -7,8 +7,6 @@ Reusable quotation templates can be made in Odoo's **Sales** app for common prod By using these templates, quotations can be tailored and sent to customers at a quicker pace, without having to create new quotations from scratch every time a sales negotiation occurs. -.. _sales/send_quotations/templates: - Configuration ============= @@ -98,14 +96,6 @@ Both options, :guilabel:`Online Signature` and :guilabel:`Online Payment` can be simultaneously, in which case the customer must provide **both** a signature **and** a payment to confirm an order. -In the :guilabel:`Recurring Plan` field, choose from a variety of pre-configured amounts of time -(e.g. :guilabel:`Monthly`, :guilabel:`Quarterly`, etc.) to designate how often this quotation -template should occur. - -.. note:: - The :guilabel:`Recurring Plan` field **only** applies to subscription plans. For more - information, check out the documentation on :doc:`../../subscriptions/plans`. - Lines tab --------- diff --git a/content/applications/sales/subscriptions.rst b/content/applications/sales/subscriptions.rst index 8f6262a87e..109ef5929f 100644 --- a/content/applications/sales/subscriptions.rst +++ b/content/applications/sales/subscriptions.rst @@ -1,46 +1,277 @@ :show-content: +:hide-toc: ============= Subscriptions ============= -Odoo *Subscriptions* is used to run recurring businesses: :ref:`sell new contracts -`, :doc:`upsell customers `, -keep the churn under control, and :doc:`generate reports -` on the main :abbr:`KPIs (Key Performance Indicators)`: -:abbr:`MRR (Monthly Recurring Revenue)`, :abbr:`ARR (Annual Recurring Revenue)`, retention, churn, -etc. +The Odoo **Subscriptions** app is designed to manage recurring revenue through subscription-based +products or services. It supports automated invoicing, renewal management, and customer lifecycle +tracking. + +Subscriptions can be created manually or automatically through online sales, with varying options +for recurring billing. The app integrates with other Odoo modules such as **Invoicing**, **CRM**, +**Sales**, and **Helpdesk** to support end-to-end subscription workflows. + +.. cards:: + + .. card:: Renew a subscription + :target: subscriptions/renewals + :large: + + Understand the core management activity for subscriptions + + .. card:: Upsell a subscription + :target: subscriptions/upselling + :large: + + Offer more value for current subscribers on the same sales order + + .. card:: Close a subscription + :target: subscriptions/closing + :large: + + Customize subscription plan templates tailored to various product offerings + + .. card:: eCommerce integration + :target: subscriptions/ecommerce + :large: + + Offer subscription products through your Odoo eCommerce store .. seealso:: - `Odoo Tutorials: Subscriptions `_ - - :doc:`/applications/sales/subscriptions/products` - - :doc:`/applications/sales/subscriptions/ecommerce` - - :doc:`/applications/sales/subscriptions/plans` - - :doc:`/applications/sales/subscriptions/upselling` - - :doc:`/applications/sales/subscriptions/renewals` - - :doc:`/applications/sales/subscriptions/closing` - - :doc:`/applications/sales/subscriptions/automatic_alerts` - - :doc:`/applications/sales/subscriptions/scheduled_actions` - - :doc:`/applications/sales/subscriptions/reports` + +Set up recurring plans +====================== + +To get started with subscription products in Odoo, *recurring plans* (previously known as +*recurrence periods*) must first be configured. + +Recurring plans are the time windows in which subscriptions are active before they renew again. +While a subscription is active, customers receive products or services, and may also have access to +additional benefits such as support desk triage. In terms of payment, these recurring plans +designate how often the customer is charged in order to maintain the benefits of their subscription. + +To configure recurring plans, go to :menuselection:`Subscriptions app --> Configuration --> +Recurring Plans`. + +By default, the **Subscriptions** app includes a number of common recurring plans already available, +such as :guilabel:`Monthly` and :guilabel:`Yearly`. + +Create a new recurring plan by clicking :guilabel:`New` on the :guilabel:`Recurring Plans` +dashboard, to reveal a blank form where the plan :guilabel:`Name`, :guilabel:`DETAILS`, +:guilabel:`SELF-SERVICE` and :guilabel:`Pricing` field values are specified. + +.. image:: subscriptions/recurring-plan-blank-form.png + :alt: A blank recurring plan form in the Odoo Subscriptions application. + +.. important:: + The `Days` unit of measure *cannot* be used as a :guilabel:`Billing Period` for subscription + products. The daily recurrence period in Odoo is designated for rentals, and **cannot** be added + to subscription-based sales orders. + + This limitation is there to avoid sales orders that would generate daily invoices. + +DETAILS section +--------------- + +After giving the recurring plan a suitable :guilabel:`Name` (e.g. `Monthly`, `Bi-weekly`, +`Quarterly`, etc.), proceed to the form's :guilabel:`DETAILS` section to fill out the following +configuration fields: + +- :guilabel:`Billing Period`: determines the recurrence period of the recurring plan. Set the + numerical value in the text field and contextualize the quantity with a unit of time in the + corresponding drop-down menu, in :guilabel:`Weeks`, :guilabel:`Months`, or :guilabel:`Years`. +- :guilabel:`Automatic Closing`: a numerical value, in days, where the subscription is set to close + automatically if payment is not made. + + .. example:: + If a subscription is set to renew on the 1st of every month, and the :guilabel:`Automatic + Closing` value is set to `15` :guilabel:`Days`, then the subscription will close on the 16th of + that month if payment is not received. + +- :guilabel:`Align to Period Start`: sets new and recurring subscription plans to bill on the first + day of the next :guilabel:`Billing Period`. When a subscription plan is purchased in the middle + of a billing period, the invoice shows a reduced cost. + + .. example:: + On the 15th of July, a customer purchases a monthly subscription for a streaming service. + Selecting :guilabel:`Align to Period Start` for this recurring plan ensures that all + subscriptions are billed on the 1st of each month. Their subscription begins as soon as + payment is confirmed. The quotation shows the full cost of the subscription for July 1 - 31, + but the invoice shows an adjusted cost for July 15 - 31. On the 1st of August, the customer is + charged the full price for the month's subscription. + +- :guilabel:`Company`: optional assignment, if the database has :doc:`Multi-company + <../general/companies/multi_company>` functionality enabled. Assigning this value will make the + recurring plan available for that company's location, specifically. +- :guilabel:`Invoice Email Template`: assigns a specific email template to be used in subscriptions + invoicing communications. The default assignment here is `Invoice: Sending` which contains various + dynamic fields that autopopulate specific variables across the :guilabel:`Subject` field and + :guilabel:`Content` tab, such as the customer's name, invoice number, total amount invoiced, etc. + + .. tip:: + Although this field is optional, it is recommended to use it since this type of communication + fulfills good business practices around price transparency, regular customer communication + (especially as it relates to charged amounts), and helps build contextual financial + documentation around recurring revenues. + + .. figure:: subscriptions/subscriptions-invoice-email-template.png + :alt: An email template in Odoo used to send subscriptions invoicing messages to customers. + + The `Invoice: Sending` email template is accessible by clicking the :icon:`fa-arrow-right` + (:guilabel:`Internal link`) that appears after hovering over the :guilabel:`Invoice Email + Template` drop-down field in the :guilabel:`Recurring Plans` form. + +SELF-SERVICE section +-------------------- + +The following optional fields enable customers to take administrative actions on their own +subscriptions. Enabling any of these options may decrease customer service request volume or +increase customer lifetime value (LTV). + +- :guilabel:`Closable`: checking this box will give customers the power to close their own + subscriptions. Consider enabling this option to reduce customer service requests and improve the + overall customer experience; customers that can manage their own subscriptions in this way helps + offload tedious tasks for sales and support teams, and reduces the likelihood of negative reviews. + + .. tip:: + Although this option is generally advisable to enable, sales teams with strong customer + offboarding processes may consider leaving this option unchecked in order to force an + interaction that might save the subscription or a different form of recurring revenue (such as + in the case of a lesser subscription or a new trial period with an alternative plan). + +- :guilabel:`Add Products`: allows customers to add new products or edit existing product quantities + to their recurring sales orders, thereby enabling customer-driven upselling. When enabled, + :doc:`Upsell quotations ` are generated in Odoo whenever a customer + performs a quantitative adjustment on their sales order product lines. + +- :guilabel:`Renew`: enabling this allows customers to manually create a :doc:`Renewal quotation + ` for their subscription. +- :guilabel:`Optional Plans`: adding values here from the drop-down field menu enables customers to + switch their subscription plans, in which case a new subscription quotation or renewal quote is + created to accommodate the change request. + +Pricing tab +----------- + +Make product-specific pricing adjustments, as part of the recurring plan, by adding them to the +:guilabel:`Pricing` tab order lines. Sequentially add the :guilabel:`Products`, along with any +respective :guilabel:`Product Variants`, and then assign a :guilabel:`Pricelist` (if available) and +a :guilabel:`Recurring Price`. + +.. note:: + Price rules that are added here take precedent over the default pricing information on the + subscription product's form. This is meant to accommodate deals, discounts, and similar pricing + adjustment strategies that would incentivize customers to purchase the recurring plan. + +Smart buttons +------------- + +At the top of the individual :guilabel:`Recurring Plans` form, are two smart buttons to aid in +navigating the recurring revenue sources attached to the plan: + +- :guilabel:`Subscriptions`: shows the number of active subscriptions sales orders that fall under + the recurring plan. Clicking the button leads to a tabled list view, where each row hyperlinks to + a respective subscriptions sales order. +- :guilabel:`Subscription Items`: lists all the individual recurring subscription services that are + active, in an itemized fashion. :guilabel:`Subscription` and :guilabel:`Customer` values will + repeat if the customer ordered multiple subscriptions on the same sales order. + +Product form configuration +========================== + +With recurring plans set up, create a subscription product by navigating to +:menuselection:`Subscriptions app --> Products --> Products`, and click either an existing product +to edit, or make a new one by clicking :guilabel:`New` to open up the subscription product's form. + +.. note:: + By default, the :guilabel:`Subscriptions` option is already enabled, prompting Odoo to recognize + it as a subscription product. Be sure to leave the :guilabel:`Subscriptions` and + :guilabel:`Sales` options enabled. + +.. image:: subscriptions/subscription-product-form.png + :alt: A basic subscription product form in Odoo Subscriptions application. + +On the product form, configure the following items in the :guilabel:`General Information` tab so the +subscription product will function correctly: + +- :guilabel:`Product type`: this value is typically set to a :guilabel:`Service`, however other + product types may be used depending on the purpose of the subscription (e.g., physical product box + subscriptions, eLearning course with supplemental physical goods, etc.). +- :doc:`Invoicing policy `: set this value to when the customer + should be charged for their subscription. +- :guilabel:`Unit of Measure`: how the product should be counted in Odoo, for stock purposes. For + most subscriptions, the :abbr:`UoM (Unit of Measure)` will be :guilabel:`Units`. +- :guilabel:`Sales Price`: enter the recurring cost of the subscription that the customer will pay + per recurrence period. + +Optionally set up information on the: + +- :guilabel:`Create on Order` field: this enables secondary actions in Odoo such as creating a new + :guilabel:`Task` in a chosen :guilabel:`Project` :icon:`fa-building-o`, :guilabel:`Event + Registration` or :guilabel:`Course Access`. If none of the selectable actions in this field's + drop-down menu are needed, then choose :guilabel:`Nothing` for the field' value. +- :doc:`Attributes & Variants ` tab if the subscription + contains multiple choices for customers (i.e. food delivery, tailored fashion boxes, etc.). +- :guilabel:`Purchase` tab if the product is sourced from a vendor, such as part of reseller + (retail) or subcontracting operations. + +In the :guilabel:`Recurring Prices` tab, clarify the pricing options for the subscription. For each +option available, click :guilabel:`Add a price rule` to add a new row. + +.. tip:: + Longer time :guilabel:`Recurring Plan` time periods are typically incentivized with cost savings. + Consider dropping the total :guilabel:`Recurring Price` values to offer customers a discount + while supporting the business's financial runway. + +Last, if the subscription is meant to be sold on the **eCommerce** website, click the +:icon:`fa-globe` :menuselection:`Go To Website` smart button and in the product page header, click +the gray slider from :guilabel:`Unpublished` to the green :guilabel:`Published` status. .. _subscriptions/quotations: -Subscription quotations -======================= +Create a subscriptions quotation +================================ + +Manually create a new customer subscription by navigating to either the :menuselection:`Sales` or +:menuselection:`Subscriptions` app dashboards, and then clicking :guilabel:`New`. + +.. note:: + Products that have been marked as :guilabel:`Subscriptions` on their product forms, and are also + sold on the **eCommerce** website will *automatically* create and confirm subscription quotations + in the backend of Odoo. .. important:: - Sales orders with a defined recurrence become subscriptions. + Sales orders with a defined recurring plan automatically become subscriptions. + +On the quotation form, fill in the necessary fields such as :guilabel:`Customer` and +:guilabel:`Recurring Plan`, as well as the :guilabel:`Order Lines` tab. -To create a new subscription, click on :guilabel:`New` from the *Subscription* or the :doc:`Sales -` app. You can either: +Optionally, specify a: -- Select a :doc:`subscription plan ` to prefill the - quotation instantly, or -- Fill out the quotation normally, making sure to select a recurrence and an end date if necessary - and adding :doc:`recurrent products `. +- :doc:`Quotation Template `, if one is readily available to + help populate the form fields. +- :guilabel:`Expiration` date, to indicate when the subscription offer is no longer valid. + + .. tip:: + Expiration dates pair well with :doc:`discounts ` to + incentivize faster purchases, since the discount will expire with the quotation if it's not + turned into a sales order within the specified date range. + +- :doc:`Pricelist `, if one is available and appropriate to + use (i.e., summer sale discount, VIP customer, etc.). +- :guilabel:`Payment Terms`, to set a specified time window for when the subscription must be paid. + This is not to be confused for when the quotation is *confirmed* and becomes a sales order, to + where, payment may then be obtained immediately or within a certain amount of days, weeks, months, + etc. + +.. image:: subscriptions/new-subscription-form.png + :alt: A completed example of a new subscription quotation in Odoo. .. tip:: - You can define different invoice and delivery addresses by enabling the :doc:`Customer Addresses + Define different invoice and delivery addresses by enabling the :doc:`Customer Addresses ` feature. .. _subscriptions/confirmation: @@ -48,32 +279,16 @@ To create a new subscription, click on :guilabel:`New` from the *Subscription* o Confirmation ============ -Send the quotation to the customer for confirmation by clicking on :guilabel:`Send by email`, or +Send the quotation to the customer for confirmation by clicking on :guilabel:`Send By Email`, or confirm it immediately by clicking on :guilabel:`Confirm`. .. tip:: - Click on :guilabel:`Customer Preview` to preview the customer portal where the customer can view - their quotation, sign and pay it, and communicate with you. - -.. _subscriptions/automatic-payments: + Click on :guilabel:`Preview` to preview the customer portal where the customer can view their + quotation, sign and pay it, and communicate with you. -Automatic payments -================== - -You can require the customer to set an automatic payment method and pre-pay the subscription's first -occurrence before they can confirm their quotation. To do so, go to the :guilabel:`Other Info` tab -of the quotation and check the :guilabel:`Payment` option in the :guilabel:`Online confirmation` -field. - -If you leave :guilabel:`Payment` unchecked, the customer doesn't have to pre-pay to start the -subscription. This means that the payment is not automatic and that the customer must pay each -invoice manually. - -.. important:: - If the online confirmation requires a pre-payment, your customer can select only the - :ref:`payment providers ` that have the :ref:`tokenization - feature `. This ensures that the customer is automatically - charged at each new period. +If an :guilabel:`Online signature` or :guilabel:`Online payment` is required to confirm the +quotation, set the checkboxes next to either (or both) of these labels in the :guilabel:`Other Info` +tab, under the :guilabel:`SALES` section. .. seealso:: - :doc:`/applications/finance/accounting/payments/online` @@ -82,12 +297,9 @@ invoice manually. .. toctree:: :titlesonly: - subscriptions/products subscriptions/ecommerce - subscriptions/plans subscriptions/upselling subscriptions/renewals subscriptions/closing - subscriptions/automatic_alerts subscriptions/scheduled_actions subscriptions/reports diff --git a/content/applications/sales/subscriptions/automatic_alerts.rst b/content/applications/sales/subscriptions/automatic_alerts.rst deleted file mode 100644 index 22d4c35b30..0000000000 --- a/content/applications/sales/subscriptions/automatic_alerts.rst +++ /dev/null @@ -1,169 +0,0 @@ -================ -Automation rules -================ - -With subscriptions up-and-running, it is important to stay up-to-date with customers. It is -efficient to use automation to avoid having to manually go through the list of subscribers to see -how things are going. That is where Odoo's *automation rules* feature comes into play. - -The Odoo *Subscriptions* application allows users to set up automatic emails, create tasks for -salespeople, and even send satisfaction surveys for subscribers to evaluate their experience. - -Create automation rules -======================= - -To create an automated rule, start by navigating to :menuselection:`Subscriptions app --> -Configuration --> Automation Rules`. This is where all the automation rules for subscriptions can be -found. - -The :guilabel:`Automation Rules` page shows each rule's :guilabel:`Name`, :guilabel:`Action To Do`, -what the automated rule will :guilabel:`Trigger On`, and the :guilabel:`Company` to which the rule -applies. - -To view or modify any existing automation rule, simply click the desired rule from this page. - -.. note:: - When modifying an existing automation rule, Odoo "grays-out" the :guilabel:`Action` section of - the form, and provides the following warning: *Action data can not be updated to avoid unexpected - behaviors. Create a new action instead.* - -To create a new automation rule, click :guilabel:`New`. - -.. image:: automatic_alerts/automation-rules-page.png - :align: center - :alt: The Automation Rules page in the Odoo Subscriptions application. - -Clicking :guilabel:`New` reveals a blank :guilabel:`Automation Rules` form with numerous fields to -configure. - -.. image:: automatic_alerts/automation-rules-form.png - :align: center - :alt: A sample Automation Rules form in the Odoo Subscriptions application. - -Automation rule form fields ---------------------------- - -- :guilabel:`Action Name`: title of the automated action rule. - -Apply On section -~~~~~~~~~~~~~~~~ - -The :guilabel:`Apply On` section dictates which subscription orders/customers this automated action -applies to. - -- :guilabel:`MRR Between`: designate a range of monthly recurring revenue to target. -- :guilabel:`MRR Change More`: designate a change of monthly recurring revenue to target, in either - percentage or unit of currency. -- :guilabel:`Over`: choose a period of time over which the designated KPIs (Key Performance - Indicators) are calculated. -- :guilabel:`Rating Satisfaction`: designate satisfaction as :guilabel:`greater than` or - :guilabel:`less than` a percentage. -- :guilabel:`Status`: select the status of the subscriptions to be included in this automation rule. - The options are: :guilabel:`Quotation`, :guilabel:`Quotation Sent`, :guilabel:`Sales Order`, and - :guilabel:`Cancelled`. -- :guilabel:`Stage goes from`: designate when the automation rule should be activated using two - fields that represent two different stages of the subscription. -- :guilabel:`Subscription Plans`: choose specific subscription plans to target with the automation - rule. -- :guilabel:`Products`: select specific product(s) to target with the automation rule. -- :guilabel:`Customers`: select specific customer(s) to target with the automation rule. -- :guilabel:`Company`: in a multi-company environment, select a specific company's subscription data - to target with the automation rule. -- :guilabel:`Sales Team`: select the data of specific sales team(s) to target with the automation - rule. - -.. note:: - If any field is left blank, the rule applies to every subscription without that specific - designation. - -.. tip:: - The number of subscriptions that match the configured criteria of the customized automation rule - are displayed at the bottom of the :guilabel:`Apply On` field. - - If that green subscriptions link is clicked, Odoo reveals a separate page showcasing all the - subscriptions that meet that automation rule's criteria. - -Action section -~~~~~~~~~~~~~~ - -The :guilabel:`Action` section dictates what action occurs when an automated rule is triggered. - -In the :guilabel:`Action To Do` field, choose the action that will occur once the automated rule is -triggered. When clicked, the following options become available on a drop-down menu: - -- :guilabel:`Create next activity`: creates the next activity to occur, which is configured in the - :guilabel:`Activity` section that appears at the bottom of the automation rule form. -- :guilabel:`Send an email to the customer`: sends an email to the customer(s) who fit the specified - criteria of the automation rule. -- :guilabel:`Send an SMS Text Message to the customer`: sends an SMS message to the customer(s) who - fit the specified criteria of the automation rule. -- :guilabel:`Set Contract Health value`: set the health value of the subscription contract. - -If :guilabel:`Send an email to the customer` is selected in the :guilabel:`Action To Do` field, the -following field appears: - -- :guilabel:`Email Template`: create (and edit) a new email template *or* select from a list of - pre-configured email templates to send to the customer(s). - -If :guilabel:`Send an SMS Text Message to the customer` is selected in the :guilabel:`Action To Do` -field, the following field appears: - -- :guilabel:`SMS Template`: create (and edit) a new SMS template *or* select from a list of - pre-configured SMS templates to send to the customer(s). - -If :guilabel:`Set Contract Health value` is selected in the :guilabel:`Action To Do` field, the -following field appears: - -- :guilabel:`Health`: designate the health of the subscription by choosing one of the following - options: :guilabel:`Neutral`, :guilabel:`Good`, or :guilabel:`Bad`. - -In the :guilabel:`Trigger On` field, decide whether the automated rule should be triggered on a -:guilabel:`Modification` or :guilabel:`Timed Condition`. - -.. note:: - A :guilabel:`Trigger Now` button appears at the top of the automation rule form *only* when a - trigger has been configured for the rule. - -.. warning:: - When the :guilabel:`Trigger Now` button is clicked, Odoo will trigger the action on *all* linked - subscriptions, regardless of possible timed conditions. - -.. note:: - Sending a SMS text message in Odoo requires In-App Purchase (IAP) credit or tokens. For more - information on :abbr:`IAP (In-App Purchase)`, visit :doc:`../../essentials/in_app_purchase`. - For more information on sending SMS messages, visit - :doc:`../../marketing/sms_marketing`. - -If :guilabel:`Timed Condition` is selected in the :guilabel:`Trigger On` field, the following fields -appear: - -- :guilabel:`Trigger Date`: represents when the condition should be triggered. If left blank, the - action is created upon subscription creation *and* updates. -- :guilabel:`Delay After Trigger`: select a delayed amount of time (:guilabel:`Minutes`, - :guilabel:`Hours`, :guilabel:`Days`, or :guilabel:`Months`) for Odoo to wait before triggering the - configured action. If a negative number is entered, the "delay" will occur *before* the - :guilabel:`Trigger Date`. - -Activity section -**************** - -If :guilabel:`Create next activity` is selected in the :guilabel:`Action To Do` field, an -:guilabel:`Activity` section appears at the bottom of the :guilabel:`Automation Rules` form. - -- :guilabel:`Activity Type`: select an pre-configured activity type from the drop-down menu. -- :guilabel:`Title`: enter a custom title for the chosen activity. -- :guilabel:`Note`: leave a note for the employee to whom the activity is assigned. -- :guilabel:`Due Date In`: enter an amount of days within which the activity should be completed. -- :guilabel:`Assign To`: choose to assign the specified activity to either: :guilabel:`Subscription - Salesperson`, :guilabel:`Sales Team Leader`, or :guilabel:`Specific Users`. - -.. note:: - If :guilabel:`Specific Users` is selected as the :guilabel:`Assign To` option, a new - :guilabel:`Specific Users` field appears beneath it, where a specific employee(s) can be chosen - as the assignee(s) for the configured activity. - -.. seealso:: - - :doc:`../subscriptions` - - :doc:`plans` - - :doc:`products` - - :doc:`../../essentials/in_app_purchase` diff --git a/content/applications/sales/subscriptions/automatic_alerts/automation-rules-form.png b/content/applications/sales/subscriptions/automatic_alerts/automation-rules-form.png deleted file mode 100644 index e9a46f40fb..0000000000 Binary files a/content/applications/sales/subscriptions/automatic_alerts/automation-rules-form.png and /dev/null differ diff --git a/content/applications/sales/subscriptions/automatic_alerts/automation-rules-page.png b/content/applications/sales/subscriptions/automatic_alerts/automation-rules-page.png deleted file mode 100644 index aebd6598de..0000000000 Binary files a/content/applications/sales/subscriptions/automatic_alerts/automation-rules-page.png and /dev/null differ diff --git a/content/applications/sales/subscriptions/closing.rst b/content/applications/sales/subscriptions/closing.rst index 5d5dd2a378..e301a66a4d 100644 --- a/content/applications/sales/subscriptions/closing.rst +++ b/content/applications/sales/subscriptions/closing.rst @@ -20,8 +20,6 @@ customer portal. :align: center :alt: The Closable option on a recurring plan form in Odoo Subscriptions. -.. seealso:: - :doc:`Configure recurring plans ` Close a subscription ==================== @@ -103,5 +101,3 @@ In addition, the specified :guilabel:`Close Reason` appears on the subscription .. seealso:: - :doc:`../subscriptions` - - :doc:`plans` - - :doc:`products` diff --git a/content/applications/sales/subscriptions/ecommerce.rst b/content/applications/sales/subscriptions/ecommerce.rst index dcb2c911d3..4efdb5a19e 100644 --- a/content/applications/sales/subscriptions/ecommerce.rst +++ b/content/applications/sales/subscriptions/ecommerce.rst @@ -5,14 +5,15 @@ Subscriptions in the eCommerce shop Subscription products can be sold in the Odoo *eCommerce* shop just like regular sales products. .. seealso:: - - :doc:`Configure subscription products ` + - :doc:`Configure subscription products ` + - :doc:`Product variants ` Selling eCommerce subscriptions =============================== -:doc:`Configure the subscription product ` as a regular recurring sales product. To -start selling the subscription in the eCommerce shop, click the :guilabel:`Go to Website` smart -button to navigate to the product page. +:doc:`Configure subscription products ` as a regular recurring +sales product. To start selling the subscription in the eCommerce shop, click the :guilabel:`Go to +Website` smart button to navigate to the product page. From here, review the subscription product and its recurring periods. Then, toggle the switch in the upper-right corner from :guilabel:`Unpublished` to :guilabel:`Published`. diff --git a/content/applications/sales/subscriptions/new-subscription-form.png b/content/applications/sales/subscriptions/new-subscription-form.png new file mode 100644 index 0000000000..8b1f29d848 Binary files /dev/null and b/content/applications/sales/subscriptions/new-subscription-form.png differ diff --git a/content/applications/sales/subscriptions/plans.rst b/content/applications/sales/subscriptions/plans.rst deleted file mode 100644 index 3d1ac5e8f1..0000000000 --- a/content/applications/sales/subscriptions/plans.rst +++ /dev/null @@ -1,102 +0,0 @@ -================== -Subscription plans -================== - -*Subscription plans* are :doc:`quotation templates -<../sales/sales_quotations/quote_template>` used to preconfigure quotations with -subscription products. Use subscription plans to quickly create subscription orders. - -Configure subscription plans -============================ - -To configure subscription plans, go to :menuselection:`Subscriptions --> Configuration --> Plans`. -Then, click :guilabel:`New` to create a new plan, or select an existing plan to edit it. - -Since the Odoo *Subscriptions* app is integrated closely with the *Sales* app, subscription plans -use the same form as quotation templates. - -.. image:: plans/subplan-quotation-template.png - :align: center - :alt: Subscription plan (quotation template) configuration form. - -The subscription plan form contains the following options: - -- :guilabel:`Name`: Enter a name for the subscription plan at the top of the page. -- :guilabel:`Quotation expires after`: Enter the number of days after which the quotation expires, - starting from the day the quotation is sent to the customer. Leave this field at zero for the - quotation to never expire. -- :guilabel:`Online Confirmation`: Check the boxes next to :guilabel:`Signature` or - :guilabel:`Payment` to enable the customer to confirm their subscription order by signing or - paying for the quotation. Enable both to leave the choice to the customer. Enable neither to only - confirm the quotation in the backend. -- :guilabel:`Confirmation Mail`: Select an :doc:`email template - ` for the confirmation email that is - automatically sent to the customer after the quotation is confirmed. Leave this field blank to - send nothing. - - - To create a new email template, enter a name for the template, then click :guilabel:`Create and - edit`. - - To edit an existing email template, select one from the drop-down menu, then click on the - :guilabel:`Internal link` arrow at the end of the line. - -- :guilabel:`Recurrence`: Select the recurrence period used for the plan. The recurrence periods - available here are the same ones that are configured in :menuselection:`Subscriptions --> - Configuration --> Recurrence Periods`. - -Selecting a :guilabel:`Recurrence` turns the quotation template into a subscription plan and enables -the following additional options: - -- :guilabel:`Duration`: Choose whether the subscription plan has no end date (:guilabel:`Forever`) - or a :guilabel:`Fixed` duration. - - - If the duration is :guilabel:`Forever`, then the subscription plan will continually renew until - either the customer or the company manually ends the subscription. - - If the duration is :guilabel:`Fixed`, then enter an :guilabel:`End After` date, which determines - the amount of time after which the subscription will automatically end. - -- :guilabel:`Self Closable`: Check this box to enable the customer to terminate their subscription - from the :doc:`customer portal - `. -- :guilabel:`Automatic Closing`: Enter the number of days after which *unpaid* subscriptions *past* - the due date are automatically closed. -- :guilabel:`Invoicing Journal`: Select the accounting journal in which invoices for this - subscription plan are recorded. Leave this field blank to use the sales journal with the lowest - sequence. - -.. image:: plans/subplan-recurrence.png - :align: center - :alt: Subscription plan with Recurrence selected. - -In the :guilabel:`Lines` tab, create the order lines for the quotation. Click :guilabel:`Add a -product`, select a product to include in the plan, and then enter the :guilabel:`Quantity` and -:guilabel:`Unit of Measure`. Add as many products as desired to the order lines. - -In the :guilabel:`Optional Products` tab, enter any optional products that the customer can add to -their quotation before confirming the order. - -If the subscription plan has unique :doc:`terms and conditions -`, add them in the -:guilabel:`Terms & Conditions` tab. If terms conditions are specified on a plan, these will be used -instead of the default terms and conditions set up in the *Sales* app settings. - -.. image:: plans/subplan-terms-conditions.png - :align: center - :alt: Subscription plan Terms & Conditions tab. - -Use subscription plans on quotations -==================================== - -Quotations for subscription products can be created in both the *Subscriptions* app and the *Sales* -app. - -From the :guilabel:`Subscriptions` dashboard, click :guilabel:`New` to create a new quotation. Then, -select a subscription plan in the :guilabel:`Subscription Plan` field. - -The :guilabel:`Recurrence`, products, and other information from the plan are automatically filled -in. The quotation can then be modified further as needed. - -From the :guilabel:`Sales` dashboard, click :guilabel:`New` to create a new quotation. Then, select -a subscription plan in the :guilabel:`Quotation Template` field. - -All subscription orders will appear on the :guilabel:`Subscriptions` dashboard regardless of whether -they were created in the *Subscriptions* app or the *Sales* app. diff --git a/content/applications/sales/subscriptions/plans/subplan-quotation-template.png b/content/applications/sales/subscriptions/plans/subplan-quotation-template.png deleted file mode 100644 index 3823f4b9dd..0000000000 Binary files a/content/applications/sales/subscriptions/plans/subplan-quotation-template.png and /dev/null differ diff --git a/content/applications/sales/subscriptions/plans/subplan-recurrence.png b/content/applications/sales/subscriptions/plans/subplan-recurrence.png deleted file mode 100644 index 9539b98d19..0000000000 Binary files a/content/applications/sales/subscriptions/plans/subplan-recurrence.png and /dev/null differ diff --git a/content/applications/sales/subscriptions/plans/subplan-terms-conditions.png b/content/applications/sales/subscriptions/plans/subplan-terms-conditions.png deleted file mode 100644 index f87c9e20eb..0000000000 Binary files a/content/applications/sales/subscriptions/plans/subplan-terms-conditions.png and /dev/null differ diff --git a/content/applications/sales/subscriptions/products.rst b/content/applications/sales/subscriptions/products.rst deleted file mode 100644 index ed518d06f7..0000000000 --- a/content/applications/sales/subscriptions/products.rst +++ /dev/null @@ -1,158 +0,0 @@ -===================== -Subscription products -===================== - -By closely integrating with the Odoo *Sales* app, the *Subscriptions* app enables users to sell -subscription products alongside regular sales products. While regular products are sold on a -one-time basis, subscription products are sold on a renewing basis, generating recurring revenue. - -In Odoo, subscription products are also called *recurring* products. - -Configure recurrence periods -============================ - -To get started with subscriptions, the *recurrence periods* must be properly configured, as needed. - -Recurrence periods are the time periods in which subscriptions renew. They designate how often the -customer pays for (and receives) subscription products. - -To configure recurrence periods, go to :menuselection:`Subscriptions app --> Configuration --> -Recurrence periods`. - -.. image:: products/recurrence-periods-page.png - :align: center - :alt: The recurrence periods page in Odoo Subscriptions application. - -The *Subscriptions* app comes with some basic recurrence periods already configured: - -- :guilabel:`Monthly` -- :guilabel:`Quarterly` -- :guilabel:`Weekly` -- :guilabel:`2 Weeks` -- :guilabel:`Yearly` -- :guilabel:`3 Years` -- :guilabel:`5 Years` - -New recurrence periods can be added and/or edited at any time. - -To create a new recurrence period, click :guilabel:`New` on the :guilabel:`Recurrence Periods` page. -Doing so reveals a blank recurrence period form. - -.. image:: products/recurrence-period-form.png - :align: center - :alt: A recurrence period form in Odoo Subscriptions application. - -Then, type in the :guilabel:`Name` and :guilabel:`Duration` of the recurrence period, and select the -:guilabel:`Unit` that defines the duration. - -.. important:: - The unit :guilabel:`Days` *cannot* be used as a recurrence period on subscriptions. The daily - recurrence is meant for rentals, and **cannot** be added on recurring subscription sales orders. - - This limitation is there to avoid sales orders that would generate daily invoices. - -Product form configuration -========================== - -To create a new subscription product, navigate to :menuselection:`Subscriptions app --> Products --> -Products`, and click :guilabel:`New`. - -Doing so reveals a blank product form, which can be configured and customized in a number of ways. - -.. note:: - By default, the :guilabel:`Recurring` option is already enabled, prompting Odoo to recognize it - as a subscription product. Be sure to leave the :guilabel:`Recurring` and :guilabel:`Can be Sold` - options enabled. - - The :guilabel:`Product Type` field is set to :guilabel:`Service` by default, as well. However, - subscription products *can* be set to other types, if needed. - -.. important:: - When creating a physical subscription product in the Odoo **Sales** application, the - :guilabel:`Invoicing Policy` must be set to :guilabel:`Ordered quantities`. - - Setting it to :guilabel:`Delivered quantities` causes issues with invoice creation, and disrupts - the subscription process. - - Similarly, when creating a physical subscription product in the Odoo **Subscriptions** - application, the :guilabel:`Invoicing Policy` must **not** be set to :guilabel:`Based on - Delivered Quantity (Manual)` for the same reasons. - -.. image:: products/subscription-product-form.png - :align: center - :alt: A basic subscription product form in Odoo Subscriptions application. - -Time-based pricing ------------------- - -Once the desired fields in the :guilabel:`General Information` tab have been entered, click the -:guilabel:`Time-based pricing` tab on the product form. - -.. image:: products/time-based-pricing-tab.png - :align: center - :alt: The time-based pricing tab on a subscription product form in Odoo Subscriptions. - -From here, click :guilabel:`Add a price` to begin defining recurring prices. - -In the :guilabel:`Period` column, select a desired recurrence period. In the :guilabel:`Pricelist` -column, select a pricelist, if needed. Then, in the :guilabel:`Price` column, enter the price for -that recurrence period. - -.. note:: - :guilabel:`Daily` and :guilabel:`Hourly` periods **cannot** be used on recurring products. - - .. image:: products/validation-error-popup.png - :align: center - :alt: The validation error pop-up window that appears in Odoo Subscriptions. - -.. note:: - There is *no limit* to how many lines can be added to the :guilabel:`Time-based pricing` table. - -.. tip:: - An existing product can be made into a subscription product, simply by marking it as - :guilabel:`Recurring`, and configuring :guilabel:`Time-based pricing` on the product form. - -Pricelists -~~~~~~~~~~ - -:doc:`Pricelists <../sales/products_prices/prices/pricing>` can be used with subscription products -to give special pricing to customers included in pricelists. - -This can be configured either in the :guilabel:`Time-based pricing` tab of the product form, or on -the pricelist form in the *Sales* application. - -To create recurring price rules for specific pricelists in the :guilabel:`Time-based pricing` tab of -the product form, select a pricelist in the :guilabel:`Pricelist` column. - -.. image:: products/pricelist-time-based-pricing.png - :align: center - :alt: Pricelists in the "Time-based pricing" tab of the product form. - -When pricelists are added to the :guilabel:`Time-based pricing` tab, the pricelist form in the -*Sales* app is automatically updated. - -Time-based pricing rules can also be configured directly on the pricelist form. - -To do this, go to :menuselection:`Sales app --> Products --> Pricelists`, and select a pricelist (or -click :guilabel:`New` to create a new pricelist). - -.. note:: - Pricelists are also accessible through the Odoo *Subscriptions* app by following the same menu - steps. - -Then, on the pricelist form, under the :guilabel:`Time-based rules` tab, click :guilabel:`Add a -line`. - -.. image:: products/pricelist-form-time-based-rules-tab.png - :align: center - :alt: The time-based rules tab on a pricelist form in Odoo Sales. - -Then, select a subscription product in the :guilabel:`Products` column, and select a recurrence -period in the :guilabel:`Period` column. Lastly, enter a :guilabel:`Price` for that particular -product and period. Add as many lines as needed. - -When :guilabel:`Time-based rules` are added to the pricelist form, the :guilabel:`Time-based -pricing` tab of the product form is automatically updated. - -.. seealso:: - :doc:`ecommerce` diff --git a/content/applications/sales/subscriptions/products/pricelist-form-time-based-rules-tab.png b/content/applications/sales/subscriptions/products/pricelist-form-time-based-rules-tab.png deleted file mode 100644 index dc57b22dec..0000000000 Binary files a/content/applications/sales/subscriptions/products/pricelist-form-time-based-rules-tab.png and /dev/null differ diff --git a/content/applications/sales/subscriptions/products/pricelist-time-based-pricing.png b/content/applications/sales/subscriptions/products/pricelist-time-based-pricing.png deleted file mode 100644 index dc1f968afd..0000000000 Binary files a/content/applications/sales/subscriptions/products/pricelist-time-based-pricing.png and /dev/null differ diff --git a/content/applications/sales/subscriptions/products/recurrence-period-form.png b/content/applications/sales/subscriptions/products/recurrence-period-form.png deleted file mode 100644 index 5e152a037b..0000000000 Binary files a/content/applications/sales/subscriptions/products/recurrence-period-form.png and /dev/null differ diff --git a/content/applications/sales/subscriptions/products/recurrence-periods-page.png b/content/applications/sales/subscriptions/products/recurrence-periods-page.png deleted file mode 100644 index 6aa6dc719c..0000000000 Binary files a/content/applications/sales/subscriptions/products/recurrence-periods-page.png and /dev/null differ diff --git a/content/applications/sales/subscriptions/products/subscription-product-form.png b/content/applications/sales/subscriptions/products/subscription-product-form.png deleted file mode 100644 index e1deb093c1..0000000000 Binary files a/content/applications/sales/subscriptions/products/subscription-product-form.png and /dev/null differ diff --git a/content/applications/sales/subscriptions/products/time-based-pricing-tab.png b/content/applications/sales/subscriptions/products/time-based-pricing-tab.png deleted file mode 100644 index eaad7c0e77..0000000000 Binary files a/content/applications/sales/subscriptions/products/time-based-pricing-tab.png and /dev/null differ diff --git a/content/applications/sales/subscriptions/products/validation-error-popup.png b/content/applications/sales/subscriptions/products/validation-error-popup.png deleted file mode 100644 index adeb7e7591..0000000000 Binary files a/content/applications/sales/subscriptions/products/validation-error-popup.png and /dev/null differ diff --git a/content/applications/sales/subscriptions/recurring-plan-blank-form.png b/content/applications/sales/subscriptions/recurring-plan-blank-form.png new file mode 100644 index 0000000000..2b2110ab52 Binary files /dev/null and b/content/applications/sales/subscriptions/recurring-plan-blank-form.png differ diff --git a/content/applications/sales/subscriptions/renewals.rst b/content/applications/sales/subscriptions/renewals.rst index 0487109aa4..c2b436dfcf 100644 --- a/content/applications/sales/subscriptions/renewals.rst +++ b/content/applications/sales/subscriptions/renewals.rst @@ -126,5 +126,3 @@ related to this specific subscription. .. seealso:: - :doc:`../subscriptions` - - :doc:`plans` - - :doc:`products` diff --git a/content/applications/sales/subscriptions/reports.rst b/content/applications/sales/subscriptions/reports.rst index 27ef07ee58..f0f391aa3f 100644 --- a/content/applications/sales/subscriptions/reports.rst +++ b/content/applications/sales/subscriptions/reports.rst @@ -401,5 +401,3 @@ Analysis` reporting page are: .. seealso:: - :doc:`../subscriptions` - - :doc:`plans` - - :doc:`products` diff --git a/content/applications/sales/subscriptions/scheduled_actions.rst b/content/applications/sales/subscriptions/scheduled_actions.rst index 135e1e6f25..c4cf0fb45d 100644 --- a/content/applications/sales/subscriptions/scheduled_actions.rst +++ b/content/applications/sales/subscriptions/scheduled_actions.rst @@ -44,8 +44,8 @@ results. The following documentation focuses on the last two results in the list :alt: The subscription-related results on the scheduled actions page in Odoo Settings. Determine if a scheduled action is active by looking under the :guilabel:`Active` column, in the -it's corresponding row on the :guilabel:`Scheduled Actions` dashboard, for a ticked checkbox; if -the checkbox is green with a check mark, the scheduled action is active. +corresponding row on the :guilabel:`Scheduled Actions` dashboard, for a ticked checkbox; if the +checkbox is green with a check mark, the scheduled action is active. If a scheduled action needs to be activated, click into the desired scheduled action from the list. @@ -125,12 +125,21 @@ a :guilabel:`Payment Token` on the account. To check if there is a :guilabel:`Payment Token`, open the :guilabel:`Other Info` tab, and look at the :guilabel:`Payment Token` field, under the :guilabel:`Subscription` section. +If there is no :guilabel:`Payment Token`, the invoice is created, and sent to the customer. The +payment **must** be registered manually in this case. + .. image:: scheduled_actions/payment-token-field.png :align: center :alt: The Payment Token field under the Other Info tab on a subscription sales order form. -If there is no :guilabel:`Payment Token`, the invoice is created, and sent to the customer. The -payment **must** be registered manually in this case. +.. warning:: + If the :guilabel:`Online payment` checkbox is ticked on the :guilabel:`Other Info` tab, invoices + are **not** automatically generated by the scheduled action on the date of the next invoice. + Instead, invoices are generated when the client completes the manual payments for the + subscription. + + To use automatic payment and automatically generate invoices, this checkbox **must** remain + empty. Closing invoices ---------------- @@ -184,6 +193,3 @@ For example, if the next invoice date is July 1st, and the :guilabel:`Automatic .. seealso:: - :doc:`../subscriptions` - - :doc:`plans` - - :doc:`products` - - :doc:`automatic_alerts` diff --git a/content/applications/sales/subscriptions/subscription-product-form.png b/content/applications/sales/subscriptions/subscription-product-form.png new file mode 100644 index 0000000000..bf16d63677 Binary files /dev/null and b/content/applications/sales/subscriptions/subscription-product-form.png differ diff --git a/content/applications/sales/subscriptions/subscriptions-invoice-email-template.png b/content/applications/sales/subscriptions/subscriptions-invoice-email-template.png new file mode 100644 index 0000000000..8907eecf7f Binary files /dev/null and b/content/applications/sales/subscriptions/subscriptions-invoice-email-template.png differ diff --git a/content/applications/sales/subscriptions/upselling.rst b/content/applications/sales/subscriptions/upselling.rst index 1e7fc0ded2..0187ff5095 100644 --- a/content/applications/sales/subscriptions/upselling.rst +++ b/content/applications/sales/subscriptions/upselling.rst @@ -105,5 +105,3 @@ Status`. .. seealso:: - :doc:`../subscriptions` - - :doc:`plans` - - :doc:`products` diff --git a/content/applications/services/helpdesk.rst b/content/applications/services/helpdesk.rst index c9f4aa657d..9f5e53a513 100644 --- a/content/applications/services/helpdesk.rst +++ b/content/applications/services/helpdesk.rst @@ -10,6 +10,8 @@ and managed in one dashboard, each with their own pipeline for tickets submitted Pipelines are organized in customizable stages that enable teams to track, prioritize, and solve customer issues efficiently. +.. _helpdesk/create-team: + Create a Helpdesk team ====================== diff --git a/content/applications/services/helpdesk/overview/help_center.rst b/content/applications/services/helpdesk/overview/help_center.rst index 8dea2a6ce5..88d3a8669b 100644 --- a/content/applications/services/helpdesk/overview/help_center.rst +++ b/content/applications/services/helpdesk/overview/help_center.rst @@ -79,7 +79,7 @@ Once an article has been created and assigned to a **Helpdesk** team, content ca organized through the **Knowledge** app. .. seealso:: - :doc:`Editing Knowledge articles <../../../productivity/knowledge/articles_editing>` + :ref:`Editing Knowledge articles ` Search articles from a Helpdesk ticket -------------------------------------- @@ -143,8 +143,8 @@ Add clipboard boxes to articles To create a clipboard box, go to :menuselection:`Knowledge app --> Help`. Click on an existing nested article or create a new one by clicking the |plus| next to *Help*. -Type :kbd:`/` to open the *powerbox*, and view a drop-down list of :doc:`commands -<../../../productivity/knowledge/articles_editing>`. Select or type :kbd:`clipboard`. A gray block +Type :kbd:`/` to open the *powerbox*, and view a drop-down list of :ref:`commands +`. Select or type :kbd:`clipboard`. A gray block is then added to the page. Add any necessary content to this block. .. image:: help_center/help-center-knowledge-clipboard-options.png diff --git a/content/applications/services/helpdesk/overview/ratings.rst b/content/applications/services/helpdesk/overview/ratings.rst index 486759c706..595c1ea06f 100644 --- a/content/applications/services/helpdesk/overview/ratings.rst +++ b/content/applications/services/helpdesk/overview/ratings.rst @@ -2,9 +2,12 @@ Customer ratings ================ -Asking customers to rate the support they received from a *Helpdesk* team provides an opportunity to -gauge team performance and track customer satisfaction. Ratings can be published on the portal, -providing customers with a general overview of the team's performance. +.. |smile| replace:: green :icon:`fa-smile-o` :guilabel:`(smile)` icon +.. |meh| replace:: yellow :icon:`fa-meh-o` :guilabel:`(neutral)` icon +.. |frown| replace:: red :icon:`fa-frown-o` :guilabel:`(frown)` icon + +Asking customers to rate the support they received from a **Helpdesk** team provides an opportunity +to gauge team performance and track customer satisfaction. .. _helpdesk/enable-ratings: @@ -12,12 +15,10 @@ Enable customer ratings on Helpdesk teams ========================================= To enable *customer ratings* on a helpdesk team, navigate to :menuselection:`Helpdesk app --> -Configuration --> Helpdesk Teams`. Select a team from the list and click on it to open the settings -page. Scroll to the :guilabel:`Performance` section, and tick the :guilabel:`Customer Ratings` -checkbox. +Configuration --> Helpdesk Teams`. Click on a team from the list to open the settings page. Scroll +to the :guilabel:`Performance` section, and tick the :guilabel:`Customer Ratings` checkbox. .. image:: ratings/ratings-enable.png - :align: center :alt: Overview of the settings page of a helpdesk team emphasizing the rating on ticket feature in Odoo Helpdesk. @@ -25,7 +26,7 @@ Set a ratings request email template on a stage =============================================== To automatically request ratings from customers once their tickets have closed, an email template -should be added to the appropriate stage. +needs to be added to the appropriate stage. After the :guilabel:`Customer Ratings` :ref:`setting has been enabled ` on the team's settings page, click the :guilabel:`Set an Email Template on Stages` link. Select a stage @@ -43,74 +44,22 @@ use to provide feedback. To view the template, click the arrow button to the rig After the template is added to the stage, it automatically sends a message when a ticket is moved to that stage. Customers are then asked to rate the support they received with colored icons. - - *Green smiling face* - Satisfied - - *Yellow neutral face* - Okay - - *Red frowning face* - Dissatisfied + - **Satisfied** - |smile| + - **Okay** - |meh| + - **Dissatisfied** - |frown| + +.. image:: ratings/template-preview.png + :alt: A preview of the ticket rating request template in Helpdesk. After selecting a rating, customers are taken to a webpage where they can provide specific written feedback to support their rating. The rating is then submitted, and the rating, as well as any additional comments, are added to the chatter on the ticket. .. tip:: - Customer ratings can also be viewed through the :guilabel:`Customer Ratings` report. To view - this report, go to :menuselection:`Helpdesk app --> Reporting --> Customer Ratings`. - -.. seealso:: - :doc:`../../../general/companies/email_template` - -Publish ratings on the customer portal -====================================== - -After enabling the :guilabel:`Customer Ratings` setting, an option to publish ratings on the team's -website appears. Enabling this setting provides portal users with an overview of the ratings the -team has received over the last thirty days. Specific written feedback will not be included; only -statistics of the team's performance will be visible. - -.. important:: - To display ratings on the customer portal, a team **must** have their visibility setting set to - :guilabel:`Invited portal users and all internal users (public)`. To enable this setting, - navigate to :menuselection:`Helpdesk app --> Configuration --> Helpdesk Teams`. Select a team - from the list and click on it to open the settings page. Scroll to the :guilabel:`Visibility & - Assignment` section, and tick the :guilabel:`Invited portal users and all internal users - (public)` checkbox. - -Next, to publish the ratings, go to :menuselection:`Helpdesk app--> Configuration --> Helpdesk -Teams` and select a team. Scroll to :guilabel:`Performance` and tick the checkbox for -:guilabel:`Publish this team's ratings on your website`. - -To view the ratings for a team, a customer will log into the portal and navigate to one of their -tickets. After clicking on the team name in the :guilabel:`Managed By` field, they will be directed -to a page with the team's ratings over the past thirty days. - -.. image:: ratings/ratings-portal-overview.png - :align: center - :alt: View of the ratings performance overview from the customer portal. - -.. seealso:: - :doc:`Portal access <../../../general/users/portal>` - -Manually hide individual ratings --------------------------------- - -Individual ratings can be manually hidden from the portal. This allows for specific ratings to be -kept out of the performance metrics shared with customers. - -To make a rating visible only to internal users, navigate to the page for a rating. This can be done -in one of the following ways: - - - Go to :menuselection:`Helpdesk app --> Reporting --> Customer Ratings` and click on one of the - Kanban cards for an individual rating. - - Navigate to :menuselection:`Helpdesk app--> Tickets --> All Tickets` and remove the - :guilabel:`Open` filter from the search bar. Then filter by :guilabel:`Satisfied`, - :guilabel:`Okay` and/or :guilabel:`Dissatisfied`. Select a ticket from the results. Click the - :guilabel:`Rating` smart button. - -Once on the rating details page, check the :guilabel:`Visible Internally Only` box. - -.. image:: ratings/ratings-keep-internal.png - :align: center - :alt: View of the ratings performance overview from the customer portal. + Customer ratings can also be viewed through the :guilabel:`Customer Ratings` report. To view this + report, go to :menuselection:`Helpdesk app --> Reporting --> Customer Ratings`. .. seealso:: + - :doc:`../../../general/companies/email_template` - :doc:`../advanced/close_tickets` - :doc:`reports` diff --git a/content/applications/services/helpdesk/overview/ratings/ratings-enable.png b/content/applications/services/helpdesk/overview/ratings/ratings-enable.png index 989ac947bb..726dfc1a75 100644 Binary files a/content/applications/services/helpdesk/overview/ratings/ratings-enable.png and b/content/applications/services/helpdesk/overview/ratings/ratings-enable.png differ diff --git a/content/applications/services/helpdesk/overview/ratings/ratings-keep-internal.png b/content/applications/services/helpdesk/overview/ratings/ratings-keep-internal.png deleted file mode 100644 index e6cd3be945..0000000000 Binary files a/content/applications/services/helpdesk/overview/ratings/ratings-keep-internal.png and /dev/null differ diff --git a/content/applications/services/helpdesk/overview/ratings/ratings-portal-overview.png b/content/applications/services/helpdesk/overview/ratings/ratings-portal-overview.png deleted file mode 100644 index 98746c1f0d..0000000000 Binary files a/content/applications/services/helpdesk/overview/ratings/ratings-portal-overview.png and /dev/null differ diff --git a/content/applications/services/helpdesk/overview/ratings/template-preview.png b/content/applications/services/helpdesk/overview/ratings/template-preview.png new file mode 100644 index 0000000000..456d35cd08 Binary files /dev/null and b/content/applications/services/helpdesk/overview/ratings/template-preview.png differ diff --git a/content/applications/services/planning.rst b/content/applications/services/planning.rst index b2aac8a946..86b29a6793 100644 --- a/content/applications/services/planning.rst +++ b/content/applications/services/planning.rst @@ -54,7 +54,7 @@ Planning includes the possibility of adding property fields linked to roles to s To create a property field, switch to the list view from any schedule. From there, click :guilabel:`View` on the shift that you wish to edit. If the :guilabel:`Role` field is empty, fill it in with the desired role, then click the cog icon and select :guilabel:`Add Properties`. -:doc:`Configure <../productivity/knowledge/properties>` the new field according to your needs. +:doc:`Configure ` the new field according to your needs. .. image:: planning/add-properties.png :alt: Creating a new property field in Planning. diff --git a/content/applications/services/project/project_management.rst b/content/applications/services/project/project_management.rst index 3d86a54492..3b16e323b1 100644 --- a/content/applications/services/project/project_management.rst +++ b/content/applications/services/project/project_management.rst @@ -12,10 +12,6 @@ into tasks, which are categorized on a whiteboard according to what production p The word **Kanban** comes from Japanese and refers to the "visual board" management method. -.. seealso:: - `Odoo Tutorials: Kanban Project Management - `_ - .. _project_management/configuration: Configuration @@ -66,6 +62,50 @@ Additionally, you can mark the project as :guilabel:`Favorite`, allowing you to Further settings are available under the :guilabel:`Settings` tab. Most of them are *only* available depending on the activated apps. +Visibility and collaboration +---------------------------- + +Odoo allows you to set visibility settings for each project, enabling you to make your project +available to everyone in your organization or restrict access to certain internal or external users. + +To do so, go to the project's :guilabel:`Settings` tab and choose the desired :guilabel:`Visibility` +option: + +- :guilabel:`Invited internal users (private)`: Only users following the project and users with the + Project Administrator :doc:`access right ` can + access the project and its tasks. +- :guilabel:`All internal users`: All internal users can access the project and all of its tasks. +- :guilabel:`Invited portal users and all internal users (public)`: All internal users can access + the project and all of its tasks. When following a project, :doc:`portal users + ` only have access to the specific tasks they are following. + This option is selected by default. + +Inviting external users +----------------------- + +To invite external users, make sure that :guilabel:`Invited portal users and all internal users +(public)` is selected, then click :guilabel:`Share Project` at the top of the project’s settings. +The following options are available: + +- Copy and share the :guilabel:`Public Link` displayed at the top of the pop-up window. Anyone with + this link can access the project in read mode. +- Or click :guilabel:`Add a line`, select a :guilabel:`Collaborator`, choose the + :guilabel:`Access Mode`, and check the box to send an invitation to their email address. + + There are three types of :guilabel:`Access Mode` for collaborators: + + - :guilabel:`Read`: Collaborators can view tasks but cannot edit them. + - :guilabel:`Edit with limited access`: Collaborators can view and edit the tasks they follow. + - :guilabel:`Edit`: Collaborators can view and edit all tasks. + +To revoke an invited collaborator's access, click :guilabel:`Share Project` at the top of the +project’s settings, then click the :icon:`fa-trash-o` :guilabel:`(trash)` icon. + +.. note:: + Internal users without access to the project can still access a task if the URL has been shared + with them. For projects set as :guilabel:`Invited internal users (private)`, they must also + be a follower of the task. + Scheduling activities ===================== diff --git a/content/applications/services/project/tasks/recurring_tasks.rst b/content/applications/services/project/tasks/recurring_tasks.rst index 1c0ca9780b..ba02433e99 100644 --- a/content/applications/services/project/tasks/recurring_tasks.rst +++ b/content/applications/services/project/tasks/recurring_tasks.rst @@ -7,7 +7,7 @@ weekly meetings or status reports. The **recurring tasks** feature allows you to creation of those tasks. .. seealso:: - `Odoo Tutorials: Recurring tasks `_ + `Odoo Tutorials: Recurring tasks `_ Configuration ============= diff --git a/content/applications/services/project/tasks/task_creation.rst b/content/applications/services/project/tasks/task_creation.rst index 6ff6e0174d..e67233cfcb 100644 --- a/content/applications/services/project/tasks/task_creation.rst +++ b/content/applications/services/project/tasks/task_creation.rst @@ -109,17 +109,17 @@ Creating tasks from a website form If you have the Website app installed in your database, you can configure any form on your website to trigger the creation of tasks in a project. -#. Go to the website page where you wish to add the the form and - :ref:`add the Form building block `. +#. Go to the website page where you wish to add the form and :doc:`add the Form building block + `. #. In the website editor, edit the following fields: - :guilabel:`Action`: select :guilabel:`Create a Task`. - :guilabel:`Project`: choose the project that you want the new tasks to be created in. -#. :ref:`Customize the form `. +#. :ref:`Customize the form `. When the form is submitted, it automatically creates a project task. The task's content is defined by the form's corresponding fields. .. seealso:: - :doc:`Dynamic website content <../../../websites/website/web_design/building_blocks/dynamic_content>` + :ref:`Website forms ` diff --git a/content/applications/services/timesheets.rst b/content/applications/services/timesheets.rst index 7036d92f82..89122abf74 100644 --- a/content/applications/services/timesheets.rst +++ b/content/applications/services/timesheets.rst @@ -14,4 +14,5 @@ Timesheets .. toctree:: :titlesonly: - timesheets/overview + timesheets/billing_rates + timesheets/time_off diff --git a/content/applications/services/timesheets/billing_rates.rst b/content/applications/services/timesheets/billing_rates.rst new file mode 100644 index 0000000000..1f940540ef --- /dev/null +++ b/content/applications/services/timesheets/billing_rates.rst @@ -0,0 +1,90 @@ +:show-content: + +======================================= +Timesheet billing rates and leaderboard +======================================= + +Odoo’s **Timesheets** app allows you to set personalized :ref:`billing rate targets ` +for employees. In addition to billing rate targets, a :ref:`leaderboard ` +can be enabled to motivate employees and gamify their experience. The leaderboard displays the +billable and total time logged by employees, and can be enhanced with +:ref:`motivational tips `. + +.. _timesheets/billing_rates/targets: + +Billing rate indicators +======================= + +Configuration +------------- + +To enable billing rate indicators, navigate to :menuselection:`Timesheets --> Configuration --> +Settings`, then enable :guilabel:`Billing Rate Indicators`, and click :guilabel:`Save`. + +To set up the targets, click :guilabel:`Set employee billable time targets`, access the employee +form that you wish to edit, navigate to the :guilabel:`Settings` tab, then encode the monthly +:guilabel:`Billing Time Target` in hours or days, depending on the :guilabel:`Encoding Method` +selected in the **Timesheets** :guilabel:`Settings`. + +.. note:: + Once the :guilabel:`Billing Rate Indicators` have been enabled, you can also set the employees' + :guilabel:`Monthly Billing Time Target` directly from the **Employees** app. + +Using the billing rate indicators +--------------------------------- + +Once enabled, the billing rate indicators are displayed in the upper right corner of the +:guilabel:`My Timesheets` menu in Kanban, grid, and list views for all users. The monthly amount of +time logged by the user is displayed in the following format: **logged billable time / billable time +target**. The percentage of completion of the billing rate target is also displayed, highlighted in +red if the user falls below the target and in green once the target is reached. + +Below the billing rate indicators, the total monthly amount of time logged by the user is also +displayed. + +.. image:: billing_rates/indicators.png + :alt: Billing rate indicators. + +.. _timesheets/billing_rates/leaderboard: + +Billing rate leaderboard +======================== + +Configuration +------------- + +After the :ref:`monthly billing time targets ` have been enabled, +Odoo offers the possibility of activating a **billing rate leaderboard** in order to motivate +employees and enhance workplace transparency. + +To enable the billing rate leaderboard, navigate to :menuselection:`Timesheets --> Configuration --> +Settings`, activate :guilabel:`Billing Rate Leaderboard`, then click :guilabel:`Save`. + +Using the billing rate leaderboard +---------------------------------- + +The billing rate leaderboard is then displayed in the upper right corner of the +:guilabel:`My Timesheets` view, next to the billing rate indicators. It displays the current top +three performers who have logged the highest percentage of their allocated billing hours. + +It also shows the amount of time logged by the signed-in user in the format: logged billable +time / billable time target, as well as the total time logged. + +Clicking on the area of the top three performers opens the leaderboard for all team members. Use the +drop-down menu in the upper left corner to switch between the :guilabel:`Billing Rate Leaderboard` +and the :guilabel:`Total Time Leaderboard`, which displays the total time logged by team members +across billable and internal projects. + +.. image:: billing_rates/leaderboard.png + :alt: Billing rate leaderboard. + +.. _timesheets/billing_rates/tips: + +Leaderboard tips +================ + +**Daily motivational tips**, displayed on the right side of the leaderboard, enhance the billing +rate and total time leaderboard. The tips are randomly selected and change daily. + +To create or edit existing tips, navigate to :menuselection:`Timesheets --> Configuration --> Tips`, +then click :guilabel:`New` or double-click a tip's text. diff --git a/content/applications/services/timesheets/billing_rates/indicators.png b/content/applications/services/timesheets/billing_rates/indicators.png new file mode 100644 index 0000000000..27ed83e38b Binary files /dev/null and b/content/applications/services/timesheets/billing_rates/indicators.png differ diff --git a/content/applications/services/timesheets/billing_rates/leaderboard.png b/content/applications/services/timesheets/billing_rates/leaderboard.png new file mode 100644 index 0000000000..192ef8ce53 Binary files /dev/null and b/content/applications/services/timesheets/billing_rates/leaderboard.png differ diff --git a/content/applications/services/timesheets/overview.rst b/content/applications/services/timesheets/overview.rst deleted file mode 100644 index fa2fea1d6e..0000000000 --- a/content/applications/services/timesheets/overview.rst +++ /dev/null @@ -1,10 +0,0 @@ -:nosearch: - -======== -Overview -======== - -.. toctree:: - :titlesonly: - - overview/time_off diff --git a/content/applications/services/timesheets/overview/time_off.rst b/content/applications/services/timesheets/time_off.rst similarity index 100% rename from content/applications/services/timesheets/overview/time_off.rst rename to content/applications/services/timesheets/time_off.rst diff --git a/content/applications/services/timesheets/overview/time_off/record_time_off.png b/content/applications/services/timesheets/time_off/record_time_off.png similarity index 100% rename from content/applications/services/timesheets/overview/time_off/record_time_off.png rename to content/applications/services/timesheets/time_off/record_time_off.png diff --git a/content/applications/services/timesheets/overview/time_off/time_off_request.png b/content/applications/services/timesheets/time_off/time_off_request.png similarity index 100% rename from content/applications/services/timesheets/overview/time_off/time_off_request.png rename to content/applications/services/timesheets/time_off/time_off_request.png diff --git a/content/applications/services/timesheets/overview/time_off/time_off_types.png b/content/applications/services/timesheets/time_off/time_off_types.png similarity index 100% rename from content/applications/services/timesheets/overview/time_off/time_off_types.png rename to content/applications/services/timesheets/time_off/time_off_types.png diff --git a/content/applications/services/timesheets/overview/time_off/timesheet_description.png b/content/applications/services/timesheets/time_off/timesheet_description.png similarity index 100% rename from content/applications/services/timesheets/overview/time_off/timesheet_description.png rename to content/applications/services/timesheets/time_off/timesheet_description.png diff --git a/content/applications/services/timesheets/overview/time_off/timesheets.png b/content/applications/services/timesheets/time_off/timesheets.png similarity index 100% rename from content/applications/services/timesheets/overview/time_off/timesheets.png rename to content/applications/services/timesheets/time_off/timesheets.png diff --git a/content/applications/studio.rst b/content/applications/studio.rst index e6248779d0..66621659f5 100644 --- a/content/applications/studio.rst +++ b/content/applications/studio.rst @@ -15,8 +15,8 @@ Studio studio/pdf_reports studio/approval_rules -**Studio** is a toolbox used to customize Odoo without coding knowledge. For example, in any app, -add or modify: +**Odoo Studio** is a toolbox used to customize Odoo without coding knowledge. For example, in any +app, add or modify: - :doc:`Fields ` - :doc:`Views ` @@ -31,10 +31,22 @@ Learn how to :doc:`build an app from scratch `. .. _studio/access: -To access Studio, navigate to the app and model you want to modify, then click the :icon:`oi-studio` -(:guilabel:`Toggle Studio`) icon, or vice versa. +To access **Studio**, navigate to the app and model you want to modify, then click the +:icon:`oi-studio` (:guilabel:`Toggle Studio`) icon. Alternatively, with any app open, click the +:icon:`oi-studio` (:guilabel:`Toggle Studio`) icon and navigate to the relevant app and model. To close **Studio**, click :guilabel:`Close` in the upper-right corner. +.. warning:: + Installing **Studio** in an Odoo database on the *Standard* pricing plan automatically triggers + an upsell to the *Custom* pricing plan. + + - **For yearly or multi-year contracts**: An upsell order is created with a 30-day limit. + - **For monthly contracts**: The subscription automatically switches to the *Custom* plan and + the new rate is applied when the next bill is generated. + + For more information, refer to `Odoo's pricing page `_ or + contact your account manager. + .. seealso:: `Odoo Tutorials: Studio `_ diff --git a/content/applications/studio/automated_actions.rst b/content/applications/studio/automated_actions.rst index 196713b861..f03b1cdba7 100644 --- a/content/applications/studio/automated_actions.rst +++ b/content/applications/studio/automated_actions.rst @@ -4,34 +4,50 @@ Automation rules ================ -Automation rules are used to trigger automatic changes based on user actions (e.g., apply a -modification when a field is set to a specific value), email events, time conditions (e.g., archive -a record 7 days after its last update), or external events. +Automation rules allow the execution of one or more predefined actions in response to a specific +trigger, e.g., create an activity when a field is set to a specific value, or archive a record 7 +days after its last update. -To create an automation rule with Studio, proceed as follows: +When creating an automation rule, it is possible to :ref:`add conditions that must be met +` for the automation rule to run, e.g., the opportunity must be +assigned to a specific salesperson, or the state of the record must not be :guilabel:`Draft`. + +To create an automation rule with **Odoo Studio**: #. :ref:`Open Studio ` and click :guilabel:`Automations`, then :guilabel:`New`. -#. Select the :ref:`studio/automated-actions/trigger` and, if necessary, fill in the fields that - appear on the screen based on the chosen trigger. -#. Click :guilabel:`Add an action`, then select the :guilabel:`Type` of - :ref:`action ` and fill in the fields that appear on the screen - based on your selected action. -#. Click :guilabel:`Save & Close` or :guilabel:`Save & New`. +#. Give the automation rule a clear, meaningful name that identifies its purpose. +#. Select the :ref:`Trigger ` and, if necessary, fill in the + fields that appear on the screen based on the chosen trigger. +#. Click :guilabel:`Add an action` in the :guilabel:`Actions To Do` tab. + + .. tip:: + If no explicit name is entered, the name of the action will be automatically generated based + on the action you define; the name can be updated at any time. + +#. Select the :guilabel:`Type` of :ref:`action ` and complete the + relevant fields based on the chosen action. +#. Click :guilabel:`Save & Close` or, to define additional actions, :guilabel:`Save & New`. .. example:: - .. image:: automated_actions/automation-rule-ex.png - :alt: Example of an automated action on the Subscription model + To ensure follow-up on less satisfied clients, this automation rule creates an activity 3 months + after a sales order is created for clients with a satisfaction percentage lower than 30%. + + .. image:: automated_actions/trigger-timing-conditions.png + :alt: Example of an automation rule on the Subscription model + :scale: 90% .. tip:: - - To modify the :doc:`model ` of the automation rule, switch models before - clicking :guilabel:`Automations` in Studio, or :ref:`activate the developer mode + - Use the :guilabel:`Notes` tab to document the purpose and functioning of automation rules. This + makes rules easier to maintain and facilitates collaboration between users. + - To modify the :doc:`model ` targeted by the automation rule, switch models + before clicking :guilabel:`Automations` in Studio, or :ref:`activate developer mode `, create or edit an automation rule, and select the :guilabel:`Model` in the :guilabel:`Automation Rules` form. - - You can also create automation rules from any kanban stage by clicking the gear icon - (:guilabel:`⚙` ) next to the kanban stage name, then selecting :guilabel:`Automations`. In this - case, the :guilabel:`Trigger` is set to :guilabel:`Stage is set to` by default, but you can - change it if necessary. + - Automation rules can be created from any kanban stage by clicking the :icon:`fa-cog` + :guilabel:`(Settings)` icon that appears when hovering over the kanban stage name, then + selecting :guilabel:`Automations`. In this case, the :guilabel:`Trigger` is set to + :guilabel:`Stage is set to` by default, but it can be changed if necessary. .. image:: automated_actions/automations-kanban.png :alt: Create automations from a kanban stage @@ -41,102 +57,143 @@ To create an automation rule with Studio, proceed as follows: Trigger ======= -The :guilabel:`Trigger` is used to define when the automation rule should be applied. The available -triggers depend on the :doc:`model `. Five trigger categories are available -overall: +The :guilabel:`Trigger` is used to define what kind of event needs to occur for the automation rule +to run. The available triggers depend on the :doc:`model `. Five trigger +categories are available overall: + +- :ref:`studio/automated-actions/trigger-values-updated` +- :ref:`studio/automated-actions/trigger-email-events` +- :ref:`studio/automated-actions/trigger-timing-conditions` +- :ref:`studio/automated-actions/trigger-custom` +- :ref:`studio/automated-actions/trigger-external` -- :ref:`studio/automated-actions/trigger/values-updated` -- :ref:`studio/automated-actions/trigger/email-events` -- :ref:`studio/automated-actions/trigger/values-timing-conditions` -- :ref:`studio/automated-actions/trigger/custom` -- :ref:`studio/automated-actions/trigger/external` +.. _studio/automated-actions/conditions: + +Adding conditions +----------------- + +Domain filters allow you to determine the records an automation rule should target or exclude. +Efficient filtering enhances overall performance as it avoids unnecessary processing on records that +are not impacted by the rule. .. tip:: - You can also define a :guilabel:`Before Update Domain` to specify the conditions that must be met - *before* the automation rule is triggered. In contrast, the conditions defined using the - :ref:`Extra Conditions ` and - :ref:`Apply on ` filters are checked *during* the - execution of the automation rule. + :ref:`Activate developer mode ` before creating an automation rule to have the + most flexibility in adding domain filters. + +Depending on the trigger chosen, it is possible to define one or more conditions a record must meet +*before* and/or *after* a trigger occurs. + +- The :guilabel:`Before Update Domain` defines the conditions a record must meet *before* the + trigger event occurs, e.g., the record must have `Type = Customer Invoice` and `Status = Posted`. + + With :ref:`developer mode activated `, click :guilabel:`Edit Domain`, if + available, then :guilabel:`New Rule`. - To define a :guilabel:`Before Update Domain`, :ref:`activate the developer mode - `, create or edit an automation rule, click :guilabel:`Edit Domain`, then click - :guilabel:`New Rule`. +- :guilabel:`Extra Conditions`, or in some cases :guilabel:`Apply on` filters, define the conditions + a record must meet *after* the trigger event occurs, e.g., the customer invoice must have `Payment + Status = Partially Paid`. - For example, if you want the automated action to happen when an email address is set on a - contact that did not have an address before (in contrast to modifying their existing address), - define the :guilabel:`Before Update Domain` to :guilabel:`Email is not set`, and the - :guilabel:`Apply on` domain to :guilabel:`Email is set`. + With :ref:`developer mode activated ` if needed, click :guilabel:`Add conditions` + or :guilabel:`Edit Domain`, as relevant, then :guilabel:`New Rule`. + +When a :ref:`trigger ` occurs, e.g., the payment status of a +posted customer invoice is updated, the automation rule checks the defined conditions and only +executes the :ref:`action ` if the record matches those conditions. + +.. example:: + If the automated action should be executed when an email address is set for the first time (in + contrast to modifying an email address) on an existing contact that is an individual rather than + a company, use `Email is not set` and `Is a Company is not set` as the :guilabel:`Before Update + Domain` and `Email is set` as the :guilabel:`Apply on` domain. .. image:: automated_actions/before-update-domain.png :alt: Example of a trigger with a Before Update Domain + :scale: 80% -.. _studio/automated-actions/trigger/values-updated: +.. note:: + The :guilabel:`Before Update Domain` is not checked upon the creation of a record. + +.. _studio/automated-actions/trigger-values-updated: Values Updated -------------- -The triggers available in this category depend on the model and are based on common field changes, -such as adding a specific tag (e.g., to a task) or setting the :guilabel:`User` field. Select the -trigger, then select a value if required. +Trigger automated actions when specific changes happen in the database. The triggers available in +this category depend on the model and are based on common changes, such as adding a specific tag +(e.g., to a task) or setting a field's value (e.g., setting the :guilabel:`User` field). -.. image:: automated_actions/values-updated-trigger.png - :alt: Example of a Values Updated trigger +Select the trigger, then select a value if required. -.. _studio/automated-actions/trigger/email-events: +.. _studio/automated-actions/trigger-email-events: Email Events ------------ Trigger automated actions upon receiving or sending emails. -.. _studio/automated-actions/trigger/values-timing-conditions: +.. _studio/automated-actions/trigger-timing-conditions: Timing Conditions ----------------- -Trigger automated actions based on a date field. The following triggers are available: +Trigger automated actions at a point in time relative to a date field or to the creation or update +of a record. The following triggers are available: -- :guilabel:`Based on date field`: Select the field to be used next to the :guilabel:`Delay` field. -- :guilabel:`After creation`: The action is triggered when a record is created and saved. -- :guilabel:`After last update`: The action is triggered when an existing record is edited and - saved. +- :guilabel:`Based on date field`: The action is triggered a defined period of time before or after + the date of the selected date field. +- :guilabel:`After creation`: The action is triggered a defined period of time after a record is + created and saved. +- :guilabel:`After last update`: The action is triggered a defined period of time after an existing + record is edited and saved. You can then define: -- a :guilabel:`Delay`: Specify the number of minutes, hours, days, or months. To trigger the action - before the trigger date, specify a negative number. If you selected the :guilabel:`Based on date - field` trigger, you must also select the date field to be used to determine the delay. -- :guilabel:`Extra Conditions`: Click :guilabel:`Add condition`, then specify the conditions to be - met to trigger the automation rule. Click :guilabel:`New Rule` to add another condition. +- a :guilabel:`Delay`: Specify the number of :guilabel:`Minutes`, :guilabel:`Hours`, + :guilabel:`Days`, or :guilabel:`Months` after which the action should be triggered. If you + selected the :guilabel:`Based on date field` trigger, the action can be triggered + :guilabel:`After` or :guilabel:`Before` the selected date field. -The action is triggered when the delay is reached and the conditions are met. + .. note:: + By default, the scheduler checks for time-triggered automation rules every 240 minutes, or 4 + hours. This frequency is generally sufficient for delays such as 3 months after the order date + or 7 days after the last update. -.. example:: - If you want to send a reminder email 30 minutes before the start of a calendar event, select the - :guilabel:`Start (Calendar Event)` under :guilabel:`Trigger Date` and set the :guilabel:`Delay` - to **-30** :guilabel:`Minutes`. + For delays of less than the equivalent of 2400 minutes, or 40 hours, the system recalculates + the frequency of this check to ensure that more granular delays, e.g., 1 hour before the event + start date and time, or 30 minutes after creation, can be respected as closely as possible. - .. image:: automated_actions/timing-conditions-trigger.png - :alt: Example of a Based on date field trigger + To view or manually edit the frequency of the scheduler for a time-triggered automation rule, + with :ref:`developer mode activated `, click :guilabel:`Scheduled action`. -.. note:: - By default, the scheduler checks for trigger dates every 4 hours, meaning lower granularity in - time-based automations may not always be honored. + .. image:: automated_actions/trigger-delay-scheduled-action.png + :alt: Direct link to scheduled action for automations + + In the :guilabel:`Automation Rules: check and execute` scheduled action that opens, update the + value of the :guilabel:`Execute Every` field, if desired. Clicking :guilabel:`Run Manually` + triggers the scheduled action to run immediately. To return to the automation rule setup, click + the automation rule name in the breadcrumbs. + +- :guilabel:`Extra Conditions`: Click :guilabel:`Add condition`, then specify the conditions to be + met for the automation rule to run. Click :guilabel:`New Rule` to add another condition. -.. _studio/automated-actions/trigger/custom: +The action is executed when the delay is reached and the conditions are met. + +.. _studio/automated-actions/trigger-custom: Custom ------ Trigger automated actions: -- :guilabel:`On save`: When the record is saved; -- :guilabel:`On deletion`: When a record is deleted; -- :guilabel:`On UI change`: When a field's value is changed on the :ref:`Form view - `, even before saving the record. +- :guilabel:`On create`: when a record is saved for the first time. +- :guilabel:`On create and edit`: when a record is saved for the first time and any subsequent time. +- :guilabel:`On deletion`: when a record is deleted. +- :guilabel:`On UI change`: when a field's value is changed on the :ref:`Form view + `, even before the record is saved. -For the :guilabel:`On save` and :guilabel:`On UI change` triggers, you **must** then select the -field(s) to be used to trigger the automation rule in the :guilabel:`When updating` field. +For the :guilabel:`On create and edit` and :guilabel:`On UI change` triggers, you **must** then +select the field(s) to be used to trigger the automation rule in the :guilabel:`When updating` +field. .. warning:: If no field is selected in the :guilabel:`When updating` field, the automated action may be @@ -146,137 +203,239 @@ Optionally, you can also define additional conditions to be met to trigger the a the :guilabel:`Apply on` field. .. note:: - The :guilabel:`On UI change` trigger can only be used with the - :ref:`studio/automated-actions/action/python-code` action and only works when a modification is - made manually. The action is not executed if the field is changed through another automation - rule. + The :guilabel:`On UI change` trigger can only be used with the :ref:`Execute Code + ` action and only works when a modification is made + manually. The action is not executed if the field is changed through another automation rule. -.. _studio/automated-actions/trigger/external: +.. _studio/automated-actions/trigger-external: External -------- -Trigger automated actions based on an external event using a webhook. A webhook is a method of -communication between two systems where the source system sends an HTTP(S) request to a destination -system based on a specific event. It usually includes a data payload containing information about -the event that occurred. +Trigger automated actions based on a specific event in an external system or application using a +:doc:`webhook `. -To configure the :guilabel:`On webhook` trigger, copy the :guilabel:`URL` generated by Odoo into the -destination system (i.e., the system receiving the request). Then, in the :guilabel:`Target Record` -field, enter the code to run to define the record(s) to be updated using the automation rule. +After the webhook is configured in Odoo, where the webhook's URL is generated and the target record +defined, it needs to be implemented in the external system. .. warning:: - The URL must be treated as **confidential**; sharing it online or without caution could - potentially expose your system to malicious parties. Click the :guilabel:`Rotate Secret` button - to change the URL's secret if necessary. + It is *highly recommended* to consult with a developer, solution architect, or another technical + role when deciding to use webhooks and throughout the implementation process. If not properly + configured, webhooks may disrupt the Odoo database and can take time to revert. + +.. image:: automated_actions/webhook-update-record.png + :alt: Example of a Based on date field trigger + :scale: 80% .. note:: - - The code defined by default in the :guilabel:`Target Record` field works for webhooks coming - from another Odoo database. It is used to determine the record(s) to be updated using the - information in the payload. - - If you wish to use the webhook's content for a purpose other than to find the record(s) (e.g., - *create* a record), your only option is to use an :ref:`studio/automated-actions/action/python-code` - action. In this case, the :guilabel:`Target record` field must contain any valid code, but its - result doesn't have any effect on the automated action itself. - - The webhook content is available in the server action context as a `payload` variable (i.e., a - dictionary that contains the GET parameters or POST JSON body of the incoming request). - -You can also choose to :guilabel:`Log Calls` to record the payloads received, e.g., to make sure the -data sent by the source system matches the expected format and content. This also helps identify -and diagnose any issues that may arise. To access the logs, click the :guilabel:`Logs` smart -button at the top of the :guilabel:`Automation rules` form. + It is also possible to set up an automated action that :ref:`sends data to a external system's + webhook ` when an event occurs in your Odoo database. .. seealso:: - :doc:`automated_actions/webhooks` + :doc:`Webhook documentation ` .. _studio/automated-actions/action: Actions ======= -Once you have defined the automation rule's :ref:`trigger `, click -:guilabel:`Add an action` to define the action to be executed. +Once you have defined the automation rule's :ref:`trigger `, +click :guilabel:`Add an action` in the :guilabel:`Actions To Do` tab to define the action(s) to be +executed. .. tip:: - You can define multiple actions for the same trigger/automation rule. The actions are executed - in the order they are defined. This means, for example, that if you define an - :guilabel:`Update record` action and then a :guilabel:`Send email` action, the email uses the - updated values. However, if the :guilabel:`Send email` action is defined before the - :guilabel:`Update record` action, the email uses the values set *before* the update action is - run. + You can define multiple actions for the same automation rule. By default, actions are executed in + the order in which they were defined. + + This means, for example, that if you define an :guilabel:`Update record` action and then a + :guilabel:`Send email` action where the email references the field that was updated, the email + uses the updated values. However, if the :guilabel:`Send email` action is defined before the + :guilabel:`Update record` action, the email uses the values set *before* the record is updated. -.. _studio/automated-actions/action/update-record: + To change the order of defined actions, click the :icon:`oi-draggable` :guilabel:`(drag handle)` + icon beside an action and drag it to the desired position. + +.. _studio/automated-actions/action-update-record: Update Record ------------- -This action allows to update one of the record's (related) fields. Click the :guilabel:`Update` -field and, in the list that opens, select or search for the field to be updated; click the right -arrow next to the field name to access the list of related fields if needed. +This action is used to update one of the record's (related) fields. The following options are +available: + +- :guilabel:`Update`: updates the selected field with the specified value. +- :guilabel:`Update with AI`: updates the selected field dynamically based on the AI prompt + provided. This option requires the **Odoo AI** app to be installed. +- :guilabel:`Compute`: updates the selected field dynamically using Python code. + +To define the action: -If you selected a :ref:`many2many field `, choose whether -the field must be updated by :guilabel:`Adding`, :guilabel:`Removing`, or :guilabel:`Setting it to` -the selected value or by :guilabel:`Clearing it`. +#. With the :guilabel:`Update`, :guilabel:`Update with AI`, or :guilabel:`Compute` option selected, + as relevant, select or search for the field to be updated in the list that opens. If needed, + click the :icon:`oi-chevron-right` :guilabel:`(right arrow)` next to the field name to access the + list of related fields. +#. Provide the relevant information based on the option selected. + +Update +~~~~~~ + +Select or enter the updated value for the field. + +If a :ref:`many2many field ` is being updated, choose +whether the field must be updated by :guilabel:`Adding`, :guilabel:`Removing`, or :guilabel:`Setting +it to` the selected value or by :guilabel:`Clearing it`. .. example:: If you want the automated action to remove a tag from the customer record, set the - :guilabel:`Update` field to :guilabel:`Customer > Tags`, select :guilabel:`By Removing`, then - select the tag. + :guilabel:`Update` field to :guilabel:`Customer > Tags`, select :guilabel:`by Removing`, then + select the tag to be removed. - .. image:: automated_actions/update-record-action.png + .. image:: automated_actions/update-record-tags.png :alt: Example of an Update Record action + :scale: 80% -.. tip:: - Alternatively, you can also set a record's field dynamically using Python code. To do so, select - :guilabel:`Compute` instead of :guilabel:`Update`, then enter the code to be used for computing - the field's value. For example, if you want the automation rule to compute a custom - :ref:`datetime field ` when a task's priority is set to - `High` (by starring the task), you can define the trigger :guilabel:`Priority is set to` to - `High` and define the :guilabel:`Update Record` action as follows: +Update with AI +~~~~~~~~~~~~~~ + +Enter a prompt to instruct Odoo AI how to update the field. Type `/` to open the :guilabel:`AI +prompt tools`; use :guilabel:`Field Selector` to tell Odoo AI which related fields to check for +context, and :guilabel:`Records Selector` to provide possible values for the updated field. + +.. example:: + If you want the automation rule to update the :guilabel:`Assignees` field of a newly created + task based on the employees' expertise, you can write a prompt to instruct the Odoo AI to check + the :guilabel:`Display Name` field of the task for the context, then to assign the most suitable + employee. + + .. image:: automated_actions/update-record-ai.png + :alt: Example of an Update Record action using AI + :scale: 80% + +Compute +~~~~~~~ + +Enter the code to be used for computing the field's value. + +.. example:: + If you want the automation rule to compute a custom :ref:`datetime field + `, :guilabel:`Escalated on`, when a task's priority is set + to `Very high` (three stars), you can define the trigger :guilabel:`Priority is set to` to `Very + High` and define the :guilabel:`Update Record` action as follows: .. image:: automated_actions/update-record-compute.png :alt: Compute a custom datetime field using a Python expression + :scale: 80% + +.. _studio/automated-actions/action-create-record: + +Create Record and Duplicate Record +---------------------------------- + +These actions are used to create a new or duplicated record on any model. + +To define the action: + +#. With :guilabel:`Create Record` or :guilabel:`Duplicate Record` selected as the :guilabel:`Type` + of action, as relevant, select the required model in the :guilabel:`Record to Create` field; the + field contains the current model by default. +#. Specify a :guilabel:`Name` for the record, or, if the action duplicates a record, indicate the + record being duplicated in the :guilabel:`Duplicate from` field. +#. If the new or duplicated record is being created on another model, select a field in the + :guilabel:`Link Field` field to link the record that triggered the creation of the new or + duplicated record. + +.. tip:: + The :guilabel:`Link Field` dropdown menu only contains :ref:`one2many fields + ` existing on the current model that are linked to a + :ref:`many2one field ` on the target model. + +.. example:: + If you want the automation rule to duplicate a project, e.g. a project template with predefined + tasks, when an opportunity is set to `Won`, add a custom `Related opportunity` :ref:`many2one + field ` field on the *Project* model and a custom + `Related project` :ref:`one2many field ` field on the + *Lead* model, then provide the following details about the record being duplicated: + + .. image:: automated_actions/duplicate-record.png + :alt: Duplicate a record in a different model + :scale: 80% + +.. tip:: + You can create another automation rule with :ref:`studio/automated-actions/action-update-record` + actions to update the fields of the new or duplicated record if necessary. For example, you can + use a :guilabel:`Create Record` action to create a new project task and then assign it to a + specific user using an :guilabel:`Update Record` action. + +.. _studio/automated-actions/action-create-activity: Create Activity --------------- -This action is used to schedule a new activity linked to the record. Select an :guilabel:`Activity -Type`, enter a :guilabel:`Title` and description, then specify when you want the activity to be -scheduled in the :guilabel:`Due Date In` field, and select a :guilabel:`User type`: +This action is used to schedule a new activity linked to the record. + +To define the action: -- To always assign the activity to the same user, select :guilabel:`Specific User` and add the user - in the :guilabel:`Responsible` field; -- To target a user linked to the record dynamically, select :guilabel:`Dynamic User (based on - record)` and change the :guilabel:`User Field` if necessary. +#. With :guilabel:`Create Activity` selected as the :guilabel:`Type` of action, select the + appropriate :guilabel:`Activity Type` from the dropdown menu. +#. Enter a :guilabel:`Title`. +#. Indicate by when the activity should be completed by specifying a number of :guilabel:`Days`, + :guilabel:`Weeks`, or :guilabel:`Months` in the :guilabel:`Due Date In` field. +#. Select a :guilabel:`User type`: + + - To always assign the activity to the same user, select :guilabel:`Specific User`, then add the + user in the :guilabel:`Responsible` field. + - To target a user linked to the record dynamically, select :guilabel:`Dynamic User (based on + record)`. If needed, change the :guilabel:`User Field` by clicking on the placeholder field + name then selecting or searching for the user field in the list that appears. Clicking the + :icon:`oi-chevron-right` :guilabel:`(right arrow)` next to the field name allows you to access + related fields if needed. +#. Optionally, add a :guilabel:`Note` to provide more information about the activity. .. example:: - After a lead is turned into an opportunity, you want the automated action to set up a call for - the user responsible for the lead. To do so, set the :guilabel:`Activity Type` to - :guilabel:`Call` and the :guilabel:`User Type` to :guilabel:`Dynamic User (based on record)`. + After a proposition is sent to a opportunity with a high expected revenue, you want to create an + activity for the salesperson's team leader to call the potential client to increase the chances + of closing the deal. + + To do so, set the :guilabel:`Activity Type` to :guilabel:`Call` and the :guilabel:`User Type` to + :guilabel:`Dynamic User (based on record)`. Click on the placeholder field and select + :guilabel:`Sales Team`, then click the :icon:`oi-chevron-right` :guilabel:`(right arrow)` and + select :guilabel:`Team Leader`. .. image:: automated_actions/create-activity-action.png :alt: Example of a Create Activity action + :scale: 80% + +.. _studio/automated-actions/action-send-email-sms: Send Email and Send SMS ----------------------- These actions are used to send an email or a text message to a contact linked to a specific record. -To do so, select or create an :guilabel:`Email Template` or an :guilabel:`SMS Template`, then, in -the :guilabel:`Send Email As` or :guilabel:`Send SMS As` field, choose how you want to send the -email or text message: - -- :guilabel:`Email`: to send the message as an email to the recipients of the :guilabel:`Email - Template`. -- :guilabel:`Message`: to post the message on the record and notify the record's followers. -- :guilabel:`Note`: to send the message as an internal note visible to internal users in the - chatter. -- :guilabel:`SMS (without note)`: to send the message as a text message to the recipients of the - :guilabel:`SMS template`. -- :guilabel:`SMS (with note)`: to send the message as a text message to the recipients of the - :guilabel:`SMS template` and post it as an internal note in the chatter. -- :guilabel:`Note only`: to only post the message as an internal note in the chatter. - -.. _studio/automated-actions/action/send-whatsapp: + +To define the action: + +#. With :guilabel:`Send Email` or :guilabel:`Send SMS` selected as the :guilabel:`Type` of action, + as relevant, select or create an :guilabel:`Email Template` or :guilabel:`SMS Template`. +#. In the :guilabel:`Send Email As` or :guilabel:`Send SMS As` field, choose how you want to send the + email or text message. + + For an email, select: + + - :guilabel:`Email`: to send the message as an email to the recipients of the :guilabel:`Email + Template`. + - :guilabel:`Message`: to post the message on the record and notify the record's followers. + - :guilabel:`Note`: to send the message as an internal note visible to internal users in the + chatter. + + For a text message, select: + + - :guilabel:`SMS (without note)`: to send the message as a text message to the recipients of the + :guilabel:`SMS template`. + - :guilabel:`SMS (with note)`: to send the message as a text message to the recipients of the + :guilabel:`SMS template` and post it as an internal note in the chatter. + - :guilabel:`Note only`: to only post the message as an internal note in the chatter. + +.. _studio/automated-actions/action-send-whatsapp: Send WhatsApp ------------- @@ -286,41 +445,48 @@ Send WhatsApp :ref:`WhatsApp templates ` must be created. This action is used to send a WhatsApp message to a contact linked to a specific record. -To do so, select the appropriate :guilabel:`WhatsApp Template` from the drop-down menu. -.. _studio/automated-actions/action/add-followers: +With :guilabel:`Send WhatsApp` selected as the :guilabel:`Type` of action, select the appropriate +:guilabel:`WhatsApp Template` from the dropdown menu. + +.. _studio/automated-actions/action-add-remove-followers: Add Followers and Remove Followers ---------------------------------- -Use these actions to (un)subscribe existing contacts to/from the record. +This action is used to subscribe/unsubscribe existing contacts as followers of the record. -Create Record -------------- +With :guilabel:`Add Followers` or :guilabel:`Remove Followers` selected as the :guilabel:`Type` of +action, as relevant, select a :guilabel:`Followers Type`: -This action is used to create a new record on any model. +- To always add/remove the same contact(s), select :guilabel:`Specific Followers` then select the + contact(s) from the dropdown menu. Multiple contacts can be added/removed. -Select the required model in the :guilabel:`Record to Create` field; it contains the current model -by default. Specify a :guilabel:`Name` for the record, and then, if you want to create the record on -another model, select a field in the :guilabel:`Link Field` field to link the record that -triggered the creation of the new record. +- To add/remove a contact linked to the record dynamically, select :guilabel:`Dynamic Followers`. If + needed, change the :guilabel:`Followers Field` by clicking on the placeholder field name then + selecting or searching for the partner field in the list that appears. Clicking the + :icon:`oi-chevron-right` :guilabel:`(right arrow)` next to the field name allows you to access + related fields if needed. -.. note:: - The dropdown list related to the :guilabel:`Link Field` field only contains :ref:`one2many fields - ` existing on the current model that are linked to a - :ref:`many2one field ` on the target model. +.. example:: + To keep customers informed of progress on a project, this automated action adds the relevant + customer as a follower when a project task is set to `In progress`. -.. tip:: - You can create another automation rule with :ref:`studio/automated-actions/action/update-record` - actions to update the fields of the new record if necessary. For example, you can use a - :guilabel:`Create Record` action to create a new project task and then assign it to a specific - user using an :guilabel:`Update Record` action. + .. image:: automated_actions/add-followers-action.png + :alt: Adding the customer as a follower when project task set to in progress + :scale: 80% -.. _studio/automated-actions/action/python-code: +.. _studio/automated-actions/action-execute-code: Execute Code ------------ +.. important:: + For automation rules that require the execution of :ref:`custom code + `, note that maintenance of custom code is not + included in the *Standard* or *Custom* pricing plans and incurs :ref:`additional fees + `. + This action is used to execute Python code. You can write your code into the :guilabel:`Code` tab using the following variables: @@ -341,25 +507,44 @@ using the following variables: .. tip:: The available variables are described both in the :guilabel:`Code` and :guilabel:`Help` tabs. +.. seealso:: + :doc:`Odoo's ORM capabilities <../../developer/reference/backend/orm>` + .. _studio/automated-actions/action-webhook: Send Webhook Notification ------------------------- -This action allows to send a POST request with the values of the :guilabel:`Fields` to the URL -specified in the :guilabel:`URL` field. +This action is used to send a `POST` API request with the values of the selected :guilabel:`Fields` +to the webhook URL specified in the :guilabel:`URL` field. The :guilabel:`Sample Payload` provides a preview of the data included in the request using a random record's data or dummy data if no record is available. -.. _studio/automated-actions/action/several-actions: +.. note:: + It is also possible to set up an automated action that :doc:`uses a webhook to receive data from + an external system ` when a predefined event occurs in that system. + +.. _studio/automated-actions/action-existing-actions: + +Multi Actions +------------- + +This action is used to trigger multiple actions (linked to the current model) at the same time. + +To define the actions: + +#. With :guilabel:`Multi Actions` selected as the :guilabel:`Type` of action, click :guilabel:`Add + an action`. +#. In the :guilabel:`Add: Child Actions` pop-up: -Execute Existing Actions ------------------------- + - select one or more existing actions and click :guilabel:`Select`; or + - click :guilabel:`New`, define the action to be executed, then click :guilabel:`Save & Close` + or, to create additional actions, :guilabel:`Save & New` . +#. Repeat as many times as needed. -The action is used to trigger multiple actions (linked to the current model) at the same time. To do -so, click on :guilabel:`Add a line`, then, in the :guilabel:`Add: Child Actions` pop-up, select an -existing action or click :guilabel:`New` to create a new one. +.. image:: automated_actions/multi-actions.png + :alt: Define multiple actions to be executed .. toctree:: :titlesonly: diff --git a/content/applications/studio/automated_actions/add-followers-action.png b/content/applications/studio/automated_actions/add-followers-action.png new file mode 100644 index 0000000000..a5e33c6013 Binary files /dev/null and b/content/applications/studio/automated_actions/add-followers-action.png differ diff --git a/content/applications/studio/automated_actions/automation-rule-ex.png b/content/applications/studio/automated_actions/automation-rule-ex.png deleted file mode 100644 index 221bb156cd..0000000000 Binary files a/content/applications/studio/automated_actions/automation-rule-ex.png and /dev/null differ diff --git a/content/applications/studio/automated_actions/before-update-domain.png b/content/applications/studio/automated_actions/before-update-domain.png index a775c61598..fad4436e2b 100644 Binary files a/content/applications/studio/automated_actions/before-update-domain.png and b/content/applications/studio/automated_actions/before-update-domain.png differ diff --git a/content/applications/studio/automated_actions/create-activity-action.png b/content/applications/studio/automated_actions/create-activity-action.png index cc6e2f42d0..90c1e4f59d 100644 Binary files a/content/applications/studio/automated_actions/create-activity-action.png and b/content/applications/studio/automated_actions/create-activity-action.png differ diff --git a/content/applications/studio/automated_actions/duplicate-record.png b/content/applications/studio/automated_actions/duplicate-record.png new file mode 100644 index 0000000000..ebe9bb320d Binary files /dev/null and b/content/applications/studio/automated_actions/duplicate-record.png differ diff --git a/content/applications/studio/automated_actions/multi-actions.png b/content/applications/studio/automated_actions/multi-actions.png new file mode 100644 index 0000000000..9172e48283 Binary files /dev/null and b/content/applications/studio/automated_actions/multi-actions.png differ diff --git a/content/applications/studio/automated_actions/on-save-on-creation.png b/content/applications/studio/automated_actions/on-save-on-creation.png new file mode 100644 index 0000000000..773650963e Binary files /dev/null and b/content/applications/studio/automated_actions/on-save-on-creation.png differ diff --git a/content/applications/studio/automated_actions/timing-conditions-trigger.png b/content/applications/studio/automated_actions/timing-conditions-trigger.png deleted file mode 100644 index 41ca2575d0..0000000000 Binary files a/content/applications/studio/automated_actions/timing-conditions-trigger.png and /dev/null differ diff --git a/content/applications/studio/automated_actions/trigger-delay-scheduled-action.png b/content/applications/studio/automated_actions/trigger-delay-scheduled-action.png new file mode 100644 index 0000000000..1866e4a96e Binary files /dev/null and b/content/applications/studio/automated_actions/trigger-delay-scheduled-action.png differ diff --git a/content/applications/studio/automated_actions/trigger-timing-conditions.png b/content/applications/studio/automated_actions/trigger-timing-conditions.png new file mode 100644 index 0000000000..eb8cb0cc22 Binary files /dev/null and b/content/applications/studio/automated_actions/trigger-timing-conditions.png differ diff --git a/content/applications/studio/automated_actions/update-record-action.png b/content/applications/studio/automated_actions/update-record-action.png deleted file mode 100644 index 1915eef219..0000000000 Binary files a/content/applications/studio/automated_actions/update-record-action.png and /dev/null differ diff --git a/content/applications/studio/automated_actions/update-record-ai.png b/content/applications/studio/automated_actions/update-record-ai.png new file mode 100644 index 0000000000..b6ef3797c1 Binary files /dev/null and b/content/applications/studio/automated_actions/update-record-ai.png differ diff --git a/content/applications/studio/automated_actions/update-record-compute.png b/content/applications/studio/automated_actions/update-record-compute.png index c0c8129128..9eb9e702e7 100644 Binary files a/content/applications/studio/automated_actions/update-record-compute.png and b/content/applications/studio/automated_actions/update-record-compute.png differ diff --git a/content/applications/studio/automated_actions/update-record-tags.png b/content/applications/studio/automated_actions/update-record-tags.png new file mode 100644 index 0000000000..c2e6c62868 Binary files /dev/null and b/content/applications/studio/automated_actions/update-record-tags.png differ diff --git a/content/applications/studio/automated_actions/values-updated-trigger.png b/content/applications/studio/automated_actions/values-updated-trigger.png deleted file mode 100644 index 39758f7057..0000000000 Binary files a/content/applications/studio/automated_actions/values-updated-trigger.png and /dev/null differ diff --git a/content/applications/studio/automated_actions/webhook-update-record.png b/content/applications/studio/automated_actions/webhook-update-record.png new file mode 100644 index 0000000000..13cb528c06 Binary files /dev/null and b/content/applications/studio/automated_actions/webhook-update-record.png differ diff --git a/content/applications/studio/automated_actions/webhooks.rst b/content/applications/studio/automated_actions/webhooks.rst index bd16143347..2cd4c9ad07 100644 --- a/content/applications/studio/automated_actions/webhooks.rst +++ b/content/applications/studio/automated_actions/webhooks.rst @@ -7,280 +7,278 @@ Webhooks role when deciding to use webhooks and throughout the implementation process. If not properly configured, webhooks may disrupt the Odoo database and can take time to revert. -Webhooks, which can be created in **Studio**, are automation rules triggered by external events via -user-defined HTTP callbacks. When an external system sends data to an Odoo webhook's URL (the -"trigger") with a data file (the "payload"), Odoo responds with a predefined action in the database. +Webhooks, which can be created in **Odoo Studio**, allow you to automate an action in your Odoo +database when a specific event occurs in another, external system. -Unlike scheduled actions or manual API calls, webhooks enable real-time communication and -automation. For example, if a sales order is confirmed in an external POS system, a webhook can -instantly update Odoo's inventory, ensuring system synchronization. +In practice, this works as follows: when the event occurs in the external system, a data file (the +"payload") is sent to the Odoo webhook's URL via a `POST` API request, and a predefined action is +performed in your Odoo database. -.. note:: - This article covers creating a webhook that *takes in* data from an external source. However, - an automated action that :ref:`sends an API call to an external webhook - ` can also be created. - -Create a webhook in Studio -========================== +Unlike scheduled actions, which run at predefined intervals, or manual API requests, which need to +be explicitly invoked, webhooks enable real-time, event-driven communication and automation. For +example, you can set up a webhook to have your Odoo inventory data updated automatically when a +sales order is confirmed in an external point-of-sale system. -Webhooks are configured in **Studio**, and their setup is split between their :ref:`trigger -` and their :ref:`actions `. +Setting up a webhook in Odoo requires no coding when connecting two Odoo databases, but +:ref:`testing a webhook ` requires an external tool. +:ref:`Custom target records or actions ` may require programming +skills. -.. tip:: - - Setting up a webhook in Odoo requires no coding when connecting Odoo databases, but testing - requires an external tool like `Postman `_. :ref:`Custom target - records or actions ` may require programming skills. - - :ref:`Activate developer mode ` to modify the model targeted by the webhook - (e.g., sales orders or contact information) and to find the model's technical name (which may be - required for proper payload configuration). - -.. _studio/webhooks/webhook_trigger: +.. note:: + This article covers creating a webhook that *receives* data from an external source. However, + it is also possible to create an automated action that :ref:`sends data to an external webhook + ` when a change occurs in your Odoo database. -Set the webhook's trigger -------------------------- +.. _studio/webhooks/create-webhook: -To create a webhook with **Studio**, :ref:`open Studio `, click :guilabel:`Webhooks`, -then :guilabel:`New`. From here, name the webhook, modify the webhook's model (the kind of database -entry to be targeted) if needed, and toggle whether calls made to the webhook URL should be logged -(which would track the webhook's call history for troubleshooting). +Create a webhook in Odoo +======================== -The webhook's URL is automatically generated. This is the URL that should be used for testing the -webhook and connecting it to the external system that will send updates to the database. +.. important:: + Before implementing a webhook in a live database, configure and test it using a :ref:`duplicate + database ` to ensure the webhook performs as intended. -.. danger:: - The webhook's URL is **confidential** and should be treated with care. Sharing it online or - without caution can provide unintended access to the Odoo database. Click :guilabel:`Rotate - Secret` to change the URL if needed. +.. tip:: + :ref:`Activating developer mode ` before creating up a webhook gives greater + flexibility in selecting the :doc:`model <../models_modules_apps>` the automation rule + targets. It also allows you to find the technical name of the model and fields, which may be + needed to configure the payload. -Finally, if the system sending the webhook is not Odoo, adjust the :guilabel:`Target Record` actions -to look for the JSON record that is included in the API call's payload when the call is made to the -webhook's URL. If the system sending the webhook is an Odoo database, then make sure that the `id` -and `model` appear in the payload. + To find a model's technical name, with developer mode activated, hover over the model name and + then click :icon:`fa-arrow-right` :guilabel:`(Internal link)`. The technical name can be found in + the :guilabel:`Model` field. For example, a sales order webhook uses the *Sales + Order* model, but the technical name `sale.order` is used in the payload. -.. tip:: - Although the :guilabel:`Model` is set in Odoo, it is the model's technical name that must be - included in the payload. Hover over the model name, then click the :icon:`fa-arrow-right` - :guilabel:`(Internal link)` icon to find this technical name in the :guilabel:`Model` field. For - example, a sales order webhook uses the *Sales Order* model, but the technical name `sale.order` - is used in the payload. +To create a webhook in **Studio**, proceed as follows: -.. note:: - When creating a record in the Odoo database, the target record's default format should not be - used. Instead, use `model.browse(i)` or `model.search(i)`. +#. :ref:`Open Studio ` and click :guilabel:`Webhooks`, then :guilabel:`New`. +#. Give the webhook a clear, meaningful name that identifies its purpose. +#. If needed, and provided developer mode is activated, select the appropriate :guilabel:`Model` + from the dropdown. If developer mode is not activated, the automation rule targets the current + model by default. -.. _studio/webhooks/webhook_action: +#. The webhook's URL is automatically generated, but can be changed if needed by clicking + :guilabel:`Rotate Secret`. This is the URL that should be used when implementing the webhook in + the external system that will send updates to the database. -Set the webhook's action ------------------------- + .. warning:: + The URL is **confidential** and should be treated with care. Sharing it online or without + caution can provide unintended access to the Odoo database. If the URL is updated after the + initial implementation, make sure to update it in the external system. -To set a webhook's action while configuring a webhook, click :guilabel:`Add an action` under the -:guilabel:`Actions To Do` tab. Click the action's :guilabel:`Type` and set the fields as needed. +#. If desired, enable :guilabel:`Log Calls` to track the history of API requests made to the + webhook's URL, e.g., for troubleshooting purposes. -.. _studio/webhooks/test_webhook: +#. If the system sending the webhook is not Odoo, adjust the :guilabel:`Target Record` code to look + for the JSON record included in the payload when the API request is made to the webhook's URL. If + the system sending the webhook is an Odoo database, ensure that the `id` and `model` appear in + the payload. -Test the webhook ----------------- + If the webhook is used to create records in the Odoo database, use `model.browse(i)` or + `model.search(i)` instead of the default :guilabel:`Target Record` format. -.. note:: - Testing the webhook requires the webhook to be set up, a test payload to send to the webhook, and - an external tool or system to send the payload through a `POST` API request. Consider using a - tool like `Postman `_ so less technical skills are required. +#. Click :guilabel:`Add an action` in the :guilabel:`Actions To Do` tab to define the :ref:`actions + ` to be executed. +#. Before implementing the webhook in the external system, :ref:`test + ` it to ensure it works as intended. -If a message saying `200 OK` or `status: ok` gets returned during testing, then the webhook is -functioning properly on Odoo's side. From here, implementation can begin with the other tool to -automatically send those webhook calls into Odoo using the webhook's URL. +.. tip:: + - Webhooks can also be created via the :guilabel:`Automations` menu in **Studio** by selecting + the trigger :guilabel:`On webhook`. + - To access the history of API requests if :guilabel:`Log Calls` has been enabled, click the + :guilabel:`Logs` smart button at the top of the :guilabel:`Automation rules` form. + - If the purpose of the webhook is anything other than to update an existing record, e.g., to + create a new record, the :guilabel:`Execute Code` action must be chosen. -If any other responses are returned, the number sent in the response helps to identify the problem. -For example, a `500 Internal Server Error` means that Odoo could not interpret the call properly. If -this gets returned, ensure the fields found in the JSON file are properly mapped in the webhook's -configuration and in the system sending the test call. Turning on call logging in the webhook's -configuration provides error logs if the webhook is not functioning as intended. +.. _studio/webhooks/test-webhook: -Implement the webhook ---------------------- +Test a webhook +============== -Once the webhook is fully configured, begin connecting it to the system that sends data to the Odoo -database through this webhook. Make sure that the API calls are sent to the webhook's URL when -setting that system up. +Testing a webhook requires a test payload and an external tool or system, like +`Postman `_, to send the payload via a `POST` API request. This section +presents the steps to test a webhook in Postman. -.. _studio/webhooks/webhook_examples: +.. tip:: + - See the :ref:`webhook use cases section ` for step-by-step + explanations of how to test webhooks using test payloads. + - To get specific help with testing a webhook with Postman, contact their support team. -Webhook use cases -================= +#. In Postman, create a new HTTP request and set its method to :guilabel:`POST`. +#. Copy the webhook's URL from your Odoo database using the :icon:`fa-link` :guilabel:`(link)` icon + and paste it into the URL field in Postman. +#. Click the :guilabel:`Body` tab and select :guilabel:`raw`. +#. Set the file type to :guilabel:`JSON`, then copy the code from the test payload and paste it into + the code editor. +#. Click :guilabel:`Send`. -Below are two examples of how to use webhooks in Odoo. These webhooks require external tools (which -are listed with the example). +.. _studio/webhooks/test-webhook-response: -.. warning:: - Consult with a developer, solution architect, or another technical role when deciding to - implement webhooks. If not properly configured, webhooks may disrupt the Odoo database and can - take time to revert. +In the :guilabel:`Response` viewer at the bottom of the screen in Postman, details, including a HTTP +response code, indicate whether or not the webhook is functioning correctly. -Update a sales order's currency -------------------------------- +- A `200 OK` or `status: ok` message indicates that the webhook is functioning properly on Odoo's + side. From here, implementation can begin with the other system to automatically send the API + requests to the Odoo webhook's URL. -This webhook updates a sales order in the **Sales** app to USD. It useful for subsidiaries outside -the United States with a mother company located inside the United States or during mergers when -consolidating data into one Odoo database. - -Set the webhook's trigger -~~~~~~~~~~~~~~~~~~~~~~~~~ - -To set up this webhook, open the **Sales** app. Then, :ref:`set the trigger -` so the :guilabel:`Model` is set to `Sales Order`. Also, set -the :guilabel:`Target Record` to `model.env[payload.get('model')].browse(int(payload.get('id')))`. -This is broken down below. - -- **model**: what gets updated in Odoo (in this case, sales orders). This matches the - :guilabel:`Model` set earlier. -- **env**: where the action takes place. In this case, it is Odoo. -- **payload**: what is sent to the webhook's URL. This contains the information that updates - the sales order. -- **get('model')**: tells the webhook what database record to look at. In this case, the - webhook retrieves (`get`) the data tied to a specific `model`. In this example, this is the - Sales Order model. -- **browse**: tells the webhook to look in the `model` (Sales Order) set by the payload for what to - update. -- **int**: turns the target into an `integer` (a whole number). This is important in case some - words (a `string`) or a decimal number is included in the payload's target record. -- **get('id')**: identifies the sales order number that is being updated in Odoo. - -Set the webhook's action -~~~~~~~~~~~~~~~~~~~~~~~~ - -After setting the trigger, set the webhook's action by clicking :guilabel:`Add an action`. For the -:guilabel:`Type`, click :guilabel:`Update Record`. Then, select `Update`, choose the field -`Currency`, and select `USD` to have the currency field updated to USD. Finally, click -:guilabel:`Save & Close`. - -Webhook setup summary -~~~~~~~~~~~~~~~~~~~~~ - -To summarize what is set up, the webhook targets sales orders, identified by their sales order -number, and updates their currency to `USD` when a POST request is sent to the webhook's URL that -includes that sales order number (which is identified by the payload's `id` record). +- If any other response is returned, the number associated with it helps to identify the problem. + For example, a `500 Internal Server Error` message means that Odoo could not interpret the call + properly. In this case, ensure the fields found in the JSON file are properly mapped in the + webhook's configuration and in the system sending the test call. -Test the webhook -~~~~~~~~~~~~~~~~ +.. tip:: + Turning on call logging in the webhook's configuration in Odoo provides error logs if the webhook + is not functioning as intended. -Test the webhook's setup to make sure everything is correct. This process uses a tool called -`Postman `_ to send the simulated trigger. +Implement a webhook in an external system +========================================= -This section walks through the steps to test this webhook in Postman, but does not offer help if -there's an issue within that tool. To get specific help with Postman, contact their support team. +When the webhook has been successfully created in Odoo and tested, implement it in the system that +sends data to the Odoo database, making sure the `POST` API requests are sent to the webhook's URL. -Once Postman is open, create a new :guilabel:`HTTP` request and set its method to :guilabel:`POST`. -Next, copy the webhook's URL that is being tested and paste it into the URL field in Postman. After -that, click the :guilabel:`Body` tab and select the :guilabel:`raw` option. Set the file type to -:guilabel:`JSON`, then copy this code and paste it into the file. +.. _studio/webhooks/webhook-examples: -.. code-block:: json +Webhook use cases +================= - { - "model": "sale.order", - "id": "SALES ORDER NUMBER" - } +Below are two examples of how to use webhooks in Odoo. A test payload is provided for each example, +and can be found in the section on testing the webhook. `Postman `_ is +used to send the test payload. -From here, choose a sales order to test the webhook on. If it is not possible to test in a live -Odoo database, consider creating a demo database with a sample sales order and the webhook that was -configured. Replace `SALES ORDER NUMBER` with the sales order's number without the `S` or any zeros -before the number. For example, a sales order with the number `S00007` should be entered as `7` in -Postman. Finally, click :guilabel:`Send` in Postman. +Update a sales order's currency +------------------------------- -If a message saying `200 OK` or `status: ok` gets returned, then the webhook is functioning properly -on Odoo's side. The test sales order's currency is updated. From here, implementation can begin with -the other tool to automatically send those webhook calls into Odoo using the webhook's URL. +This webhook updates a sales order in the **Sales** app to `USD` when the external system sends a +`POST` API request to the webhook's URL that includes that sales order number (which is identified +by the payload's `id` record). -If any other responses are returned, the number associated with them helps to identify the problem. -For example, a `500 Internal Server Error` means that Odoo could not interpret the call properly. If -this gets returned, ensure the `model` and `id` fields are properly mapped in the webhook's -configuration and in Postman. +This could be useful for subsidiaries outside the United States with a mother company located inside +the United States or during mergers when consolidating data into one Odoo database. -.. _studio/webhooks/webhook-example: +Create the webhook +~~~~~~~~~~~~~~~~~~ -Create a new contact --------------------- +To create this webhook, proceed as follows: -This webhook uses custom code to create a new contact in an Odoo database. This could be helpful for -automatically creating new vendors or customers. +#. Open the **Sales** app, then :ref:`open Studio ` and click :guilabel:`Webhooks`. + The *Sales Order* model is selected by default. +#. Click :guilabel:`New`. The :guilabel:`Trigger` is set to :guilabel:`On webhook` by default. +#. Set the :guilabel:`Target Record` to + `model.env[payload.get('model')].browse(int(payload.get('id')))`, where: -Set the webhook's trigger -~~~~~~~~~~~~~~~~~~~~~~~~~ + - `payload.get('model')` retrieves the value associated with the `model` key in the payload, + i.e., `sale.order`, which is the technical name of the *Sales Order* model. + - `payload.get('id')` retrieves the value associated with the `id` key in the payload, i.e., + the number of the target sales order in your Odoo database with the `S` and leading + zeros removed. + - `int` converts the retrieved id to an integer (i.e., a whole number) because the method + `browse()` can only be used with an integer. -To set up this webhook, open the **Contacts** app. Then, :ref:`set the trigger -` so the :guilabel:`Model` is set to `Contact`. Also, set the -:guilabel:`Target Record` to `model.browse([2])`. This is broken down below. +#. Click :guilabel:`Add an action`. +#. In the :guilabel:`Type` section, click :guilabel:`Update Record`. +#. In the :guilabel:`Action details` section, select :guilabel:`Update`, choose the field + :guilabel:`Currency`, and select :guilabel:`USD`. +#. Click :guilabel:`Save & Close`. -- **model**: what gets updated in Odoo (in this case, a contact). This matches the :guilabel:`Model` - set earlier. -- **browse**: tells the webhook to look in the `model` (the contacts) set by the payload for - what to create. +Test the webhook +~~~~~~~~~~~~~~~~ -Set the webhook's action -~~~~~~~~~~~~~~~~~~~~~~~~ +To test this webhook, proceed as follows: -After setting the trigger, set the webhook's action by clicking :guilabel:`Add an action`. For the -:guilabel:`Type`, click :guilabel:`Execute Code`, then set the :guilabel:`code` to the sample code -below. Finally, click :guilabel:`Save & Close`. +#. With `Postman `_ open, create a new HTTP request and set its method to + :guilabel:`POST`. +#. Copy the URL of the Odoo webhook using the :icon:`fa-link` :guilabel:`(link)` icon and paste it + into the URL field in Postman. +#. Click the :guilabel:`Body` tab and select :guilabel:`raw`. +#. Set the file type to :guilabel:`JSON`, then copy this code, i.e., the payload, and paste it into + the code editor: -.. code-block:: python + .. code-block:: json - # variables to retrieve and hold data from the payload - contact_name = payload.get('name') - contact_email = payload.get('email') - contact_phone = payload.get('phone') + { + "model": "sale.order", + "id": "SALES ORDER NUMBER" + } - # a Python function to turn the variables into a contact in Odoo - if contact_name and contact_email: - new_partner = env['res.partner'].create({ - 'name': contact_name, - 'email': contact_email, - 'phone': contact_phone, - 'company_type':'person', - 'customer_rank': 1, - }) - # an error message for missing required data in the payload - else: - raise ValueError("Missing required fields: 'name' and 'email'") +#. In your Odoo database, choose a sales order to test the webhook on. In the pasted code, replace + `SALES ORDER NUMBER` with the sales order's number without the `S` or any zeros before the + number. For example, a sales order with the number `S00007` should be entered as `7` in Postman. +#. Click :guilabel:`Send`. +#. Consult the :ref:`Response viewer ` in Postman to + determine whether or not the webhook is functioning properly. If a message other than `200 OK` or + `status: ok` is returned, the number associated with the message helps to identify the problem. +.. _studio/webhooks/webhook-example: -Webhook setup summary -~~~~~~~~~~~~~~~~~~~~~ +Create a new contact +-------------------- -To summarize what is set up, the webhook creates a contact when an API call is sent to the webhook's -URL that includes the contact's information. +This webhook uses custom code to create a new contact in an Odoo database when the external system +sends a `POST` API request to the webhook's URL that includes the contact's information. This could +be helpful for automatically creating new vendors or customers. + +Create the webhook +~~~~~~~~~~~~~~~~~~ + +To create this webhook, proceed as follows: + +#. Open the **Contacts** app, then :ref:`open Studio ` and click :guilabel:`Webhooks`. + The *Contact* model is selected by default. +#. Click :guilabel:`New`. The :guilabel:`Trigger` is set to :guilabel:`On webhook` by default. +#. Set the :guilabel:`Target Record` to `model.browse([2])`. This is essentially a placeholder as + the code in the automated action tells the webhook what needs to be retrieved from the payload + and in which model the record needs to be created. +#. Click :guilabel:`Add an action`. +#. In the :guilabel:`Type` section, click :guilabel:`Execute Code`. +#. Copy this code and paste it into the code editor in the :guilabel:`Code` tab of the + :guilabel:`Action details` section: + + .. code-block:: python + + # variables to retrieve and hold data from the payload + contact_name = payload.get('name') + contact_email = payload.get('email') + contact_phone = payload.get('phone') + + # a Python function to turn the variables into a contact in Odoo + if contact_name and contact_email: + new_partner = env['res.partner'].create({ + 'name': contact_name, + 'email': contact_email, + 'phone': contact_phone, + 'company_type':'person', + 'customer_rank': 1, + }) + # an error message for missing required data in the payload + else: + raise ValueError("Missing required fields: 'name' and 'email'") + +#. Click :guilabel:`Save & Close`. Test the webhook ~~~~~~~~~~~~~~~~ -Test the webhook's setup to make sure everything is correct. This process uses a tool called -`Postman `_ to send the simulated trigger. - -This section walks through the steps to test this webhook in Postman, but does not offer help if -there's an issue within that tool. To get specific help with Postman, contact their support team. - -Once Postman is open, create a new request, and set its method to :guilabel:`POST`. Next, copy the -webhook's URL that is being tested and paste it into the URL field in Postman. After that, click the -:guilabel:`Body` tab and click :guilabel:`raw`. Set the file type to :guilabel:`JSON`, then copy -this code and paste it into the file. - -.. code-block:: json - - { - "name": "CONTACT NAME", - "email": "CONTACTEMAIL@EMAIL.COM", - "phone": "CONTACT PHONE NUMBER" - } - -Replace the fields above with a new contact's information in Postman, and then click -:guilabel:`Send`. - -If a message saying `200 OK` or `status: ok` gets returned, then the webhook is functioning properly -on Odoo's side. The new test contact appears in the **Contacts** app. From here, implementation can -begin with the other tool to automatically send those webhook calls into Odoo using the webhook's -URL. - -If any other responses are returned, the number associated with them helps to identify the problem. -For example, a `500 Internal Server Error` means that Odoo could not interpret the call properly. If -this gets returned, ensure the fields found in the JSON file are properly mapped in the webhook's -configuration and in Postman. +To test this webhook, proceed as follows: + +#. In `Postman `_, create a new HTTP request and set its method to + :guilabel:`POST`. +#. Copy the URL of the Odoo webhook using the :icon:`fa-link` :guilabel:`(link)` icon and paste it + into the URL field in Postman. +#. Click the :guilabel:`Body` tab and select :guilabel:`raw`. +#. Set the file type to :guilabel:`JSON`, then copy this code, i.e., the payload, and paste it into + the code editor: + + .. code-block:: json + + { + "name": "CONTACT NAME", + "email": "CONTACTEMAIL@EMAIL.COM", + "phone": "CONTACT PHONE NUMBER" + } + +#. In the pasted code, replace the `CONTACT NAME`, `CONTACTEMAIL@EMAIL.COM`, and `CONTACT PHONE + NUMBER` with a new contact's information. +#. Click :guilabel:`Send`. +#. Consult the :ref:`Response viewer ` in Postman to + determine whether or not the webhook is functioning properly. If a message other than `200 OK` or + `status: ok` is returned, the number associated with the message helps to identify the problem. diff --git a/content/applications/websites/ecommerce.rst b/content/applications/websites/ecommerce.rst index 9e9eef6127..5435678839 100644 --- a/content/applications/websites/ecommerce.rst +++ b/content/applications/websites/ecommerce.rst @@ -24,10 +24,10 @@ products and increase your average cart sizes. :titlesonly: ecommerce/products - ecommerce/cart ecommerce/checkout ecommerce/payments ecommerce/shipping ecommerce/order_handling ecommerce/customer_accounts ecommerce/performance + ecommerce/google_merchant_center diff --git a/content/applications/websites/ecommerce/cart.rst b/content/applications/websites/ecommerce/cart.rst deleted file mode 100644 index 3995e4b8e1..0000000000 --- a/content/applications/websites/ecommerce/cart.rst +++ /dev/null @@ -1,111 +0,0 @@ -=========== -Add to cart -=========== - -The :guilabel:`Add to Cart` button can be customized in multiple ways. You can: - -- Choose on which page customers go after clicking the 'Add to Cart' button; -- Hide the 'Add to Cart' button to prevent sales; -- Add a 'Buy Now' button to skip the cart step and lead customers straight to checkout; -- Create additional 'Add to Cart / Buy Now' buttons; -- Add an 'Order Again' button to the customer portal. - -.. seealso:: - :doc:`checkout` - -.. _ecommerce/cart/action_customization: - -'Add to Cart' action customization -================================== - -When customers click on the :guilabel:`Add to Cart` button, the product is added to their cart, and -customers remain **by default** on the product's page. However, customers can either immediately be -**redirected** to their cart, or given the choice on what to do through a **dialog box**. - -To change the default behavior, go to :menuselection:`Website --> Configuration --> Settings`. Under -the :guilabel:`Shop - Checkout Process` section, look for :guilabel:`Add to Cart` and select one of -the options. - -.. note:: - If a product has :doc:`optional products `, the **dialog - box** will always appear. - -.. seealso:: - :doc:`products/catalog` - -.. _cart/prevent-sale: - -Replace 'Add to Cart' button by 'Contact Us' button -=================================================== - -You can replace the 'Add to Cart' button with a 'Contact Us' button which redirects users to the URL -of your choice. - -.. note:: - Hiding the :guilabel:`Add to Cart` button is often used by B2B eCommerces that need to restrict - purchases only to :ref:`customers with an account `, but still want to - display an online product catalog for those without. - -To do so, go to :menuselection:`Website --> Configuration --> Settings --> Shop - Products` and tick -:guilabel:`Prevent Sale of Zero Priced Product`. This creates a new :guilabel:`Button url` field -where you can enter the **redirect URL** to be used. Then, set the price of the product to `0.00` -either from the **product's template**, or from a -:doc:`pricelist `. - -.. image:: cart/cart-contactus.png - :align: center - :alt: Contact us button on product page - -.. note:: - The 'Contact Us' button and '*Not Available For Sale*' text can both be modified using the - **website builder** on the product's page (:menuselection:`Edit --> Customize`) by clicking on - them. - -Customizable 'Add to Cart' button -================================= - -You can also create a customizable 'Add to Cart' button and link it to a specific product. The -**customized button** can be added on any page of the website as an **inner content** building -block, and is an *additional* button to the regular :guilabel:`Add to Cart` button. - -To add it, go on the :guilabel:`Shop` page of your choice, click :menuselection:`Edit --> Blocks` -and place the building block. Once placed, you have the following options: - -- :guilabel:`Product`: select the product to link the button with. Selecting a product renders the - :guilabel:`Action` field available; -- :guilabel:`Action`: choose if the button should :guilabel:`Add to Cart` or :guilabel:`Buy Now` - (instant checkout). - -.. image:: cart/cart-add.png - :align: center - :alt: Customizable 'Add to Cart' button - -.. _ecommerce/cart/buy-now: - -'Buy Now' button -================ - -You can enable the :guilabel:`Buy Now` button to take customers directly to the :ref:`review order -` step instead of adding the product to the -cart. This button is an *additional* option and does not replace the :guilabel:`Add to Cart` button. -To do so, go to :menuselection:`Website --> Configuration --> Settings`, scroll to the -:guilabel:`Shop—Checkout Process` section, enable :guilabel:`Buy Now`, and :guilabel:`Save`. - -.. tip:: - Alternatively, you can enable the :guilabel:`Buy Now` button directly from a product page by - clicking :guilabel:`Edit` and navigating to the :guilabel:`Customize` tab. - -.. image:: cart/cart-buy-now.png - :alt: Buy Now button - -Re-order from portal -==================== - -Customers have the possibility to **re-order** items from **previous sales orders** on the customer -portal. To do so, go to :menuselection:`Website --> Configuration --> Settings --> Shop - Checkout -Process` and enable :guilabel:`Re-order From Portal`. Customers can find the :guilabel:`Order Again` -button on their **sales order** from the **customer portal**. - -.. image:: cart/cart-reorder.png - :align: center - :alt: Re-order button diff --git a/content/applications/websites/ecommerce/cart/cart-add.png b/content/applications/websites/ecommerce/cart/cart-add.png deleted file mode 100644 index 9e548df87f..0000000000 Binary files a/content/applications/websites/ecommerce/cart/cart-add.png and /dev/null differ diff --git a/content/applications/websites/ecommerce/cart/cart-contactus.png b/content/applications/websites/ecommerce/cart/cart-contactus.png deleted file mode 100644 index 024e3418fa..0000000000 Binary files a/content/applications/websites/ecommerce/cart/cart-contactus.png and /dev/null differ diff --git a/content/applications/websites/ecommerce/cart/cart-reorder.png b/content/applications/websites/ecommerce/cart/cart-reorder.png deleted file mode 100644 index 813fc3f6ed..0000000000 Binary files a/content/applications/websites/ecommerce/cart/cart-reorder.png and /dev/null differ diff --git a/content/applications/websites/ecommerce/checkout.rst b/content/applications/websites/ecommerce/checkout.rst index 9921e39615..fbbcb7fca4 100644 --- a/content/applications/websites/ecommerce/checkout.rst +++ b/content/applications/websites/ecommerce/checkout.rst @@ -1,12 +1,130 @@ -======== -Checkout -======== +===================== +Ordering and checkout +===================== -Once customers have added their desired products to the cart, they can access it by clicking the -:icon:`fa-shopping-cart` button in the header to start the checkout process. In Odoo eCommerce, this -process consists of sequential :ref:`steps `, some of which support -additional features. The related checkout pages can be :ref:`customized -` using the website editor. +Odoo eCommerce provides several options to organize the ordering and checkout process. It offers +different :ref:`order button ` options and sequential +:ref:`checkout steps `, some of which support additional features. The +related buttons and checkout pages can be customized using the website editor. + +.. _ecommerce/checkout/order-buttons: + +Order buttons +============= + +To customize the ordering process in Odoo eCommerce, you can: + +- change the :ref:`Add to Cart ` button's behavior, +- replace it with a :ref:`customized ` button, +- add a :ref:`Buy now ` button, and +- add an :ref:`Order again ` button to the customer portal. + +.. _ecommerce/checkout/add-to-cart: + +Add to cart options +------------------- + +Default add to cart behavior +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When clicking the :guilabel:`Add to cart` button, different actions can be triggered. To configure +them, go to :menuselection:`Website --> Configuration --> Settings`, scroll down to the +:guilabel:`Shop - Checkout Process` section, and select one of the following options: + +- :guilabel:`Stay on Product Page`: The customer remains on the product's page. +- :guilabel:`Go to cart`: The customer is immediately redirected to the cart. +- :guilabel:`Let the user decide (dialog)`: The customer can choose if they want to go to the cart + (:guilabel:`Proceed to Checkout`) or if they prefer to stay on the product page + (:guilabel:`Continue Shopping`). + +.. note:: + This dialog box always appears regardless of the configuration to suggest :doc:`optional products + `, if any. + +.. _ecommerce/checkout/prevent-sale: + +Button customization +~~~~~~~~~~~~~~~~~~~~ + +You can replace the :guilabel:`Add to Cart` button with a :guilabel:`Contact Us` button, which +redirects users to the default contact form. + +.. note:: + Removing the ability to add products to the cart is often used by businesses that want to display + an online catalog but cannot share prices publicly (e.g., to offer custom or variable pricing). + +To do so, go to :menuselection:`Website --> Configuration --> Settings`. Under the :guilabel:`Shop - +Products` section, tick :guilabel:`Prevent Sale of Zero Priced Product`. A new :guilabel:`Button +url` field appears to enter a redirect URL. + +Then, for all products that should display the :guilabel:`Contact Us` button, set their price to +`0` using the product form or a :doc:`pricelist <../../sales/sales/products_prices/prices/pricing>`. + +.. image:: checkout/cart-contact-us.png + :alt: Contact us button on product page + +.. note:: + The :guilabel:`Contact Us` button label, URL, and the *Not Available For Sale* text beneath the + product title and description can be modified on the product's page while in :guilabel:`Edit` + mode. + +Additional add to cart buttons +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can add additional :guilabel:`Add to Cart` buttons and link them to specific products on any +website page. + +To add them, open the website editor and place the :guilabel:`Add to Cart Button` inner content +building block. Once placed, click the button, scroll to the :guilabel:`Add to Cart Button` +section, and configure the following: + +- :guilabel:`Product`: Select the product to link the button with. +- :guilabel:`Action`: Choose if it should be an :guilabel:`Add to Cart` or :ref:`Buy Now + ` button. + +.. note:: + - If the product has variants, either choose one or leave the option on :guilabel:`Visitor's + Choice`, which prompts the customer to select a variant and then to :guilabel:`Proceed to + Checkout` or :guilabel:`Continue Shopping`. + - The default :guilabel:`Add to Cart` button does not offer those options, but its label can be + changed. + +.. tip:: + While in :guilabel:`Edit` mode, it is also possible to show or hide the :icon:`fa-shopping-cart` + (:guilabel:`cart`) icon in the page's header. Click the header and then the + :icon:`fa-shopping-cart` (:guilabel:`cart`) button next to the :guilabel:`Show Empty` option + under the :guilabel:`Customize` tab. + +.. _ecommerce/checkout/buy-now: + +Buy now +------- + +To let customers choose to go to the :ref:`review order ` step +directly, you can add an additional :guilabel:`Buy now` button. To do so, go to +:menuselection:`Website --> Configuration --> Settings`. Under the :guilabel:`Shop - Checkout +Process` section, tick the :guilabel:`Buy Now` feature. + +.. tip:: + Alternatively, enable the feature by going to any product's page while in :guilabel:`Edit` mode + and, in the :guilabel:`Customize` tab, clicking the :icon:`fa-bolt` :guilabel:`Buy Now` button + next to the :guilabel:`Cart` options. + +.. image:: checkout/cart-buy-now.png + :alt: Buy now button + +.. _ecommerce/checkout/re-order: + +Re-order from portal +-------------------- + +You can let customers re-order items from previous sales orders from their customer portal using the +:guilabel:`Order Again` button. To add it, go to :menuselection:`Website --> Configuration --> +Settings`. Under the :guilabel:`Shop - Checkout Process` section, tick the :guilabel:`Re-order From +Portal` feature. + +.. image:: checkout/order-again-button.png + :alt: Re-order button .. _ecommerce/checkout/policy: @@ -14,29 +132,29 @@ Checkout policy =============== To allow customers to checkout as guests or force them to sign in/create an account, go to -:menuselection:`Website --> Configuration --> Settings`, scroll down to the -:guilabel:`Shop - Checkout Process` section, and configure the :guilabel:`Sign in/up at checkout` -setting. The following options are available: +:menuselection:`Website --> Configuration --> Settings`, scroll down to the :guilabel:`Shop - +Checkout Process` section, and configure the :guilabel:`Sign in/up at checkout` setting. The +following options are available: - :guilabel:`Optional`: Customers can check out as guests and register later via the order confirmation email to track their order. - :guilabel:`Disabled (buy as guest)`: Customers can checkout as guests without creating an account. -- :guilabel:`Mandatory (no guest checkout)`: Customers must sign in or create an account at - the :ref:`Review Order ` step to complete their purchase. +- :guilabel:`Mandatory (no guest checkout)`: Customers must sign in or create an account at the + :ref:`Review Order ` step to complete their purchase. B2B access management --------------------- -To restrict checkout to selected B2B customers, follow these steps: +To restrict checkout to selected B2B customers: -#. Go to :menuselection:`Website --> Configuration --> Settings`, and in the - :guilabel:`Shop - Checkout Process` section, enable the - :ref:`Mandatory (no guest checkout) ` option. +#. Go to :menuselection:`Website --> Configuration --> Settings`, and in the :guilabel:`Shop - + Checkout Process` section, enable the :ref:`Mandatory (no guest checkout) + ` option. #. Scroll down to the :guilabel:`Privacy` section, go to :guilabel:`Customer Account`, and select :guilabel:`On invitation`. #. Go to :menuselection:`Website --> eCommerce --> Customers`, switch to the :guilabel:`List` view, - and select the customers you wish to grant access to your - :doc:`portal `. + and select the customers you wish to grant access to your :doc:`portal + <../../general/users/portal>`. #. Click the :icon:`fa-cog` :guilabel:`Actions` button, then :guilabel:`Grant portal access`. #. Review the selected customers in the :guilabel:`Portal Access Management` pop-up and click :guilabel:`Grant Access`. @@ -47,13 +165,13 @@ instructions on setting a password and activating their account. .. note:: - You can revoke access or re-invite a customer using the related buttons in the :guilabel:`Portal Access Management` pop-up. - - Users can only have one :doc:`portal access ` per email. + - Users can only have one :doc:`portal access <../../general/users/portal>` per email. - Settings are website-specific, so you could set up a B2C website that allows guest checkout and - B2B website with mandatory sign-in. + a B2B website with mandatory sign-in. .. seealso:: - - :doc:`Customer accounts ` - - :doc:`Portal access ` + - :doc:`Customer accounts documentation ` + - :doc:`Portal access documentation <../../general/users/portal>` .. _ecommerce/checkout/steps: @@ -70,9 +188,9 @@ During the checkout process, customers are taken through the following steps: .. _ecommerce/checkout/customize_steps: -Each step can be customized using the website editor: Click :guilabel:`Edit` to add -:doc:`building blocks <../website/web_design/building_blocks>` from the :guilabel:`Blocks` tab or -open to the :guilabel:`Customize` tab to enable various checkout options. +Each step can be customized using the website editor by adding :doc:`building blocks +<../website/web_design/building_blocks>` or opening the :guilabel:`Customize` tab to enable various +checkout options. .. note:: Content added through building blocks is **specific** to each step. @@ -93,16 +211,15 @@ as: - :guilabel:`Suggested Accessories`: to showcase :ref:`accessory products `; - :guilabel:`Promo Code`: to allow customers to redeem :ref:`gift cards ` - or apply :doc:`discount codes `; -- :guilabel:`Add to Wishlist`: To allow signed-in users to remove a product from their cart and add - it to their wishlist, go to :menuselection:`Website --> Configuration --> Settings`, scroll to - the :guilabel:`Shop - Products` section, and enable :guilabel:`Wishlists`. The :guilabel:`Add to - Wishlist` option is then enabled by default in the website editor. + or apply :doc:`discount codes <../../sales/sales/products_prices/loyalty_discount>`; +- :guilabel:`Add to Wishlist`: :ref:`Enable wishlists ` to allow + signed-in users to remove a product from their cart and add it to their wishlist using the + :guilabel:`Save for later` option. .. note:: - - If a :doc:`fiscal position ` is detected automatically, - the product tax is determined based on the customer's IP address. - - If the installed :doc:`payment provider ` supports + - If a :doc:`fiscal position <../../finance/accounting/taxes/fiscal_positions>` is detected + automatically, the product tax is determined based on the customer's IP address. + - If the installed :doc:`payment provider <../../finance/payment_providers>` supports :ref:`express checkout `, a dedicated button is displayed, allowing customers to go straight from the cart to the confirmation page without filling out the contact form. @@ -114,8 +231,8 @@ Delivery Once they have reviewed their order: -- Unsigned-in customers are prompted to :guilabel:`Sign in` or enter their - :guilabel:`Email address`, along with their delivery address and phone details; +- Unsigned-in customers are prompted to :guilabel:`Sign in` or enter their :guilabel:`Email + address`, along with their delivery address and phone details; - Signed-in customers can select the appropriate :guilabel:`Delivery address`. They can then :doc:`choose a delivery method `, select or enter their :guilabel:`Billing @@ -123,42 +240,45 @@ Address` (or toggle the :guilabel:`Same as delivery address` switch if the billi addresses are identical), and click :guilabel:`Confirm` to proceed to the next step. .. tip:: - For B2B customers, you can also :ref:`enable ` optional - :guilabel:`VAT` and :guilabel:`Company name` fields by toggling the :guilabel:`Show B2B Fields` - option in the website editor. + - For B2B customers, you can also :ref:`enable ` optional + :guilabel:`VAT` and :guilabel:`Company name` fields by toggling the :guilabel:`Show B2B Fields` + option in the website editor. + - You can add a checkbox for users without an account to sign up for a newsletter. To do so, go + to :menuselection:`Website --> Configuration --> Settings`. Under the :guilabel:`Shop - + Checkout Process` section, enable the :guilabel:`Newsletter` feature and select a + :guilabel:`Newsletter List`. .. _ecommerce/checkout/extra_step: Extra info ---------- -You can add an :guilabel:`Extra Info` step in the checkout process to collect additional -customer information through an online form, which is then included in the :ref:`sales order -`. To do so :ref:`enable ` the :guilabel:`Extra -Step` option in the website editor. The form can be :ref:`customized ` +You can add an :guilabel:`Extra Info` step in the checkout process to collect additional customer +information through an online form, which is then included in the :ref:`sales order +`. To do so, :ref:`enable ` the :guilabel:`Extra +Step` option in the website editor. The form can be :ref:`customized ` as needed. .. tip:: Alternatively, go to :menuselection:`Website --> Configuration --> Settings`, scroll to the :guilabel:`Shop - Checkout Process` section, enable :guilabel:`Extra Step During Checkout`, and - click :guilabel:`Save`. Click :icon:`fa-arrow-right` :guilabel:`Configure Form` to customize the - form. + click :guilabel:`Save`. Click :icon:`fa-arrow-right` :guilabel:`Configure Form` to customize it. .. _ecommerce/checkout/payment: Payment ------- -At the :guilabel:`Payment` step, customers :guilabel:`Choose a payment method`, enter their -payment details, and click :guilabel:`Pay now`. +At the :guilabel:`Payment` step, customers :guilabel:`Choose a payment method`, enter their payment +details, and click :guilabel:`Pay now`. You can require customers to agree to your :doc:`terms and conditions -` before payment. To -:ref:`enable ` this option, go to the website editor and toggle -the :guilabel:`Accept Terms & Conditions` feature. +<../../finance/accounting/customer_invoices/terms_conditions>` before payment. To :ref:`enable +` this option, go to the website editor and toggle the +:guilabel:`Accept Terms & Conditions` feature. .. tip:: - Enable the :ref:`developer mode ` and click the :icon:`fa-bug` :guilabel:`bug` + Enable the :ref:`developer mode ` and click the :icon:`fa-bug` (:guilabel:`bug`) icon to display an :ref:`availability ` report for payment providers and payment methods, which helps diagnose potential availability issues on the payment form. @@ -172,4 +292,4 @@ The final step of the checkout process is the :guilabel:`Order confirmation`, wh summary of the customer's purchase details. .. seealso:: - :doc:`Order handling ` + :doc:`Order handling documentation ` diff --git a/content/applications/websites/ecommerce/cart/cart-buy-now.png b/content/applications/websites/ecommerce/checkout/cart-buy-now.png similarity index 100% rename from content/applications/websites/ecommerce/cart/cart-buy-now.png rename to content/applications/websites/ecommerce/checkout/cart-buy-now.png diff --git a/content/applications/websites/ecommerce/checkout/cart-contact-us.png b/content/applications/websites/ecommerce/checkout/cart-contact-us.png new file mode 100644 index 0000000000..6b423a1f31 Binary files /dev/null and b/content/applications/websites/ecommerce/checkout/cart-contact-us.png differ diff --git a/content/applications/websites/ecommerce/checkout/order-again-button.png b/content/applications/websites/ecommerce/checkout/order-again-button.png new file mode 100644 index 0000000000..1ea0188b6d Binary files /dev/null and b/content/applications/websites/ecommerce/checkout/order-again-button.png differ diff --git a/content/applications/websites/ecommerce/google_merchant_center.rst b/content/applications/websites/ecommerce/google_merchant_center.rst new file mode 100644 index 0000000000..d7ba6827ea --- /dev/null +++ b/content/applications/websites/ecommerce/google_merchant_center.rst @@ -0,0 +1,116 @@ +====================== +Google Merchant Center +====================== + +Google Merchant Center is a tool that allows ecommerce retailers to manage and submit product +data to Google. It serves as a central hub to upload and maintain product details, such as images, +prices, and descriptions so that products can appear across Google's platforms. + +.. note:: + Google Merchant Center is only available for physical products and does not support services. + +.. tip:: + We recommend using the tool alongside other Google services, such as :doc:`Google Search Console + <../website/configuration/google_search_console>`, :ref:`Google Analytics + ` or :ref:`Google Tag Manager ` + to obtain detailed reports on product listing issues, improve marketing strategies, increase + your products' online visibility, and enhance the overall sales performance. + +Google Merchant Center setup +============================ + +To connect your ecommerce with the :abbr:`GMC (Google Merchant Center)` platform, proceed as +follows: + +#. Create or sign in to a Google account using the following link: + ``_. +#. Indicate that you sell products online, and enter :guilabel:`Your store's website`. +#. Click :guilabel:`Continue`, then click :guilabel:`Continue to Merchant Center`. +#. Enter your business details by adding the :guilabel:`Business name` and the + :guilabel:`Registered country`, then click the :guilabel:`Continue to Merchant Center` button + twice. +#. Add the relevant information and click :guilabel:`Continue`, or click :guilabel:`Do it later` + to skip this step for now. +#. Go to the :guilabel:`Business info` tab in the left menu, and click :guilabel:`Confirm online + store`. +#. `Verify your website's ownership `_ + in one of the following ways: + + - Via :ref:`HTML tag ` or :ref:`HTML file + ` + - Via :ref:`Google Tag Manager ` + - Via :ref:`Google Analytics ` + + .. tip:: + You can also verify your website's ownership from Google Merchant Center's dashboard by + navigating to :menuselection:`Settings --> Business Info` in the left menu. + +#. Return to :abbr:`GMC (Google Merchant Center)`, click :guilabel:`Verify your online store`, + and :guilabel:`Continue`. + +.. seealso:: + `Google Merchant Center Help `_ + +Linking Odoo to GMC +=================== + +.. important:: + To activate the :abbr:`GMC (Google Merchant Center)` integration in your Odoo database, at least + one :ref:`pricelist ` must be assigned to your website. + +#. Navigate to :menuselection:`Website --> Configuration --> Settings`, scroll to the + :guilabel:`SEO - Search Engine Optimization` section, and enable + :guilabel:`Google Merchant Center Data Source`. +#. Click the :guilabel:`Copy file link`, then :guilabel:`Save`. + + .. note:: + By enabling the :guilabel:`Google Merchant Center Data Source` option, your website will + generate a dynamic `/gmc.xml` feed containing essential product information and availability. + This feed can be :ref:`customized ` to include multiple + languages and pricelists, ensuring your products are displayed correctly for different regions + and audiences. + +#. Go to the :abbr:`GMC (Google Merchant Center)` dashboard, navigate to the + :menuselection:`Your business --> Products` tab in the left menu, and click :guilabel:`Add + products`. +#. Choose :guilabel:`Add products from a file` and paste the URL of the copied file. + + .. important:: + Make sure to select all the countries where you intend to sell your products. You are not + able to proceed without selecting at least one target country. If necessary, enter + a :guilabel:`feed label` as well. + + .. image:: google_merchant_center/gmc-select-countries.png + :alt: Select countries in GMC. + +#. Click :guilabel:`Continue`. + +.. _ecommerce/GMC/localized-feed: + +Localized feeds +=============== + +Languages/regions +----------------- + +It is helpful to create language-specific feeds for each country/language you sell in. To add a +new feed, go to :guilabel:`Products` on the :abbr:`GMC` dashboard, click :guilabel:`Add products`, +and select :guilabel:`Add another product source` from the dropdown menu. + +.. note:: + The selected :doc:`language ` must first be enabled in + your website's settings. + +Currencies +---------- + +It is also possible to create different feeds for different currencies, which allows customers +to view prices in their local currency. To enable this feature, create a :ref:`pricelist +` with the foreign currency in Odoo. Then, go to the :guilabel:`Products` tab +in :abbr:`GMC`, click :guilabel:`Manage +product sources`, and choose a :guilabel:`Products source`. Navigate to the +:guilabel:`Data source setup` tab, click :guilabel:`Show advanced options`, and choose a +:guilabel:`Currency`. + +.. seealso:: + `Google Merchant Center Product Feed Specifications `_. diff --git a/content/applications/websites/ecommerce/google_merchant_center/gmc-select-countries.png b/content/applications/websites/ecommerce/google_merchant_center/gmc-select-countries.png new file mode 100644 index 0000000000..fec3137aa5 Binary files /dev/null and b/content/applications/websites/ecommerce/google_merchant_center/gmc-select-countries.png differ diff --git a/content/applications/websites/ecommerce/products.rst b/content/applications/websites/ecommerce/products.rst index c419e09710..1ad9492c08 100644 --- a/content/applications/websites/ecommerce/products.rst +++ b/content/applications/websites/ecommerce/products.rst @@ -7,10 +7,10 @@ Products **Odoo eCommerce** allows you to :ref:`add products ` and manage your :ref:`product pages ` directly from the Website app. It also allows you to add :ref:`product variants ` and -:ref:`digital files `, -:ref:`translating ` the product page content, -:ref:`managing stock `, and enabling -:ref:`product comparisons `. +:ref:`digital files `, :ref:`translating +` the product page content, :ref:`managing stock +`, and enabling :ref:`product comparisons +`. .. _ecommerce/products/add-products: @@ -31,7 +31,7 @@ page. When you :guilabel:`Save`, the product page is automatically published. .. tip:: - You can also create a product from the backend by going to :menuselection:`Website --> eCommerce --> Products` and clicking :guilabel:`New`. - - Products created from the frontend are automatically :ref:`published `, + - Products created from the frontend are automatically :ref:`published `, while products created from the backend are not. To publish a product, click the :guilabel:`Go to Website` smart button to access the product page, then toggle the switch from :guilabel:`Unpublished` to :guilabel:`Published`. @@ -62,113 +62,44 @@ go to :menuselection:`Website --> eCommerce --> Products`, click the :icon:`fa-c #. In the :guilabel:`Is Published` column, tick the box for any of the selected products, then :guilabel:`Confirm` to publish them. -.. _ecommerce/products/shop-page: - -Shop page -========= - -To customize the layout of the main :guilabel:`Shop` page or modify its content, click -:guilabel:`Edit`. Go to the :guilabel:`Blocks` tab to add -:doc:`building blocks <../../websites/website/web_design/building_blocks>` or to the -:guilabel:`Customize` tab to change the page layout or add features: - -- :guilabel:`Layout`: Select :guilabel:`Grid` or :guilabel:`List`. - - - :guilabel:`Size`: Set the number of products displayed per page and line. - - :guilabel:`Style`: Select :guilabel:`Default`, :guilabel:`Cards`, :guilabel:`Thumbnails`, or - :guilabel:`Grid`. - - :guilabel:`Image Size`: Choose the aspect ratio for the product images: - :guilabel:`Landscape (4/3)`, :guilabel:`Default (1/1)`, :guilabel:`Portrait (4/5)`, or - :guilabel:`Vertical (2/3)`. You can also adjust the display by changing the :guilabel:`Fill` - options to best fit your design preferences. - -- :guilabel:`Search Bar`: Toggle the switch to display a search bar at the top of the products - page. - -- :guilabel:`Prod. Desc.`: Toggle the switch to display the product description below the product's - name. - -- :guilabel:`Categories`: display product categories on the :guilabel:`Left`, on the - :guilabel:`Top`, or both. If :guilabel:`Left` is selected, you can enable - :guilabel:`Collapse Categories` to make the category menu collapsible. - -- :guilabel:`Datepicker`: Toggle the switch to display a date range calendar to check the - availability of rental products over a specific period. The - :doc:`Rental app <../../sales/rental>` must be installed to use this feature. - -- :guilabel:`Attributes`: Show product attributes on the :guilabel:`Left` and/or display a - :icon:`fa-sliders` (:guilabel:`dropdown toggle`) icon at the :guilabel:`Top` allowing customers to - filter products based on their attributes. - - - :guilabel:`Price Filter`: Toggle the switch to display a :guilabel:`Price Range` bar, which - allows customers to filter products according to a specific price range by dragging adjustable - handles. - - :guilabel:`Product Tags`: Toggle the switch to display the :guilabel:`Product Template Tags` on - the product page and allow customers to filter products using those tags by going to the - :guilabel:`Tags` section in the left column. - -- :guilabel:`Top Bar`: Select :guilabel:`Sort By` to display a dropdown list in the top bar for - sorting products and/or :guilabel:`Layout` to allow customers to switch to the grid or list view - using the related icons. - -- :guilabel:`Default Sort`: Choose how products are sorted by default: :guilabel:`Featured`, - :guilabel:`Newest Arrivals`, :guilabel:`Name (A-Z)`, :guilabel:`Price - Low to High`, or - :guilabel:`Price - High to Low`. - -- :guilabel:`Buttons`: - - - Select the :icon:`fa-shopping-cart` (:guilabel:`Shopping cart`) option to display an - :icon:`fa-shopping-cart` (:guilabel:`Add to cart`) icon on each product's image, which takes the - customer to the checkout page. - -.. _ecommerce/products/wishlist: - - - Select the :icon:`fa-heart-o` (:guilabel:`Wishlist`) option to display an - :icon:`fa-shopping-cart` (:guilabel:`Add to wishlist`) icon on each product's image allowing - logged-in customers to save products to a wishlist. - - - Select the :icon:`fa-exchange` (:guilabel:`Compare`) option to display the :icon:`fa-exchange` - (:guilabel:`Compare`) icon on each product's image allowing customers to :ref:`compare products - ` based on their attributes. - -.. tip:: - To feature a product, go to the :ref:`product form ` and click - the :icon:`fa-star-o` (:guilabel:`Favorite`) icon next to the product's name. - .. _ecommerce/products/product-page: -Product page -============ +Product page customization +========================== -To access a product's page, go to the :guilabel:`Shop` and click on the product. Click -:guilabel:`Edit` to :ref:`customize ` the page or -:ref:`edit its images `. +.. _ecommerce/products/customization: +Product information +------------------- .. _ecommerce/products/product-form: -To access the backend **product form**, click the :icon:`fa-cog` :guilabel:`Product` button in the -top-right corner of the product page. Alternatively, navigate to :menuselection:`Website --> +To add general information about a product, navigate to :menuselection:`Website --> eCommerce --> Products` and select the product. You can configure the product page from the form by adding :ref:`variants `, :ref:`digital documents `, or :ref:`translating ` content. +You can also add an ecommerce-specific product description to be displayed below +the product name on the product's page. To do so, go to the :guilabel:`Sales` +tab, scroll down to the :guilabel:`Ecommerce description` section, and add a description. Use Odoo's +:doc:`rich-text editor <../../essentials/html_editor>` features to personalize the content. + .. tip:: Click the :guilabel:`Go to Website` smart button to return to the frontend product's page. -.. _ecommerce/products/customization: - -Customization -------------- +Product presentation +-------------------- -To customize a product page, click :guilabel:`Edit`. Go to the :guilabel:`Blocks` tab to add +To customize the product presentation on the website, go to the :guilabel:`Shop` and click on the +product. Click :guilabel:`Edit` to :ref:`customize ` the page, +:ref:`edit its images ` or add :doc:`building blocks <../../websites/website/web_design/building_blocks>`. .. tip:: - - When dragging and dropping a building block on the product page, placing it above or below the - top or bottom blue lines makes it visible on all product pages. - - You can edit any text on your website simply by clicking on it while in :guilabel:`Edit` mode. + - When dragging and dropping a building block on the product page, placing it above or below + the top or bottom blue lines makes it visible on all product pages. + - You can edit any text on your website by clicking on it while in :guilabel:`Edit` mode. -Go to the :guilabel:`Customize` tab to modify the page layout or add features: +Use the :guilabel:`Customize` tab to modify the page layout or add features: - :guilabel:`Terms and Conditions`: Toggle the switch to display a link to your :doc:`terms and conditions <../../finance/accounting/customer_invoices/terms_conditions>` on the @@ -188,12 +119,12 @@ Go to the :guilabel:`Customize` tab to modify the page layout or add features: - :guilabel:`Select Quantity`: Toggle the switch to allow customers to select the product quantity they want to purchase. -- :guilabel:`Tax indication`: Toggle the switch to indicate if the price is +- :guilabel:`Tax Indication`: Toggle the switch to indicate if the price is :ref:`VAT included or excluded `. -- :guilabel:`Variants`: Show all possible product :ref:`variants ` - vertically as a :guilabel:`Products List` or horizontally as selectable :guilabel:`Options` to - compose the variant yourself. +- :guilabel:`Variants`: Show all possible product :ref:`variants + ` vertically as a :guilabel:`Products List` + or horizontally as selectable :guilabel:`Options` to compose the variant yourself. - :guilabel:`Product Tags`: Toggle the switch to display the :guilabel:`Product Template Tags` on the product page and allow customers to filter products using those tags. @@ -224,10 +155,18 @@ Go to the :guilabel:`Customize` tab to modify the page layout or add features: .. _ecommerce/products/image-customization: -Image customization -------------------- +Product images and videos +------------------------- + +To add more media items, such as images and videos, navigate to the +:ref:`product form `, then go to the :guilabel:`Sales` tab +and click :guilabel:`Add Media` under the :guilabel:`Ecommerce Media` section. In the +:guilabel:`Select a media` pop-up window, go to the :guilabel:`Images` tab, select an image, +click :guilabel:`Upload an image` or :guilabel:`Add URL`. Or navigate to the :guilabel:`Videos` tab, +paste a video URL or embed code. Once done, click :guilabel:`Add`. -To customize the images available on the product page, go to the :guilabel:`Customize` tab: +To customize the images or videos, go to the ecommerce product page, click :guilabel:`Edit` +and select the relevant media. In the :guilabel:`Customize` tab, use the following features: - :guilabel:`Images Width`: Changes the width of the product images displayed on the page. - :guilabel:`Layout`: The :guilabel:`Carousel` layout allows customers to navigate from one image to @@ -235,15 +174,37 @@ To customize the images available on the product page, go to the :guilabel:`Cust (:guilabel:`right arrow`); whereas the :guilabel:`Grid` displays four images in a square layout. - :guilabel:`Image Zoom`: Select the zoom effect for product images: :guilabel:`Magnifier on hover` :guilabel:`Pop-up on Click`, :guilabel:`Both`, or :guilabel:`None`. -- :guilabel:`Thumbnails`: Align thumbnails on the :icon:`fa-long-arrow-left` (:guilabel:`Left`) or - at the :icon:`fa-long-arrow-down` (:guilabel:`Bottom`). +- :guilabel:`Thumbnails`: Align thumbnails on the :icon:`fa-long-arrow-left` (:guilabel:`Left`) + or at + the :icon:`fa-long-arrow-down` (:guilabel:`Bottom`). - :guilabel:`Main Image`: Click :guilabel:`Replace` to change the product's main image. -- :guilabel:`Extra Images`: :guilabel:`Add` extra images or videos (including via URL) or - :guilabel:`Remove all` product images. +- :guilabel:`Extra Images`: :guilabel:`Add` more extra images or videos (including via URL) or + :guilabel:`Remove all`. .. note:: Images must be in PNG or JPG format and with a minimum size of 1024x1024 to trigger the zoom. +.. _ecommerce/products/products-block: + +Products block +============== + +The :guilabel:`Products` :doc:`building block <../website/web_design/building_blocks>` is used to +display a selection of products sold on your website. + +.. image:: products/products-block.png + :alt: Example of a products block + +By default, the block displays the :guilabel:`Newest Products`. To change which products are shown, +go to the :guilabel:`Customize` tab's :guilabel:`Products` section and set the :guilabel:`Filter` +field to :guilabel:`Recently Sold Products` or :guilabel:`Recently Viewed Products`. + +In addition, it is possible to display products from a specific category only using the +:guilabel:`Category` field. + +You can also filter products by :guilabel:`Tags`, include :guilabel:`Variants`, and adjust the +display by selecting a different :guilabel:`Template`. + .. _ecommerce/products/product-variants: Product variants @@ -259,8 +220,8 @@ To configure product variants for a product: #. Scroll down to the :guilabel:`Shop - Products` section and enable the :guilabel:`Product Variants` feature. #. Access the :ref:`product forms ` and go to the - :guilabel:`Attributes & Variants` tab, where you can add attributes and values, allowing customers - to configure and select product variants on the product page. For multiple attributes, + :guilabel:`Attributes & Variants` tab, where you can add attributes and values, allowing + customers to configure and select product variants on the product page. For multiple attributes, you can combine them to create specific variants. To display or hide an attribute on the :guilabel:`Shop` page and allow visitors to filter them, @@ -268,7 +229,7 @@ go to :menuselection:`Website --> eCommerce --> Attributes`, click on the attrib :guilabel:`Visible` or :guilabel:`Hidden` in the :guilabel:`eCommerce Filter Visibility` field. .. tip:: - - To display the product attributes on :ref:`the main Shop page `, + - To display the product attributes in the :doc:`product catalog `, set the :guilabel:`Attributes` feature to :guilabel:`Left` using the website editor. - To group attributes under the same section when :ref:`comparing products `, go to the @@ -288,7 +249,8 @@ Digital files You can link digital files like certificates, eBooks, or user manuals to the products. These documents are available :ref:`before payment ` on -the product page or in the customer portal :ref:`after checkout `. +the product page or in the customer portal +:ref:`after checkout `. To link a digital file to a product, go to the :ref:`product form ` and click the :guilabel:`Documents` smart button. Then, click :guilabel:`Upload` to upload a file @@ -336,7 +298,7 @@ The eCommerce-related fields to translate are: .. note:: - Having untranslated content on a web page may be detrimental to the user experience and - :doc:`SEO <../../websites/website/pages/seo>`. You can use the + :doc:`SEO <../../websites/website/structure/seo>`. You can use the :doc:`Translate <../website/configuration/translate>` feature to translate the page's content. - To check the language(s) of your website, go to :menuselection:`Website --> Configuration --> Settings` and go to the :guilabel:`Website Info` section. @@ -405,6 +367,27 @@ comparison summary. - Selecting the :icon:`fa-exchange` (:guilabel:`Compare`) option from a product page is also possible. +.. _ecommerce/products/wishlists: + +Wishlists +========= + +The :icon:`fa-heart-o` :guilabel:`Add to wishlist` button allows customers to add products +to their wishlist, i.e., save them for later. To enable it, go to :menuselection:`Website --> +Configuration --> Settings`, scroll down to the :guilabel:`Shop - Products` section, and enable +:guilabel:`Wishlists`. The button is available on each product page and can be disabled in the +:ref:`website editor ` if needed. + +.. image:: products/products-add-to-wishlist.png + :alt: Add to wishlist button + +.. tip:: + - You can also display a :icon:`fa-heart-o` (:guilabel:`Wishlist`) button when hovering the mouse + over the product on the :ref:`shop page `. + - Customers can move products from their cart to their wishlist by clicking the :guilabel:`Save + for later` button in the :guilabel:`Order overview` :ref:`checkout step + `. + .. toctree:: :titlesonly: diff --git a/content/applications/websites/ecommerce/products/catalog.rst b/content/applications/websites/ecommerce/products/catalog.rst index 6bb1d048a0..211c6e8b45 100644 --- a/content/applications/websites/ecommerce/products/catalog.rst +++ b/content/applications/websites/ecommerce/products/catalog.rst @@ -2,204 +2,273 @@ Catalog ======= -The eCommerce catalog is the equivalent of your physical store shelves: it allows customers to see -what you have to offer. Clear categories, available options, sorting, and navigation threads help -you structure it efficiently. +The eCommerce catalog displays products for customers to browse. It is organized using product +categories, available options, sorting, and navigation paths. Essentially, the eCommerce catalog +is the shop page of your website. + +The product catalog includes a :ref:`top bar `, a :ref:`side panel +`, and a :ref:`product listing area +`. With Odoo, you can :ref:`customize the layout +`, filter by :ref:`categories and attributes +`, and use :ref:`additional features +` according to your needs. + +You can customize the shop page using the website editor. To access it, go to the shop page, +click :guilabel:`Edit` in the upper-right corner, and navigate to the :guilabel:`Customize` tab. + +.. _ecommerce/catalog/top-bar: + +Top bar +======= + +The top bar can include a search bar, a currency selector, +:ref:`sort-by and display options `, and +:ref:`category quick access `. + +.. _ecommerce/catalog/sort-by-and-display-option: + +Sort-by search and display options +---------------------------------- + +You can toggle the :guilabel:`Search Bar`, display :ref:`categories ` +and/or :ref:`attributes `, and enable or disable the +:guilabel:`Sort-By` as well as the :ref:`Layout ` buttons in +the :guilabel:`Top Bar`. + +The :guilabel:`Sort-by` button is toggled by default, and customers can choose between the +following :guilabel:`Default Sort` options: + +- :guilabel:`None` +- :guilabel:`Featured` +- :guilabel:`Newest Arrivals` +- :guilabel:`Name (A-Z)` +- :guilabel:`Price - Low to High` +- :guilabel:`Price - High to Low` + +The default sort applies to *all* :ref:`categories `. .. tip:: - Go to :menuselection:`Website --> Configuration --> Settings`, scroll down to the - :guilabel:`Privacy` section to restrict :guilabel:`Ecommerce Access` to logged-in users and/or - enable :guilabel:`Shared Customer Accounts` to allow access to all websites with a single - account. + If you don't want to display a top bar or :ref:`side panel `, + you can disable all related options in the website editor. -Categorize the product catalog -============================== +.. _ecommerce/catalog/side-panel: -In Odoo, there is a **specific category model** for your eCommerce. Using eCommerce categories for -your products allows you to add a navigation menu on your eCommerce page. Visitors can then use it -to view all products under the category they select. +Side panel +========== -To do so, go to :menuselection:`Website --> eCommerce --> Products`, select the product you wish to -modify, click on the :guilabel:`Sales` tab, and select the :guilabel:`Categories` you want under -:guilabel:`eCommerce Shop`. +The side panel provides advanced filtering tools to organize your product categories. +To further :ref:`categorize ` the shop page, you can activate +various filters, such as the :ref:`attribute ` filter. -.. image:: catalog/catalog-categories.png - :align: center - :alt: eCommerce categories under the "Sales" tab +You can also add a :guilabel:`Datepicker` option to display a date range calendar to check +the availability of rental products over a specific period. The :doc:`Rental app +<../../../sales/rental>` must be installed to use this feature. + +It is also possible to toggle the :guilabel:`Collapsible sidebar` switch to make the side panel +manually collapsible. + +.. tip:: + To use a price range or tags filter, you have to enable :ref:`attributes + ` first. + +.. _ecommerce/catalog/categories: + +Product categorization in catalog +================================= + +eCommerce categories are used to organize products into groups, making it easier for customers +to browse the online store. + +To create eCommerce categories, go to :menuselection:`Website --> eCommerce --> +eCommerce Categories`, and click :guilabel:`New`. On the category form, add a +:guilabel:`Name`, optionally enter a :guilabel:`Parent Category`, and write a :guilabel:`Category +Description`, if needed. + +To use eCommerce categories, go to :menuselection:`Website --> eCommerce --> Products`, select +the product you wish to modify, go to the :guilabel:`Sales` tab, navigate to the +:guilabel:`Ecommerce shop` section, and select the :guilabel:`Categories` it belongs to. .. note:: - A single product can appear under multiple eCommerce categories. + A single product can belong to multiple eCommerce categories. -When your product's categories are configured, go to your **main shop page** and click on -:menuselection:`Edit --> Customize tab`. In the :guilabel:`Categories` option, you can either enable -a menu on the :guilabel:`Left`, on the :guilabel:`Top`, or both. If you select the :guilabel:`Left` -category, the option :guilabel:`Collapsable Category Recursive` appears and allows to render the -:guilabel:`Left` category menu collapsable. +Once the categories are configured and assigned to the relevant products, go to the main shop page +and open the website editor. In the :guilabel:`Categories` option, you can either enable +a menu on the :guilabel:`Left`, i.e., in the :ref:`side panel `, +or on the :guilabel:`Top`, i.e., in the :ref:`top bar `, or both. +If you select the :guilabel:`Left` category, the option :guilabel:`Collapsible Category Recursive` +appears, allowing you to collapse the category in the side panel. .. image:: catalog/catalog-panel-categories.png - :align: center :alt: Categories options for your eCommerce website .. seealso:: :doc:`../products` -.. _ecommerce-browsing: - -Browsing --------- - -The eCommerce category is the first tool to organize and split your products. However, if you need -an extra level of categorization in your catalog, you can activate various **filters** such as -attributes or sort-by search. +.. _ecommerce/catalog/attributes: Attributes -~~~~~~~~~~ +---------- -Attributes refer to **characteristics** of a product, such as **color** or **material**, whereas -variants are the different combinations of attributes. :guilabel:`Attributes and Variants` can be -found under :menuselection:`Website --> eCommerce --> Products`, select your product, and -:guilabel:`Attributes & Variants` tab. +Attributes refer to characteristics of a product, such as the color or material, whereas +variants are the different combinations of attributes. To configure attributes and variants, go to +:menuselection:`Website --> eCommerce --> Products`, select a product, and click the +:guilabel:`Attributes & Variants` tab. Add as many attributes as desired. .. seealso:: - - :doc:`../../../sales/sales/products_prices/products/variants` + :doc:`../../../sales/sales/products_prices/products/variants` .. image:: catalog/catalog-attributes.png - :align: center :alt: Attributes and variants of your product -To enable **attribute filtering**, go to your **main shop page**, click on :menuselection:`Edit --> -Customize tab` and select either :guilabel:`Left`, :guilabel:`Top`, or both. Additionally, you can -also enable :guilabel:`Price Filtering` to enable price filters. - -.. note:: - :guilabel:`Price Filter` works independently from **attributes** and, therefore, can be enabled - on its own if desired. +To enable attribute filtering, go to your main shop page, then open the website editor, and set +the :guilabel:`Attributes` field to :guilabel:`Left` (:ref:`side panel +`) and/or :guilabel:`Top` (:ref:`top bar +`). .. tip:: - You can use **attribute filters** even if you do not work with product variants. When adding - attributes to your products, make sure only to specify *one* value per attribute. Odoo does not - create variants if no combination is possible. + When attribute filtering is enabled in the top bar, customers must click the :icon:`fa-sliders` + (:guilabel:`dropdown toggle`) button to access it. -Sort-by search -~~~~~~~~~~~~~~ +When enabling :guilabel:`Attributes`, more options become available: -It is possible to allow the user to manually **sort the catalog** using the search bar. From -your **main shop page**, click on :menuselection:`Edit --> Customize tab`; you can enable or disable -the :guilabel:`Sort-By` option as well as the :guilabel:`Layout` button. You can also select the -:guilabel:`Default Sort` of the :guilabel:`Sort-By` button. The default sort applies to *all* -categories. + - :guilabel:`Price Filter`: Toggle the switch to display a :guilabel:`Price Range` bar, which + allows customers to filter products according to a specific price range by dragging adjustable + handles. + - :guilabel:`Product Tags Filter`: Toggle the switch to display the :guilabel:`Product Tags` on + the shop page, and allow customers to filter products using those tags by going to the + :guilabel:`Tags` section in the :ref:`side panel `. -The **sorting** options are: +.. tip:: + - If you want to use tags on your e-commerce, go to :menuselection:`eCommerce --> Product Tags` + and click :guilabel:`New`. In the :guilabel:`Product Templates` tab of the product tags form, + add the products to link to the given tag. You can also add product variants in the + :guilabel:`Product Variants` tab and view a summary of all selected products in + the :guilabel:`All Products` tab. + - Price filtering works independently from attributes and, therefore, can be enabled on its own, + if desired. -- Featured -- Newest Arrivals -- Name (A-Z) -- Price - Low to High -- Price - High to Low +.. _ecommerce/catalog/product-listing: -In addition, you can **manually edit** the catalog's order of a product by going to **the main shop -page** and clicking on the product. Under the :guilabel:`Product` section of the -:guilabel:`Customize` section, you can rearrange the order by clicking on the arrows. `<<` `>>` move -the product to the **extreme** right or left, and `<` `>` move the product by **one** row to the -right or left. It is also possible to change the catalog's order of products in -:menuselection:`Website --> eCommerce --> Products` and drag-and-dropping the products within the -list. +Product listing area +==================== -.. image:: catalog/catalog-reorder.png - :align: center - :alt: Product rearrangement in the catalog +You can customize the layout of the entire shop page, as well as that of :ref:`individual category +pages `. -Page design -=========== +.. tip:: + It is also possible to customize individual :ref:`product pages `. -Category page -------------- +.. _ecommerce/catalog/layout: -You can customize the layout of the category page using the website builder. +In the website editor, choose the :ref:`layout `, and +set the default layout to either :guilabel:`Grid` or :guilabel:`List` view. -.. important:: - Editing the layout of the category page is global; editing one category layout affects *all* - category pages. +Use the following options to further adjust the layout: -To do so, go on to your :menuselection:`Category page --> Edit --> Customize`. Here, you can choose -the layout, the number of columns to display the products, etc. The :guilabel:`Product Description` -button makes the product description visible from the category page, underneath the product picture. + - :guilabel:`Size`: Set the number of products displayed per page and line. + - :guilabel:`Gap`: Define the gap between the products. + - :guilabel:`Style`: Select :guilabel:`Default`, :guilabel:`Cards`, :guilabel:`Thumbnails`, or + :guilabel:`Grid`. + - :guilabel:`Image Size`: Choose the aspect ratio for the product images: + :guilabel:`Landscape (4/3)`, :guilabel:`Default (1/1)`, :guilabel:`Portrait (4/5)`, or + :guilabel:`Vertical (2/3)`. You can also adjust the display by changing the :guilabel:`Fill` + options to fit your design preferences best. -.. image:: catalog/catalog-category-layout.png - :align: center - :alt: Layout options of the category pages. +Toggle the :guilabel:`Prod. Desc.` switch to display the product description below the product's +name. .. tip:: You can choose the size of the grid, but be aware that displaying too many products may affect performance and page loading speed. +In addition, you can manually change a product’s position on the shop page. To do so, go to the +main shop page, click the product, and open the website editor. In the :guilabel:`Product` section, +you can reorder the products by using the arrows. The `<<` `>>` buttons allow to move the product to +the extreme left or right, and `<` `>` allow to move it one row to the left or right. + +.. tip:: + It is also possible to change the products' positions on the shop page by going to + :menuselection:`Website --> eCommerce --> Products`, switching to the list view, and + dragging and dropping the products within the list. + Product highlight ----------------- -You can highlight products to make them more visible on the category or product page. On the page of -your choice, go to :menuselection:`Edit --> Customize` and click on the product to highlight. In the -:guilabel:`Product` section, you can choose the size of the product image by clicking on the grid, -and you can also add a **ribbon** or :guilabel:`Badge`. This displays a banner across the product's -image, such as: +You can highlight products to make them more visible on the shop page. To do so, go +to the website editor and click the product to highlight. In the :guilabel:`Product` section, you +can choose the size of the product image by clicking the grid, and you can also add a +:guilabel:`Ribbon`. This displays a banner across the product's image, such as :guilabel:`Sale`, +:guilabel:`Sold out`, :guilabel:`Out of stock` or :guilabel:`New!`. -- Sale; -- Sold out; -- Out of stock; -- New. +.. image:: catalog/catalog-product-highlighting.png + :alt: Ribbon highlight -Alternatively, you can activate the :doc:`developer mode <../../../general/developer_mode>` on the -**product's template**, and under the :guilabel:`Sales` tab, change or create the ribbon from the -:guilabel:`Ribbon` field. +To create a new ribbon, click the green :icon:`fa-plus` (:guilabel:`Create`) icon next to the +:guilabel:`Ribbon` field. Then add a :guilabel:`Ribbon name`, define its :guilabel:`Position`, +and choose a :guilabel:`Background` and a :guilabel:`Text` label. To edit the ribbon, click the +:icon:`fa-pencil-square-o` (:guilabel:`Edit`) icon next to the :guilabel:`Ribbon` label. -.. note:: - The :doc:`developer mode <../../../general/developer_mode>` is only intended for experienced - users who wish to have access to advanced tools. Using the **developer mode** is *not* - recommended for regular users. +.. image:: catalog/catalog-ribbons.png + :alt: Create a new ribbon. -.. image:: catalog/catalog-product-highlight.png - :align: center - :alt: Ribbon highlight - -Additional features -=================== +The ribbon is now available for all the eCommerce products. -You can access and enable additional feature buttons such as **add to cart**, **comparison list**, -or a **wishlist**. To do so, go to your **main shop page**, and at the end of the -:guilabel:`Products Page` category, click on the feature buttons you wish to use. All three buttons -appear when hovering the mouse over a product's image. +.. tip:: + - There are other ways to create a new ribbon: -- :guilabel:`Add to Cart`: adds a button to - :doc:`add the product to the cart <../cart>`; -- :guilabel:`Comparison List`: adds a button to **compare** products based on their price, variant, - etc.; -- :guilabel:`Wishlist Button`: adds a button to **wishlist** the product. + - Go to :menuselection:`Website --> eCommerce --> Product Ribbons` and click :guilabel:`New`. + - Activate the :doc:`developer mode <../../../general/developer_mode>`, access the product + form, and under the :guilabel:`Sales` tab, change or create the ribbon in the + :guilabel:`Ribbon` field. -.. image:: catalog/catalog-buttons.png - :align: center - :alt: Feature buttons for add to cart, comparison list, and wishlist + - It is also possible to add ribbons for specific :ref:`product variants + `. To do so, go to :menuselection:`Website --> + eCommerce --> Products` and select a product. Click the :guilabel:`Variants` smart button, + choose a variant, and add a ribbon in the :guilabel:`Variant Ribbon` field of the + :guilabel:`Sales` section. -.. image:: catalog/catalog-features.png - :align: center - :alt: Appearance of buttons when hoovering over the mouse +.. _ecommerce/catalog/customize-layout: -Add content -=========== +Shop and category page design +----------------------------- -You can use **building blocks** to add content on the category page, with a variety of blocks -ranging from :guilabel:`Structure` to :guilabel:`Dynamic Content`. Specific areas are defined to use -blocks are defined and highlighted on the page when **dragging-and-dropping** a block. +Use :doc:`building blocks <../../website/web_design/building_blocks>` to add content on the shop +and/or category page. -.. image:: catalog/catalog-content.png - :align: center - :alt: Building blocks areas +You can customize the top and/or bottom section of the catalog, either for the entire shop page or +for a specific category. In the latter case, the block appears *only* when filtering by that +category. To do so, move the block to the far top or bottom section to display it on the general +shop page or to the area below the category's name at the top or beneath the product list to +display it only when filtering by that specific category. -- If you drop a building block **on top** of the product list, it creates a new category header - specific to *that* category. -- If you drop a building **on the top** or **bottom** of the page, it becomes visible on *all* - category pages. + .. image:: catalog/catalog-header-footer.png + :alt: Place building block in the header or footer. .. tip:: - Adding content to an eCommerce category page is beneficial in terms of **SEO** strategy. Using - **keywords** linked to the products or the eCommerce categories improves organic traffic. - Additionally, each category has its own specific URL that can be pointed to and is indexed by - search engines. + - Adding content to an eCommerce category page helps improve the :doc:`SEO + <../../website/structure/seo>` strategy. Using keywords linked to the products or the + eCommerce categories can also increase organic traffic. Additionally, each category has its + own specific URL that can be pointed to and is indexed by search engines. + - eCommerce categories can also be added as :ref:`mega menu items + ` for quick access. + +.. _ecommerce/catalog/additional-features: + +Additional features +=================== + +You can access and enable additional feature buttons such as a :guilabel:`Add to cart` or +:guilabel:`Wishlist` button or a :guilabel:`Comparison list`. To do so, open the website editor, +click the desired feature buttons. All three buttons appear when hovering the mouse over +a product's image. + +- :icon:`fa-shopping-cart` (:guilabel:`Add to cart`): adds a button to + :doc:`add the product to the cart <../checkout>`; +- :icon:`fa-exchange` (:guilabel:`Compare`): adds a button to compare products based on + their price, variant, etc.; +- :icon:`fa-heart-o` (:guilabel:`Wishlist`): adds a button to :ref:`wishlist + ` the product. + + +.. seealso:: + :doc:`Products <../products>` diff --git a/content/applications/websites/ecommerce/products/catalog/catalog-header-footer.png b/content/applications/websites/ecommerce/products/catalog/catalog-header-footer.png new file mode 100644 index 0000000000..d8fcd44b62 Binary files /dev/null and b/content/applications/websites/ecommerce/products/catalog/catalog-header-footer.png differ diff --git a/content/applications/websites/ecommerce/products/catalog/catalog-product-highlighting.png b/content/applications/websites/ecommerce/products/catalog/catalog-product-highlighting.png new file mode 100644 index 0000000000..92aefe72f5 Binary files /dev/null and b/content/applications/websites/ecommerce/products/catalog/catalog-product-highlighting.png differ diff --git a/content/applications/websites/ecommerce/products/catalog/catalog-reorder.png b/content/applications/websites/ecommerce/products/catalog/catalog-reorder.png deleted file mode 100644 index 1350b1d756..0000000000 Binary files a/content/applications/websites/ecommerce/products/catalog/catalog-reorder.png and /dev/null differ diff --git a/content/applications/websites/ecommerce/products/catalog/catalog-ribbons.png b/content/applications/websites/ecommerce/products/catalog/catalog-ribbons.png new file mode 100644 index 0000000000..0010006ee1 Binary files /dev/null and b/content/applications/websites/ecommerce/products/catalog/catalog-ribbons.png differ diff --git a/content/applications/websites/ecommerce/products/products-add-to-wishlist.png b/content/applications/websites/ecommerce/products/products-add-to-wishlist.png new file mode 100644 index 0000000000..346eb6da2b Binary files /dev/null and b/content/applications/websites/ecommerce/products/products-add-to-wishlist.png differ diff --git a/content/applications/websites/ecommerce/products/products-block.png b/content/applications/websites/ecommerce/products/products-block.png new file mode 100644 index 0000000000..e000ec5a1f Binary files /dev/null and b/content/applications/websites/ecommerce/products/products-block.png differ diff --git a/content/applications/websites/ecommerce/shipping.rst b/content/applications/websites/ecommerce/shipping.rst index 60dcd28d7a..2a744afc75 100644 --- a/content/applications/websites/ecommerce/shipping.rst +++ b/content/applications/websites/ecommerce/shipping.rst @@ -32,8 +32,9 @@ Go to :menuselection:`Website --> Configuration --> Delivery Methods` and select in the list to :ref:`configure it `. .. seealso:: - :doc:`Third-party shipping carriers - ` + - :doc:`Third-party shipping carriers + ` + - :doc:`Gelato ` .. important:: The field used to define additional fees **must** be filled **in your third-party delivery diff --git a/content/applications/websites/elearning.rst b/content/applications/websites/elearning.rst index 8f395d83f3..040c63b657 100644 --- a/content/applications/websites/elearning.rst +++ b/content/applications/websites/elearning.rst @@ -15,27 +15,32 @@ learning experience enhances their attentiveness and fosters heightened producti .. seealso:: `Odoo Tutorials: eLearning `_ +.. _elearning/courses: + Courses ======= -By going to :menuselection:`eLearning --> Courses --> Courses`, you can get an overview of all your -courses. +To get an overview of all courses, go to :menuselection:`eLearning --> Courses --> Courses`. + +Click on a course card to edit the course on the back end. Click :guilabel:`View course` to access +the course on the front end. -Click on a course title to edit your course on the back end. Click on :guilabel:`View course` to -access your course on the front end. +.. _elearning/course-creation: Course creation --------------- -Click :guilabel:`New` to create a new course. When the page pops up, you can add your -:guilabel:`Course Title` and one or more :guilabel:`Tags` to describe your course. You can add an -image to illustrate your course by hovering your mouse on the camera placeholder image and clicking -on the edit icon. Four tabs allow you to edit your course further: -:ref:`Content `, :ref:`Description `, -:ref:`Options `, and :ref:`Karma `. +Click :guilabel:`New` to create a new course. In the form that opens, add a :guilabel:`Course Title` +and one or more :guilabel:`Tags` to categorize the course and :ref:`allow users +to filter courses based on their tags `. +To add an image to illustrate the course, hover your mouse on the camera placeholder image and +click on :icon:`fa-pencil` :guilabel:`(Edit)`. + +Four tabs allow you to edit your course further: :ref:`Content `, +:ref:`Description `, :ref:`Options `, and +:ref:`Karma `. .. image:: elearning/elearning-course-creation.png - :align: center :alt: Create your elearning course. .. _elearning/content: @@ -43,22 +48,21 @@ on the edit icon. Four tabs allow you to edit your course further: Content tab ~~~~~~~~~~~ -This tab allows you to manage your course content. Click on :guilabel:`Add Section` to divide your -course into different sections. Click on :guilabel:`Add Content` to create -:ref:`content `. Click on :guilabel:`Add Certification` to assess the -level of understanding of your attendees, certify their skills, and motivate them. **Certification** -is part of the :doc:`Surveys <../marketing/surveys/create>` app. +This tab allows you to manage the course content. Click :guilabel:`Add Section` to divide the +course into different sections. Click :guilabel:`Add Content` to create :ref:`content items +`. Click :guilabel:`Add Certification` to assess the attendees' level of +understanding, certify their skills, and motivate them. **Certification** is part of the +:doc:`Surveys <../marketing/surveys/create>` app. .. _elearning/description: Description tab ~~~~~~~~~~~~~~~ -You can add a short description or information related to your course in the :guilabel:`Description` -tab. It appears under your course title on your website. +You can add a short description or information related to the course in the :guilabel:`Description` +tab. It appears under the course title on your website. .. image:: elearning/course-description.png - :align: center :alt: Add a description to your course. .. _elearning/options: @@ -67,70 +71,78 @@ Options tab ~~~~~~~~~~~ In the :guilabel:`Options` tab, different configurations are available: -:ref:`Course `, :ref:`Communication `, -:ref:`Access rights `, and :ref:`Display `. +:ref:`Course `, :ref:`Communication `, +:ref:`Access rights `, and :ref:`Display +`. .. image:: elearning/options-tab.png - :align: center :alt: Overview of the Options tab -.. _elearning/course: +.. _elearning/options-course: Course ****** -Assign a :guilabel:`Responsible` user for your course. If you have multiple websites, use the -:guilabel:`Website` field to only display the course on the selected website. +Assign a :guilabel:`Responsible` user for the course. If you have multiple websites, use the +:guilabel:`Website` field to display the course only on the selected website. -.. _elearning/communication: +.. _elearning/options-communication: Communication ************* -- :guilabel:`Allow Reviews`: tick the box to allow attendees to like and comment on your content and - to submit reviews on your course; -- :guilabel:`Forum`: add a dedicated forum to your course (only shown if the **Forum** feature is - enabled in the app's settings); -- :guilabel:`New Content Notification`: select an email template sent to your attendees when you - upload new content. Click on the internal link button (:guilabel:`➜`) to have access to the email - template editor; -- :guilabel:`Completion Notification`: select an email template sent to your attendees once they - reach the end of your course. Click on the internal link button (:guilabel:`➜`) to access the - email template editor; +- :guilabel:`Allow Reviews`: Enable this option to allow attendees to like, comment on, and submit + reviews for the course content. +- :guilabel:`Forum`: Add a dedicated forum to the course (only shown if the :guilabel:`Forum` + feature is enabled in the :ref:`eLearning settings `). +- :guilabel:`New Content Notification`: Select an email template to send emails to attendees when + you upload new content items. Click on :icon:`oi-arrow-right` :guilabel:`Internal link` to access + the email template editor. +- :guilabel:`Completion Notification`: Select an email template to send emails to attendees once + they reach the end of the course. Click on :icon:`oi-arrow-right` :guilabel:`Internal link` to + access the email template editor. + +.. note:: + If the :guilabel:`Mailing` feature is enabled in the :ref:`eLearning settings + `, a :guilabel:`Contact Attendees` button at the top left of the course form + allows you to send mass mailings to people enrolled in the course. -.. _elearning/access-rights: +.. _elearning/options-access-rights: Access rights ************* -- :guilabel:`Prerequisites`: set one or more courses that users are advised to complete before - accessing your course; -- :guilabel:`Show course to`: define who can access your course and their content between - :guilabel:`Everyone`, :guilabel:`Signed In` or :guilabel:`Course Attendees`; -- :guilabel:`Enroll Policy`: define how people enroll in your course. Select: - - - :guilabel:`Open`: if you want your course to be available to anyone; - - :guilabel:`On Invitation`: if only people who received an invitation can enroll to your course. - If selected, fill in the :guilabel:`Enroll Message` explaining the course's enrollment process. - This message appears on your website under the course title; - - :guilabel:`On Payment`: if only people who bought your course can attend it. The - :guilabel:`Paid Courses` feature must be enabled to get this option. If you select - :guilabel:`On Payment`, you must add a :guilabel:`Product` for your course. +- :guilabel:`Prerequisites`: Set one or more other courses that users are advised to complete before + accessing the course. +- :guilabel:`Prerequisite Of`: If the course has been defined as a prerequisite for one or more + courses, this read-only field displays the course name(s). +- :guilabel:`Show course to`: Define who can access the course and its content. Select + :guilabel:`Everyone`, :guilabel:`Signed In`, or :guilabel:`Course Attendees`. +- :guilabel:`Enroll Policy`: Define how people enroll in the course. Select: + + - :guilabel:`Open`: to make the course available to anyone. + - :guilabel:`On Invitation`: to restrict enrollment to invited attendees only. If enabled, + provide an :guilabel:`Enroll Message` explaining the enrollment process. This message is + displayed on your website beneath the course title. To send invite to attendees, click + :guilabel:`Invite` and either:guilabel:`Copy` the link or toggle :guilabel:`Send by Email` + to send the invitation via email. + - :guilabel:`On Payment`: to restrict enrollment to users who purchase the course. If enabled, + select the :guilabel:`Product` to be used. This option requires the :guilabel:`Paid Courses` + feature to be enabled in the :ref:`eLearning settings `. .. note:: Only products set up with :guilabel:`Course` as their :guilabel:`Product Type` are - displayed. + available for selection. -.. _elearning/display: +.. _elearning/options-display: Display ******* -- :guilabel:`Training`: the course content appears as a training program, and the courses must be +- :guilabel:`Training`: The course content appears as a training program, and the courses must be taken in the proposed order. -- :guilabel:`Documentation`: the content is available in any order. If you choose this option, you - can choose which page should be promoted on the course homepage by using the - :guilabel:`Featured Content` field. +- :guilabel:`Documentation`: The content is available in any order. Use the :guilabel:`Featured + Content` field to define which content items are promoted on the course homepage. .. _elearning/karma: @@ -139,118 +151,184 @@ Karma tab This tab is about gamification to make eLearning fun and interactive. -In the :guilabel:`Rewards` section, choose how many karma points you want to grant your students +In the :guilabel:`Rewards` section, choose how many karma points you want to grant attendees when they :guilabel:`Review` or :guilabel:`Finish` a course. -In the :guilabel:`Access Rights` section, define the karma needed to :guilabel:`Add Review`, +In the :guilabel:`Access Rights` section, define the karma points needed to :guilabel:`Add Review`, :guilabel:`Add Comment`, or :guilabel:`Vote` on the course. -.. note:: - From your course, click the :guilabel:`Contact Attendees` button to reach people who are - enrolled in the course. - .. _elearning/course-groups: Course groups ------------- -Use the **Course Groups** to inform users and allow them to filter the courses from the -:guilabel:`All Courses` dashboard. +**Course Groups** allow users to filter the :guilabel:`All Courses` dashboard on your website and +find the course that meets their interests, needs, level, etc. + +To manage them, go to :menuselection:`eLearning --> Configuration --> Course Groups`. Click +:guilabel:`New` to create a new course group. Add the :guilabel:`Course Group Name`, enable +:guilabel:`Menu Entry` to allow users to search by course group on the website, and add tags in +the :guilabel:`Tag Name` column. For each tag, you can select a corresponding color. -You can manage them by going to :menuselection:`Configuration --> -Course Groups`. Click :guilabel:`New` to create a new course group. Add the :guilabel:`Course Group -Name`, tick the :guilabel:`Menu Entry` box to allow users to search by course group on the website, -and add tags in the :guilabel:`Tag Name` column. For each tag, you can select a corresponding color. +.. _elearning/settings: Settings -------- -You can enable different features to customize your courses by going to :menuselection:`eLearning ---> Configuration --> Settings`: +The following options are available in the eLearning settings. Go to :menuselection:`eLearning --> +Configuration --> Settings`, then enable the desired feature: -- **Certifications**: to evaluate the knowledge of your attendees and certify their skills; -- **Paid courses**: to sell access to your courses on your website and track revenues; -- **Mailing**: to update all your attendees at once through mass mailings; -- **Forum**: to create a community and let attendees answer each other's questions. +- :guilabel:`Certifications`: Assess attendees' knowledge and provide official certification of + their skills. +- :guilabel:`Paid Courses`: Sell course access directly through your website and track revenue. +- :guilabel:`Mailing`: Send mass mailings to keep all attendees informed and up to date. +- :guilabel:`Forum`: Build a community space where attendees can ask questions and help each other. -.. _elearning/create-content: +.. _elearning/content-creation: Content ======= -Manage your content by going to :menuselection:`eLearning --> Courses --> Contents`. Click -:guilabel:`New` to create content. Add your :guilabel:`Content Title`, and if you want -:ref:`Tags `, then fill in the related information among the different tabs. +To manage course content, go to :menuselection:`eLearning --> Courses --> Contents`. Click +:guilabel:`New` to create a content item. Add the :guilabel:`Content Title` and any desired +:ref:`Tags `, then fill in the required information in the different tabs. .. image:: elearning/elearning-content-tab.png - :align: center :alt: Create your content. +.. tip:: + You can also create new content from within a course. Go to :menuselection:`eLearning --> Courses + --> Courses`, click the relevant course card, then click :guilabel:`Add content` at the bottom + of the :guilabel:`Content` tab. + +.. _elearning/content-document: + Document tab ------------ -- :guilabel:`Course`: select the course your content belongs to; -- :guilabel:`Content Type`: select the type of your content; -- :guilabel:`Responsible`: add a responsible person for your content; -- :guilabel:`Duration`: indicate the time required to complete the course; -- :guilabel:`Allow Download`: allow users to download the content of the slide. This option is only - visible when the content is a document; -- :guilabel:`Allow Preview`: the course is accessible by anyone. -- :guilabel:`# of Public Views`: displays the number of views from non-enrolled participants; +For each content type, provide the following information: + +- :guilabel:`Course`: Select the course to which the content item belongs. +- :guilabel:`Content Type`: Select the relevant :ref:`content type ` and + provide the required information. +- :guilabel:`Responsible`: Select the user responsible for the content item. By default, this is the + user who creates the course, but another user can be selected. +- :guilabel:`Duration`: Enter the time required to complete the lesson. +- :guilabel:`Allow Preview`: Enable this if the content should be accessible to anyone. + +.. note:: + If the :ref:`Content Type ` is :guilabel:`Document`, enabling + :guilabel:`Allow Download` allows users to download the content. + +Two read-only fields provide data about how often the content item is viewed: + +- :guilabel:`# of Public Views`: displays the number of views from non-enrolled participants. - :guilabel:`# Total Views`: displays the total number of views (non-enrolled and enrolled participants). +.. image:: elearning/elearning-document-tab.png + :alt: Provide information about the content. + +.. _elearning/content-type: + +Content types +~~~~~~~~~~~~~ + +You can add the following content types: + +- :guilabel:`Image`: To upload an image, select :guilabel:`Upload from Device`, click + :guilabel:`Upload your file`, then select the relevant file. Supported formats include JPG, JPEG, + PNG, SVG, GIF, and WEBP. The maximum file size is 25MB. + + Alternatively, to add an image saved on Google Drive, select :guilabel:`Retrieve from Google + Drive`, then add the Google Drive link to the image. + +- :guilabel:`Article`: Articles are website pages that are customized using the website + builder on your website's front end. + + With the :guilabel:`Course` selected, click the :guilabel:`Go to Website` smart button, then, at + the top-right of the screen, click :icon:`fa-pencil` :guilabel:`(Edit)`. Write the article's + content and :doc:`customize the page using the website builder `. + +- :guilabel:`Document`: To upload a document, select :guilabel:`Upload from Device`, click + :guilabel:`Upload your file`, then select the relevant file. Only PDF documents can be uploaded. + + Alternatively, to add a Google Slides presentation, Google Doc document, or Google Sheets + spreadsheet, click :guilabel:`Retrieve from Google Drive` and add the Google Drive link to the + file. + +- :guilabel:`Video`: Add the YouTube, Google Drive, or Vimeo link to the video. +- :guilabel:`Quiz`: Open the :ref:`Quiz tab ` to create a quiz. + +.. _elearning/content-description: + Description tab --------------- -You can add a description of your content that appears front end in the :guilabel:`About` section of -your course content. +Add a description for the content. This text is displayed in the :guilabel:`About` section of the +content item on your website. + +.. _elearning/content-additional-resources: Additional Resources tab ------------------------ Click :guilabel:`Add a line` to add a link or a file that supports your participants' learning. -It appears in the course content on your website. +The resource appears in the course content on your website. .. image:: elearning/additional-content.png - :align: center :alt: Additional ressources -.. _elearning/quiz: +.. _elearning/content-quiz: Quiz tab -------- -From this tab you can create a quiz to assess your students at the end of the course. +From this tab, you can create a quiz to assess your students at the end of the course. -The :guilabel:`Points Rewards` section lets you give a specific number of karma points depending on -how many tries they need to correctly answer the question. Then, create your questions and the -possible answers by clicking on :guilabel:`Add a line`. A new window pops up, add the question by -filling in the :guilabel:`Question Name` and add multiple answers by clicking on :guilabel:`Add a -line`. Tick the :guilabel:`Is correct answer` to mark one or more answers as correct. You can also -fill in the :guilabel:`Comment` field to display additional information when the answer is chosen by -the participant. +The :guilabel:`Points Rewards` section allows you to assign karma points based on how many attempts +are needed to answer correctly. To create a question, click :guilabel:`Add a line`, enter the +:guilabel:`Question Name`, and add possible answers. Mark the correct answer(s) by selecting +:guilabel:`Is correct answer`. You can also use the :guilabel:`Comment` field to provide additional +information when an answer is selected. -.. _elearning/tags: +.. _elearning/content-tags: Content Tags ------------ -The **Content Tags** help users to classify the content from the :guilabel:`Contents` dashboard. +**Content Tags** are visible on the :guilabel:`Contents` dashboard of a course on your website, and +can help users identify the kind of content a particular lesson contains, e.g., theory, or exercises. -You can manage them by going to :menuselection:`eLearning --> Configuration --> Content Tags`. Click +To manage content tags, go to :menuselection:`eLearning --> Configuration --> Content Tags`. Click :guilabel:`New` to create a new tag. -Publish your content -==================== +.. _elearning/publish-content: + +Publish courses and content +=========================== + +Courses and content items must be published from the front end to be available to your audience. +To access the front end, click the :guilabel:`Go to Website` smart button at the top of the course +form or an individual content form. -Everything created on the back end needs to be published from the front end. Unpublished content is -always visible from your website but still needs to be published to be available to your audience. +A course and its content items are published separately: -You must be on your website's front end to publish your content. To do so, click on the -:guilabel:`Go To Website` smart button, and tick the :guilabel:`Publish` option available in the -right-hand corner. +- To publish a course, access the main course page, then toggle the switch in the + upper-right corner from :guilabel:`Unpublished` to :guilabel:`Published`. +- To publish individual content items, click on an item to open it, then toggle the switch + from :guilabel:`Unpublished` to :guilabel:`Published`. .. image:: elearning/elearning-publish-button.png - :align: center :alt: Publish your content. + +.. tip:: + When publishing a new course, publish the individual content items before publishing the course + itself. Published content is only available to your audience once the course it is part of is + published. + +To unpublish a course or an individual content item, open the course or item, then toggle the switch +from :guilabel:`Published` to :guilabel:`Unpublished`. + +.. note:: + Unpublishing a course renders the course *and* its content unavailable to your audience. diff --git a/content/applications/websites/elearning/elearning-document-tab.png b/content/applications/websites/elearning/elearning-document-tab.png new file mode 100644 index 0000000000..a652921dcd Binary files /dev/null and b/content/applications/websites/elearning/elearning-document-tab.png differ diff --git a/content/applications/websites/forum.rst b/content/applications/websites/forum.rst index 216e43fc1d..be89253b68 100644 --- a/content/applications/websites/forum.rst +++ b/content/applications/websites/forum.rst @@ -54,7 +54,7 @@ having moderator rights. They are also used to set user :ref:`ranks ` and by :ref:`completing quizzes `. + ` and by :ref:`completing quizzes `. .. _forum/karma-gains: diff --git a/content/applications/websites/livechat/chatbots.rst b/content/applications/websites/livechat/chatbots.rst index a8feab3713..9eedab7349 100644 --- a/content/applications/websites/livechat/chatbots.rst +++ b/content/applications/websites/livechat/chatbots.rst @@ -12,21 +12,19 @@ collecting contact information. The goal of each chatbot can vary based on sever including the webpage where it is located, and the information it captures. .. image:: chatbots/chatbot-visitor-view.png - :align: center :alt: View of the chat window with a helpdesk ticket created in Odoo Live Chat. Build a chatbot =============== -Before creating a new chatbot, the *Live Chat* application must first be installed on the database. -This can be done directly from the :menuselection:`Apps` application, by searching for `Live Chat` -in the :guilabel:`Search...` bar, and clicking :guilabel:`Install`. +Before creating a new chatbot, the **Live Chat** application must first be :ref:`installed +`. -Once the *Live Chat* application has been installed on the database, go to :menuselection:`Live Chat -app --> Configuration --> Chatbots`. +After the **Live Chat** application has been installed on the database, go to :menuselection:`Live +Chat app --> Configuration --> Chatbots`. .. note:: - When the *Live Chat* app is installed, a sample chatbot is created, named *Welcome Bot*. This + When the **Live Chat** app is installed, a sample chatbot is created, named *Welcome Bot*. This chatbot has a preconfigured script that walks through a few basic steps, including asking for a visitor's email address, and forwarding the conversation to an operator. @@ -36,50 +34,47 @@ app --> Configuration --> Chatbots`. *Welcome Bot* can be deleted or archived, if necessary. .. image:: chatbots/chatbot-welcome-bot.png - :align: center :alt: View of the Welcome Bot script in Odoo Live Chat. To create a new chatbot, navigate to the :guilabel:`Chatbot` page (:menuselection:`Live Chat app --> -Configuration --> Chatbots`) and click :guilabel:`New`. This opens a blank chatbot details page. +Configuration --> Chatbots`) and click :guilabel:`New` to open a blank chatbot details page. -On the blank chatbot details page, enter a name in the :guilabel:`Chatbot Name` field and click on -the :guilabel:`Edit Image` icon in the upper right corner of the form to add a photo. +Enter a name in the :guilabel:`Chatbot Name` field and hover over the image on the right. Click on +the :icon:`fa-pencil` :guilabel:`(pencil)` icon that appears to add a photo. Chatbot scripts ---------------- +=============== After the new chatbot has been created and named, the next step is to create a script. Chatbot -conversations follow an accompanying script. These scripts are comprised of lines of dialog, each -designed to deliver or capture information. +conversations follow an accompanying script, comprised of lines of dialog. Each line is designed to +either deliver or capture information. To create a chatbot script, click :guilabel:`Add a Line` in the :guilabel:`Script` tab of the -chatbot detail page, and a :guilabel:`Create Script Steps` modal appears. - - -This form must be filled out for **each** line of text (dialog) that the chatbot could deliver -during the conversation. +chatbot detail page, and a :guilabel:`Create Script Steps` pop-up window appears. This form must be +filled out for each line of text (dialog) that the chatbot could potentially deliver during the +conversation. First, enter the content of the message in the :guilabel:`Message` field. Then, select an option -from the :guilabel:`Step Type` and :guilabel:`Only If` drop-down menus. +from the :guilabel:`Step Type` and :ref:`Only If ` drop-down menus. Step types -~~~~~~~~~~ +---------- The :guilabel:`Step Type` selected depends on the intended purpose of the message. The available -options in the :guilabel:`Step Type` drop-down menu are detailed below: +options in the :guilabel:`Step Type` drop-down menu are detailed below. Text -**** +~~~~ This step is used for messages where no answer is expected or necessary. Text steps can be used for greetings, to offer resources, such as documentation, or provide links to specific web pages. .. important:: - *Text* step types are only intended to deliver information, and do **not** allow for any visitor - input. As such, they **must** be followed by additional steps to continue the conversation. + *Text* step types are only intended to deliver information, and do not allow for any visitor + input. As such, they must be followed by additional steps to continue the conversation. Question -******** +~~~~~~~~ This step asks a question and provides a set of answers. The visitor clicks on one answer, which either leads to a new step in the conversation, or can lead to an optional link to a new webpage. @@ -91,41 +86,38 @@ Proceed to enter the answer as it should appear to the visitor. To turn the answ redirects the visitor when selected, add the URL to the answer line under the :guilabel:`Optional Link` heading. -Repeat these steps for every answer to be included for the question. - -Click :guilabel:`Save & Close` or :guilabel:`Save & New`. +Repeat these steps for every answer to be included for the question. Click :guilabel:`Save & Close` +or :guilabel:`Save & New` when finished. .. tip:: It is helpful to add a catchall answer to question steps (e.g: `Something else`). This helps - visitors continue the conversation, even if their needs do not exactly fit with any of the other - answers. + visitors continue the conversation, even if their needs do not fit with any of the other answers. Email -***** +~~~~~ This step prompts visitors to provide their email address, which is stored and can be used by team members later to follow up with additional information. -The **only** accepted inputs for this step type are email addresses that are in a valid format. If a +The only accepted inputs for this step type are email addresses that are in a valid format. If a visitor attempts to enter anything other than a valid email address, the chatbot responds with a message stating it does not recognize the information submitted. .. image:: chatbots/chatbot-invalid-email.png - :align: center :alt: View of a chatbot responding to an invalid email. Phone -***** +~~~~~ Similar to email, this step type prompts the visitor to enter their phone number, which can be used to follow up with additional information, schedule demos, and more. .. warning:: Due to the vast number of formats used for phone numbers worldwide, responses to this step type - are **not** validated for formatting, and can include both numbers and special characters. + are not validated for formatting, and can include both numbers and special characters. Forward to Operator -******************* +~~~~~~~~~~~~~~~~~~~ This step forwards the conversation to an active live chat operator, so they can continue assisting the visitor. As the conversation transcript is passed on to the operator, they can pick up @@ -140,11 +132,10 @@ qualify conversations before they reach live operators. continue the conversation (e.g. `Would you like to leave your email address?`). .. image:: chatbots/chatbot-no-operator.png - :align: center :alt: View of a chatbot follow up messages when no live chat operator is available. Free Input/Multi-Line -********************* +~~~~~~~~~~~~~~~~~~~~~ The *free input* step allows visitors to respond to questions without providing pre-written responses. Information provided in these responses is stored in the chat transcripts. @@ -153,84 +144,92 @@ Choose between :guilabel:`Free Input` and :guilabel:`Free Input (Multi-Line)` de and amount of information the visitor is asked to provide. Create Lead -*********** +~~~~~~~~~~~ -This step creates a lead in the *CRM* application. Select an option from the :guilabel:`Sales Team` -drop-down field that appears to assign the created lead to a specific team. +This step creates a lead in the **CRM** application. Select an option from the :guilabel:`Sales +Team` drop-down field that appears to assign the created lead to a specific team. .. note:: - This step is **only** available if the *CRM* application is installed on the database. + This step is only available if the **CRM** application is installed on the database. Create Ticket -************* +~~~~~~~~~~~~~ -This step creates a :doc:`ticket <../../services/helpdesk/overview/receiving_tickets>` in -the *Helpdesk* application. Select an option from the :guilabel:`Helpdesk Team` drop-down field that +This step creates a :doc:`ticket <../../services/helpdesk/overview/receiving_tickets>` in the +**Helpdesk** application. Select an option from the :guilabel:`Helpdesk Team` drop-down field that appears to assign the created ticket to a specific team. .. note:: - This step is **only** available if the *Helpdesk* application is installed on the database. + This step is only available if the **Helpdesk** application is installed on the database. + +.. _livechat/chatbots/only-if: Only if -~~~~~~~ +------- Chatbot scripts operate on an if/then basis, which means the next question presented to the visitor is determined by the answer provided to the previous question. To continue the progression of the conversation, the :guilabel:`Create Script Steps` form for a new step contains a field labeled :guilabel:`Only If`. This field is where the progression of questions -is defined. +are defined. If a step is intended to follow all of the previous messages, this field can be left empty. However, -if a message should **only** be sent conditionally, based on a previous response, or several -previous responses, those responses **must** be added to this field. +if a message should only be sent conditionally, based on a previous response, or several previous +responses, those responses **must** be added to this field. .. important:: - If any selections are made in the :guilabel:`Only If` field, they must **all** be selected during - the conversation *before* this step will be included. Only include selections in this field if - they are necessary for this step to be displayed. + If any selections are made in the :guilabel:`Only If` field, they must all be selected during the + conversation before this step is included. Only include selections in this field if they are + necessary for this step to be displayed. .. example:: In the *Welcome Bot* script, a visitor can ask about pricing information. If the visitor selects this response, a step is included to forward the conversation to an operator. The chatbot first sends a message informing the visitor that it is checking to see if an operator is available to - chat. + assist with pricing information. - However, this message should **only** be delivered if the visitor requests pricing information. - In that situation, the conversation would proceed as below: + However, this message should only be delivered if the visitor requests pricing information. In + that situation, the conversation would proceed as below: - Welcome Bot: "*What are you looking for?*" - Visitor: "**I have a pricing question.**" - Welcome Bot: "*Hmmm, let me check if I can find someone that could help you with that...*" In the details form for the :guilabel:`Text` step, the *I have a pricing question* response has - been selected in the :guilabel:`Only If` field. As such, this step is **only** shown in - conversations where that response has been selected. + been selected in the :guilabel:`Only If` field. As such, this step is only shown in conversations + where that response has been selected. .. image:: chatbots/chatbot-only-if.png - :align: center :alt: View of the new message form emphasizing the Only If field. Script testing --------------- +============== To ensure all visitors have a satisfactory experience with the chatbot, each message needs to lead to a natural conclusion. Chatbot scripts should be tested to confirm there are no dead-ends, and to understand what the visitor sees when they interact with the chatbot. .. important:: - If the visitor provides an answer, or input, that is **not** assigned a corresponding follow-up + If the visitor provides an answer, or input, that is not assigned a corresponding follow-up response, the conversation stops (*dead-ends*). Since the visitor cannot re-engage the chatbot, - they must restart the conversation by refreshing the chat window, or their browser. + they must restart the conversation by refreshing the chat window, or their browser. They may also + click on the :icon:`fa-refresh` :guilabel:`(refresh)` icon at the top of the message window. + + .. figure:: chatbots/refresh-button.png + :alt: The refresh button at the top of the message window. + + The :icon:`fa-refresh` (refresh) icon only appears when the chatbot script has reached a + dead-end. To test the performance of a chatbot, first click on the :guilabel:`Test` button at the top-left of the chatbot script page. Then, upon being redirected to the testing screen, answer the chatbot prompts the same way a potential site visitor would. -When the script has reached an end-point, the message *Conversation ended...Restart* appears at the -bottom of the chat window. To begin the conversation at the beginning of the script, click on -:guilabel:`Restart`. To return to the script page, click :guilabel:`Back to edit mode` at the top of -the page. +When the script has reached an end-point, the message *Conversation ended...* appears at the bottom +of the chat window. To begin the conversation at the beginning of the script, click on the +:icon:`fa-refresh` :guilabel:`(refresh)` icon at the top of the message window. To return to the +script page, click :guilabel:`Back to edit mode` at the top of the page. Add chatbot to a channel ======================== @@ -238,8 +237,9 @@ Add chatbot to a channel After a chatbot has been created and tested, it needs to be added to a live chat channel. First, open the :menuselection:`Live Chat` application, find the Kanban card for the appropriate -live chat channel, hover over it, and click the :guilabel:`⋮ (three dots)` icon to open the -drop-down menu. Click :guilabel:`Configure Channel` to open the channel detail form. +live chat channel, hover over it, and click the :icon:`fa-ellipsis-v` +:guilabel:`(vertical ellipsis)` icon to open the drop-down menu. Click :guilabel:`Configure Channel` +to open the channel detail form. .. note:: To create a new live chat channel, open the :menuselection:`Live Chat app` and click @@ -248,14 +248,13 @@ drop-down menu. Click :guilabel:`Configure Channel` to open the channel detail f Click on the :guilabel:`Channel Rules` tab. Then, open an existing rule, or create a new one by clicking :guilabel:`Add a line`. -On the :guilabel:`Create Rules` modal, choose the appropriate chatbot in the :guilabel:`Chatbot` -field. +On the :guilabel:`Create Rules` pop-up window, choose the appropriate chatbot in the +:guilabel:`Chatbot` field. -If the chatbot should **only** be active if there are no live chat operators available, check the -box labeled :guilabel:`Enabled only if no operator`. +If the chatbot should only be active if there are no live chat operators available, check the box +labeled :guilabel:`Enabled only if no operator`. .. image:: chatbots/chatbot-add-to-channel.png - :align: center :alt: View of the channel rules emphasizing the chatbot field. .. seealso:: diff --git a/content/applications/websites/livechat/chatbots/chatbot-add-to-channel.png b/content/applications/websites/livechat/chatbots/chatbot-add-to-channel.png index 091fdac195..0ebafba26e 100644 Binary files a/content/applications/websites/livechat/chatbots/chatbot-add-to-channel.png and b/content/applications/websites/livechat/chatbots/chatbot-add-to-channel.png differ diff --git a/content/applications/websites/livechat/chatbots/chatbot-invalid-email.png b/content/applications/websites/livechat/chatbots/chatbot-invalid-email.png index e97198f9de..88f0ad6a49 100644 Binary files a/content/applications/websites/livechat/chatbots/chatbot-invalid-email.png and b/content/applications/websites/livechat/chatbots/chatbot-invalid-email.png differ diff --git a/content/applications/websites/livechat/chatbots/chatbot-no-operator.png b/content/applications/websites/livechat/chatbots/chatbot-no-operator.png index 8caedc2cea..020463ec75 100644 Binary files a/content/applications/websites/livechat/chatbots/chatbot-no-operator.png and b/content/applications/websites/livechat/chatbots/chatbot-no-operator.png differ diff --git a/content/applications/websites/livechat/chatbots/chatbot-only-if.png b/content/applications/websites/livechat/chatbots/chatbot-only-if.png index 2f81c7275d..ed8a8bed43 100644 Binary files a/content/applications/websites/livechat/chatbots/chatbot-only-if.png and b/content/applications/websites/livechat/chatbots/chatbot-only-if.png differ diff --git a/content/applications/websites/livechat/chatbots/refresh-button.png b/content/applications/websites/livechat/chatbots/refresh-button.png new file mode 100644 index 0000000000..226feca2a0 Binary files /dev/null and b/content/applications/websites/livechat/chatbots/refresh-button.png differ diff --git a/content/applications/websites/livechat/reports.rst b/content/applications/websites/livechat/reports.rst index 9f6ceeaa6f..b1e5e250dd 100644 --- a/content/applications/websites/livechat/reports.rst +++ b/content/applications/websites/livechat/reports.rst @@ -2,13 +2,10 @@ Reports ======= -Odoo *Live Chat* includes several reports that allow for the monitoring of operator performance and -the identification of trends in customer conversations. +Odoo **Live Chat** includes several reports that allow for the monitoring of operator performance +and the identification of trends in customer conversations. -Available reports -================= - -The following reports are included in the *Live Chat* app: +The following reports are included in the **Live Chat** app: - :ref:`Sessions History ` - :ref:`Session Statistics ` @@ -16,7 +13,7 @@ The following reports are included in the *Live Chat* app: .. note:: The *Live Chat Ratings Report* can also be accessed through the :guilabel:`Report` menu. For more - information on this report, and on the *Live Chat* rating process, see :doc:`Live Chat Ratings + information on this report, and on the **Live Chat** rating process, see :doc:`Live Chat Ratings <../livechat/ratings>`. To access a drop-down menu of all the available reports, navigate to :menuselection:`Live Chat app @@ -25,47 +22,48 @@ To access a drop-down menu of all the available reports, navigate to :menuselect .. _livechat/sessions-history: Sessions History ----------------- +================ The *Sessions History* report displays an overview of live chat sessions, including session dates, participant name and country, session duration, the number of messages, and the rating. It also provides access to the complete transcripts of live chat sessions. To access this report, navigate to :menuselection:`Live Chat app --> Report --> Sessions History`. +Each live chat session is represented by a Kanban card. .. image:: reports/sessions-history.png - :align: center :alt: Example of the Sessions History report from the Live Chat application. +To view the transcript from a specific session, click the Kanban card. This opens the *Discuss* +thread for the conversation. + +In the *Discuss* thread, the conversation view displays the entire transcript of the conversation. +If the visitor left a rating, it is included at the end of the transcript. + +.. image:: reports/chat-transcript.png + :alt: View of the chat transcript in the Discuss application. + +Export sessions history +----------------------- + The information in this report can be exported, or inserted into a spreadsheet. -Click the :guilabel:`⚙️ (gear)` icon to the right of the :guilabel:`History` page title, in the -top-left corner. Doing so reveals a drop-down menu. +On the *Sessions History* report, click the :icon:`oi-view-list` :guilabel:`(List)` icon to switch +to list view. Next, click the :icon:`fa-cog` :guilabel:`(gear)` icon to the right of the +:guilabel:`History` page title to reveal a drop-down menu. From the drop-down menu, click :guilabel:`Export All` to export all sessions to a spreadsheet, or :guilabel:`Insert list in spreadsheet` to insert the information in a new, or existing, spreadsheet. To only export select sessions, first select the desired sessions to be exported from the list, by clicking the checkbox to the left of each individual session. With the sessions selected, click the -:guilabel:`⚙️ (gear) Actions` icon in the top-center of the page, and click :guilabel:`Export` or +:icon:`fa-cog` :guilabel:`Actions` icon at the top of the page, and click :guilabel:`Export` or :guilabel:`Insert list in spreadsheet`. -To view the transcript of an individual conversation, click anywhere on the entry line. This opens -the *Discuss* thread for the conversation. - -In the *Discuss* thread, the conversation view displays the entire transcript of the conversation. -At the top of the conversation, there is a list of the web pages the visitor browsed before -beginning their chat session, along with corresponding time stamps. If the visitor left a rating, it -is included at the end of the transcript. - -.. image:: reports/chat-transcript.png - :align: center - :alt: View of the chat transcript in the Discuss application. - .. _livechat/session-statistics: Session Statistics ------------------- +================== The *Session Statistics* report provides a statistical overview of live chat sessions. The default view for this report displays sessions grouped by the date of creation. @@ -74,7 +72,6 @@ To access this report, navigate to :menuselection:`Live Chat app --> Reports --> Statistics`. .. figure:: reports/sessions-statistics.png - :align: center :alt: Example of the Sessions Statistics report from the Live Chat application. The stacked bar graph view of the *Session Statistics* report, with results grouped by Creation @@ -102,7 +99,7 @@ report. The measures available for this report include: .. _livechat/operator-analysis: Operator Analysis ------------------ +================= The *Operator Analysis* report is used to monitor the performance of individual live chat operators. @@ -124,68 +121,4 @@ report. The measures available for this report include: - :guilabel:`Count`: the total number of sessions. .. image:: reports/operator-analysis.png - :align: center :alt: Example of the Operator Analysis report from the Live Chat application. - -View and filter options -======================= - -On any Odoo report, the view and filter options vary, depending on what data is being analyzed, -measured, and grouped. See below for additional information on the available views for the *Live -Chat* reports. - -.. note:: - The :ref:`Sessions History ` report is **only** available in list - view. - -Pivot view ----------- - -The *pivot* view presents data in an interactive manner. The :ref:`Session Statistics -` and :ref:`Operator Analysis ` reports are -available in pivot view. - -The pivot view can be accessed on a report by selecting the :guilabel:`grid icon` at the top-right -of the screen. - -To add a group to a row or column, click the :guilabel:`➕ (plus sign)` icon next to -:guilabel:`Total`, and then select one of the groups from the drop-down menu that appears. To remove -one, click the :guilabel:`➖ (minus sign)` icon, and de-select the appropriate option. - -Graph view ----------- - -The *graph* view presents data in either a *bar*, *line*, or *pie* chart. The :ref:`Session -Statistics ` and :ref:`Operator Analysis ` -reports are available in graph view. - -Switch to the graph view by selecting the :guilabel:`line chart` icon at the top-right of the -screen. To switch between the different charts, select the desired view's corresponding icon at the -top-left of the chart, while in graph view. - -.. tip:: - Both the bar chart and line chart can utilize the *stacked* view option. This presents two or - more groups of data on top of each other, instead of next to each other, making it easier to - compare data. - -Save and share a favorite search --------------------------------- - -The *Favorites* feature found on reports allows users to save their most commonly used filters, -without having to reconstruct them every time they are needed. - -To create and save a filter to the *Favorites* section on the search bar drop-down menu, follow the -steps below: - -#. Set the necessary parameters using the :guilabel:`Filters` and :guilabel:`Group By` options - available in the :guilabel:`Search...` bar drop-down menu and the :guilabel:`Measures` drop-down - menu at the top-left of the report. -#. Click the :guilabel:`🔻(triangle pointed down)` icon next to the :guilabel:`Search...` bar to - open the drop-down menu. -#. Under the :guilabel:`Favorites` heading, click :guilabel:`Save current search`. -#. Rename the search. -#. Select :guilabel:`Default filter` to have these filter settings automatically displayed when the - report is opened. Otherwise, leave it blank. -#. Select :guilabel:`Shared` to make this filter available to all other database users. If this box - is not checked, the filter is only available to the user who creates it. -#. Click :guilabel:`Save` to preserve the configuration for future use. diff --git a/content/applications/websites/livechat/reports/chat-transcript.png b/content/applications/websites/livechat/reports/chat-transcript.png index 99a83006e5..13cbf3544b 100644 Binary files a/content/applications/websites/livechat/reports/chat-transcript.png and b/content/applications/websites/livechat/reports/chat-transcript.png differ diff --git a/content/applications/websites/livechat/reports/sessions-history.png b/content/applications/websites/livechat/reports/sessions-history.png index ca61b230d0..12aea4a90c 100644 Binary files a/content/applications/websites/livechat/reports/sessions-history.png and b/content/applications/websites/livechat/reports/sessions-history.png differ diff --git a/content/applications/websites/livechat/reports/sessions-statistics.png b/content/applications/websites/livechat/reports/sessions-statistics.png index 410e763fca..d794637870 100644 Binary files a/content/applications/websites/livechat/reports/sessions-statistics.png and b/content/applications/websites/livechat/reports/sessions-statistics.png differ diff --git a/content/applications/websites/website.rst b/content/applications/websites/website.rst index 5bed61d2e8..07937c3802 100644 --- a/content/applications/websites/website.rst +++ b/content/applications/websites/website.rst @@ -19,8 +19,8 @@ with other Odoo apps to expand your website's functionality. Design your website using building blocks and website themes. - .. card:: Pages - :target: website/pages + .. card:: Structure + :target: website/structure :large: Manage website pages, menus, and search engine optimization. @@ -57,7 +57,7 @@ with other Odoo apps to expand your website's functionality. :titlesonly: website/web_design - website/pages + website/structure website/configuration website/reporting website/mail_groups diff --git a/content/applications/websites/website/configuration/cookies_bar.rst b/content/applications/websites/website/configuration/cookies_bar.rst index 2681d5bc61..795b17c90e 100644 --- a/content/applications/websites/website/configuration/cookies_bar.rst +++ b/content/applications/websites/website/configuration/cookies_bar.rst @@ -54,4 +54,4 @@ To adapt the content of the page according to your needs, click the :guilabel:`E You could add a link to this page in your website's footer, for example. .. seealso:: - :doc:`Pages <../pages>` + :doc:`Pages <../structure/pages>` diff --git a/content/applications/websites/website/configuration/domain_names.rst b/content/applications/websites/website/configuration/domain_names.rst index e4e15a337e..644324ff57 100644 --- a/content/applications/websites/website/configuration/domain_names.rst +++ b/content/applications/websites/website/configuration/domain_names.rst @@ -13,8 +13,10 @@ However, you can use a custom domain name instead by :ref:`registering a free do domain name you already own `. .. seealso:: - `Odoo Tutorials: Register a free domain name [video] - `_ + - `Odoo Tutorials: Register a free domain name [video] + `_ + - `Magic Sheet - Website domain configuration [PDF] + `_ .. _domain-name/register: @@ -22,8 +24,9 @@ Register a free domain name with Odoo ===================================== To register a one-year free domain name for your Odoo Online database, sign in to your account and -go to the `database manager `_. Click the gear icon -(:guilabel:`⚙️`) next to the database name and select :guilabel:`Domain Names`. +go to the `database manager `_. Click the :icon:`fa-gear` +(:guilabel:`gear`) button next to the database name and select :icon:`fa-globe` :guilabel:`Domain +Names`. .. image:: domain_names/domain-names.png :alt: Accessing a database's domain names configuration @@ -71,8 +74,8 @@ DNS records ----------- To manage your free domain name :abbr:`DNS (domain name system)` records, open the `database manager -`_, click the gear icon (:guilabel:`⚙️`) next to the database -name, select :guilabel:`Domain Names`, and click :guilabel:`DNS`. +`_, click the :icon:`fa-gear` (:guilabel:`gear`) button next to +the database name, select :icon:`fa-globe` :guilabel:`Domain Names`, and click :guilabel:`DNS`. - :guilabel:`A`: the A record holds the IP address of the domain. It is automatically created and **cannot** be edited or deleted. @@ -87,8 +90,8 @@ Any modification to the DNS records can take up to **72 hours** to propagate wor servers. .. note:: - `Submit a support ticket `_ if you need assistance to manage your - domain name. + `Contact Odoo support `_ if you need assistance to manage your domain + name. Mailbox ------- @@ -103,9 +106,10 @@ You can create a subdomain (e.g., `subdomain.yourdomain.com`) to use as an alias database. It allows users to create records in the database from emails received on their `email@subdomain.yourdomain.com` alias. -To do so, open the `database manager `_, click the gear icon -(:guilabel:`⚙️`) next to the database name, and go to :menuselection:`Domain Names --> DNS --> Add -DNS record --> CNAME`. Next, enter the desired subdomain in the :guilabel:`Name` field (e.g., +To do so, open the `database manager `_, click the +:icon:`fa-gear` (:guilabel:`gear`) button next to the database name and select :icon:`fa-globe` +:guilabel:`Domain Names`. Click :guilabel:`DNS`, then :guilabel:`Add DNS record` and select +:guilabel:`CNAME`. Next, enter the desired subdomain in the :guilabel:`Name` field (e.g., `subdomain`), the original database domain with a period at the end (e.g., `mycompany.odoo.com.`) in the :guilabel:`Content` field, and click :guilabel:`Add record`. @@ -121,15 +125,82 @@ Use an external email provider ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To use an external email provider, you should configure an MX record. To do so, open the `database -manager `_, click the gear icon (:guilabel:`⚙️`) next to the -database name, click :menuselection:`Domain Names --> DNS --> Add DNS record --> MX`. The values you -should enter for the :guilabel:`Name`, :guilabel:`Content`, and :guilabel:`Priority` fields depend -on the external email provider. +manager `_, click the :icon:`fa-gear` (:guilabel:`gear`) button +next to the database name and select :icon:`fa-globe` :guilabel:`Domain Names`. Click +:guilabel:`DNS`, then :guilabel:`Add DNS record` and select :guilabel:`MX`. The values you should +enter for the :guilabel:`Name`, :guilabel:`Content`, and :guilabel:`Priority` fields depend on the +external email provider. .. seealso:: - `Google Workspace: MX record values `_ - `Outlook and Exchange Online: Add an MX record for email `_ +Google Workspace +**************** + +To use your free domain name on Gmail, register to `Google Workspace +`_. + +During the registration process, select :guilabel:`Set up using your existing domain` when asked to +:guilabel:`Choose a way to set up your account`, and enter your domain (e.g., `yourdomain.com`) when +asked :guilabel:`What's your business's domain name?`. + +Domain ownership verification +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +#. Sign in to Google Workspace. When asked to verify you own your domain, click :guilabel:`Switch to + manual verification`. + + .. image:: domain_names/workspace-verify-switch.png + :alt: Switching to manual domain verification on Google Workspace + +#. Select `gandi.net` as the :guilabel:`Domain host` and click :guilabel:`Continue`. + + .. image:: domain_names/workspace-verify-domain.png + :alt: Selecting the domain host on Google Workspace + +#. Copy the content of the :guilabel:`Value` field under :guilabel:`TXT record`. Leave the window + open. + + .. image:: domain_names/workspace-verify-code.png + :alt: Copying the TXT value on Google Workspace + +#. Open the `database manager `_, click the :icon:`fa-gear` + (:guilabel:`gear`) button next to the database name and select :icon:`fa-globe` :guilabel:`Domain + Names`. Click :guilabel:`DNS`, then :guilabel:`Add DNS record` and select :guilabel:`TXT`. + +#. Enter `@` in the :guilabel:`Name` field, paste the :guilabel:`Value` provided by Google in the + :guilabel:`Content` field, and click :guilabel:`Add record`. + + .. image:: domain_names/workspace-txt.png + :alt: Creating a TXT record to verify domain name ownership + +#. Go back to Google Workspace, tick the box at the bottom, and click :guilabel:`Confirm`. + +.. seealso:: + `Google Workspace Admin Help: Verify your domain with a TXT record + `_ + +Redirect emails to Gmail +^^^^^^^^^^^^^^^^^^^^^^^^ + +#. Open the `database manager `_, click the :icon:`fa-gear` + (:guilabel:`gear`) button next to the database name and select :icon:`fa-globe` :guilabel:`Domain + Names`. Click :guilabel:`DNS`, then :guilabel:`Add DNS record`, and select :guilabel:`MX`. + +#. Enter `@` in the :guilabel:`Name` field, `1` in the :guilabel:`Priority` field, + `smtp.google.com.` in the :guilabel:`Content` field, and click :guilabel:`Add record`. + + .. image:: domain_names/workspace-mx.png + :alt: Creating an MX record to redirect emails to Gmail + +#. Open the `Google Workspace Admin console `_, click + :guilabel:`Activate Gmail` for your domain, and follow the steps. + +.. seealso:: + `Google Workspace Admin Help: Set up MX records for Google Workspace + `_ + .. _domain-name/existing: Configure an existing domain name @@ -142,6 +213,7 @@ If you already have a domain name, you can use it for your Odoo website. certificate validation ` issues: #. :ref:`Add a CNAME record ` + #. :ref:`Redirect your naked domain name ` (optional, but recommended) #. :ref:`Map your domain name to your Odoo database ` #. :ref:`Map your domain name to your Odoo website ` @@ -176,26 +248,30 @@ The specific instructions depend on your DNS hosting service. - `Cloudflare: Manage DNS records `_ -.. important:: - Odoo only supports subdomains. To use your naked domain name :dfn:`(a domain name without any - subdomains or prefixes)` (`yourdomain.com`), create a redirection 301 to redirect visitors to - `www.yourdomain.com`. +.. _domain-name/naked: -.. example:: - You own the domain name `yourdomain.com`, and your Odoo Online database's address is - `mycompany.odoo.com`. You want to access your Odoo database primarily with the domain - `www.yourdomain.com` and also with the naked domain `yourdomain.com`. +Redirect a naked domain +----------------------- - To do so, create a CNAME record for the `www` subdomain, with `mycompany.odoo.com` as the target. - Next, create a redirect (301 permanent or visible redirect) to redirect visitors from - `yourdomain.com` to `wwww.yourdomain.com`. +.. note:: + Although optional, completing this step is advised. + +To let visitors use your naked domain name :dfn:`(a domain name without any subdomains or prefixes)` +(`yourdomain.com`), creating a 301 redirect :dfn:`(a permanent redirect from one URL to another)` +to `www.yourdomain.com` is required: + +- from `http://yourdomain.com` to `https://www.yourdomain.com`, and +- from `https://yourdomain.com` to `https://www.yourdomain.com`. + +The specific instructions depend on your DNS hosting service. However, not all of them offer to +redirect a naked domain with a secure HTTPS connection. If you encounter any issue, we recommend +:ref:`using Cloudflare `. + +.. _domain-name/naked/cloudflare: Using Cloudflare to secure and redirect a naked domain ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -To redirect a naked domain with a secure HTTPS connection, we recommend using Cloudflare, as most -DNS hosting services do not offer an easy way to do so. - #. `Sign up and log in to Cloudflare `_. #. Enter your domain name on `Cloudflare's dashboard `_ and select :guilabel:`Quick scan for DNS records`. @@ -266,16 +342,16 @@ Map a domain name to an Odoo database If you encounter this error after mapping the domain name to your database, wait up to five days, as the validation may still happen. If not, you can `submit a support ticket - `_, including screenshots of your CNAME records. + `_, including screenshots of your CNAME records. .. tabs:: .. group-tab:: Odoo Online - Open the `database manager `_, click the gear icon - (:guilabel:`⚙️`) next to the database name, and go to :menuselection:`Domain Names --> Use my - own domain`. Then, enter the domain name (e.g., `www.yourdomain.com`), click - :guilabel:`Verify` and :guilabel:`I confirm, it's done`. + Open the `database manager `_, click the :icon:`fa-gear` + (:guilabel:`gear`) button next to the database name, select :icon:`fa-globe` :guilabel:`Domain + Names`, and click :guilabel:`Use my own domain`. Then, enter the domain name (e.g., + `www.yourdomain.com`), click :guilabel:`Verify` and :guilabel:`I confirm, it's done`. .. image:: domain_names/map-database-online.png :alt: Mapping a domain name to an Odoo Online database @@ -374,3 +450,8 @@ the one you want to configure. In the :guilabel:`Domain` field, enter the addres :guilabel:`Company` under :menuselection:`Website --> Configuration --> Settings`. Doing so indicates Odoo which URL to use as the :ref:`base URL ` according to the company in use. + +.. tip:: + When migrating from an existing website, make sure to set up the necessary :ref:`redirects ` + before adding your domain name. For example, if a previous URL like `/path/about/something` + existed, redirect it to the new corresponding page on your Odoo website, such as `/something`. diff --git a/content/applications/websites/website/configuration/domain_names/workspace-mx.png b/content/applications/websites/website/configuration/domain_names/workspace-mx.png new file mode 100644 index 0000000000..ef62dc02b2 Binary files /dev/null and b/content/applications/websites/website/configuration/domain_names/workspace-mx.png differ diff --git a/content/applications/websites/website/configuration/domain_names/workspace-txt.png b/content/applications/websites/website/configuration/domain_names/workspace-txt.png new file mode 100644 index 0000000000..f3403ef299 Binary files /dev/null and b/content/applications/websites/website/configuration/domain_names/workspace-txt.png differ diff --git a/content/applications/websites/website/configuration/domain_names/workspace-verify-code.png b/content/applications/websites/website/configuration/domain_names/workspace-verify-code.png new file mode 100644 index 0000000000..7ac621cbf2 Binary files /dev/null and b/content/applications/websites/website/configuration/domain_names/workspace-verify-code.png differ diff --git a/content/applications/websites/website/configuration/domain_names/workspace-verify-domain.png b/content/applications/websites/website/configuration/domain_names/workspace-verify-domain.png new file mode 100644 index 0000000000..5317082fa3 Binary files /dev/null and b/content/applications/websites/website/configuration/domain_names/workspace-verify-domain.png differ diff --git a/content/applications/websites/website/configuration/domain_names/workspace-verify-switch.png b/content/applications/websites/website/configuration/domain_names/workspace-verify-switch.png new file mode 100644 index 0000000000..df65af7a67 Binary files /dev/null and b/content/applications/websites/website/configuration/domain_names/workspace-verify-switch.png differ diff --git a/content/applications/websites/website/configuration/google_search_console.rst b/content/applications/websites/website/configuration/google_search_console.rst index b6ca17fbc8..a770528280 100644 --- a/content/applications/websites/website/configuration/google_search_console.rst +++ b/content/applications/websites/website/configuration/google_search_console.rst @@ -39,7 +39,7 @@ This type of verification is usually simpler as you have multiple verification m using your existing Google Analytics or Tag Manager account. It also makes sense to view a section of your website separately. For example, if you work with a consultant on a specific part of your website, you might want to verify this part separately to limit access to your data. Enter the URL, -e.g., `https://www.example.odoo.com` and click :guilabel:`Continue`. +e.g., `https://example.odoo.com/` and click :guilabel:`Continue`. Site ownership verification @@ -63,7 +63,8 @@ Five methods are available to do this: .. note:: The best method for you depends on your comfort level and technical expertise. For beginners, using a file upload or HTML tag might be easiest. Those options are convenient if you already use - Google Analytics or Tag Manager. You need to access your domain registrar's settings for domain + :ref:`Google Analytics ` or :ref:`Google Tag Manager + `. You need to access your domain registrar's settings for domain verification. .. _GSC-HTML-file-upload: @@ -95,5 +96,29 @@ have to put in your Odoo's Website Settings. Google verifies ownership by checki #. In Google Search Console, click :guilabel:`Verify`. If you perform the steps above correctly, verification should be done immediately. +.. _website/google_search_console/HTML-tag: + +HTML tag +-------- + +This method involves copying a meta tag provided by Google and pasting it into your Odoo website. +To verify your site ownership using an HTML tag, follow these instructions: + +#. Expand the HTML tag section. + + .. image:: google_search_console/gsc-html-tag.png + :alt: Open HTML tag section. + +#. :guilabel:`Copy` the HTML tag to clipboard. +#. On your Odoo website, click :guilabel:`Edit` in the upper-right corner, go to + the :guilabel:`Theme` tab, scroll down to the :guilabel:`Advanced` section, then + click :guilabel:` and ` next to :guilabel:`Code Injection`. + Paste the copied tag into the first field (:guilabel:``), and click :guilabel:`Save`. + + .. image:: google_search_console/gsc-paste-tag.png + :alt: Paste tag in head field. + +#. Return to :abbr:`GSC (Google Search Console)` and click :guilabel:`Verify`. + .. seealso:: :doc:`domain_names` diff --git a/content/applications/websites/website/configuration/google_search_console/add-domain-or-url-prefix.png b/content/applications/websites/website/configuration/google_search_console/add-domain-or-url-prefix.png index 42d2891a04..6d42112356 100644 Binary files a/content/applications/websites/website/configuration/google_search_console/add-domain-or-url-prefix.png and b/content/applications/websites/website/configuration/google_search_console/add-domain-or-url-prefix.png differ diff --git a/content/applications/websites/website/configuration/google_search_console/gsc-html-tag.png b/content/applications/websites/website/configuration/google_search_console/gsc-html-tag.png new file mode 100644 index 0000000000..a1ef8f2ad8 Binary files /dev/null and b/content/applications/websites/website/configuration/google_search_console/gsc-html-tag.png differ diff --git a/content/applications/websites/website/configuration/google_search_console/gsc-paste-tag.png b/content/applications/websites/website/configuration/google_search_console/gsc-paste-tag.png new file mode 100644 index 0000000000..3c43881099 Binary files /dev/null and b/content/applications/websites/website/configuration/google_search_console/gsc-paste-tag.png differ diff --git a/content/applications/websites/website/configuration/google_search_console/html-file-download.png b/content/applications/websites/website/configuration/google_search_console/html-file-download.png index d706f453df..b5ff3f3174 100644 Binary files a/content/applications/websites/website/configuration/google_search_console/html-file-download.png and b/content/applications/websites/website/configuration/google_search_console/html-file-download.png differ diff --git a/content/applications/websites/website/configuration/multi_website.rst b/content/applications/websites/website/configuration/multi_website.rst index 7ca9065cfe..1189b1e05c 100644 --- a/content/applications/websites/website/configuration/multi_website.rst +++ b/content/applications/websites/website/configuration/multi_website.rst @@ -9,14 +9,14 @@ help avoid confusion and make it easier to tailor your digital outreach strategi target audience. Each website can be designed and configured independently with its own :doc:`domain name -`, :doc:`theme <../web_design/themes>`, :doc:`pages <../pages>`, :doc:`menus -<../pages/menus>`, :doc:`languages `, :doc:`products +`, :doc:`theme <../web_design/themes>`, :doc:`pages <../structure/pages>`, :doc:`menus +<../structure/header_footer>`, :doc:`languages `, :doc:`products <../../ecommerce/products>`, assigned sales team, etc. They can also :ref:`share content and pages `. .. tip:: Duplicate content (i.e., pages and content shared between multiple websites) can have a negative - impact on :doc:`../pages/seo`. + impact on :doc:`../structure/seo`. Website creation ================ diff --git a/content/applications/websites/website/configuration/spam_protection.rst b/content/applications/websites/website/configuration/spam_protection.rst index b69c675c9f..15a18074d5 100644 --- a/content/applications/websites/website/configuration/spam_protection.rst +++ b/content/applications/websites/website/configuration/spam_protection.rst @@ -3,8 +3,9 @@ Forms spam protection ===================== :ref:`Cloudflare Turnstile ` and :ref:`Google reCAPTCHA v3 ` -protect website forms against spam and abuse. They attempt to distinguish between human and bot -submissions using non-interactive challenges based on telemetry and visitor behavior. +protect website forms, web sign-up pages, and password reset pages against spam and abuse. They +attempt to distinguish between human and bot submissions using non-interactive challenges based on +telemetry and visitor behavior. .. important:: We recommend using **Cloudflare Turnstile** as reCAPTCHA v3 may not be compliant with local data @@ -13,7 +14,7 @@ submissions using non-interactive challenges based on telemetry and visitor beha .. note:: All pages using the :guilabel:`Form`, :guilabel:`Newsletter Block`, :guilabel:`Newsletter Popup` snippets, and the eCommerce :guilabel:`Extra Step During Checkout` form are protected by both - tools. + tools. **Web sign-up pages** and **password reset pages** are also protected. .. seealso:: - `Cloudflare Turnstile's documentation `_ diff --git a/content/applications/websites/website/pages.rst b/content/applications/websites/website/pages.rst deleted file mode 100644 index 87348f548f..0000000000 --- a/content/applications/websites/website/pages.rst +++ /dev/null @@ -1,199 +0,0 @@ -:show-content: - -===== -Pages -===== - -Odoo allows you to create pages for your website and customize their content and appearance to your -needs. - -.. _website/page_type: - -**Static** pages have stable content, such as the homepage. You can manually create new ones, define -their URLs, adapt their :ref:`properties `, etc. **Dynamic** pages, on the -other hand, are generated dynamically. All pages generated automatically by Odoo, for example, when -you install an app or module (e.g., `/shop` or `/blog`) or publish a new product or blog post, are -dynamic pages and are therefore managed differently. - -Page creation -============= - -Website pages can be created from the **frontend** and the **backend**. To create a new website -page, proceed as follows: - - #. - Either open the **Website** app, click :guilabel:`+ New` in the top-right corner, then select - :guilabel:`Page`; - - Or go to :menuselection:`Website --> Site --> Pages` and click :guilabel:`New`. - #. Enter a :guilabel:`Page Title`; this title is used in the menu and the page's URL. - #. Click :guilabel:`Create`. - #. Customize the page's content and appearance using the website builder, then click - :guilabel:`Save`. - #. :ref:`Publish ` the page. - -.. note:: - Disable :guilabel:`Add to menu` if the page should not appear in the menu. - -Page management -=============== - -.. _website/un-publish-page: - -Publishing/unpublishing pages ------------------------------ - -Pages need to be published to make them accessible to website visitors. To publish or unpublish a -page, access it and toggle the switch in the upper-right corner from :guilabel:`Unpublished` -to :guilabel:`Published`, or vice versa. - -.. image:: pages/un-published_toggle.png - :alt: Unpublished/Published toggle - -.. note:: - It is also possible to: - - - publish/unpublish a page from the :ref:`page properties `, where you - can define a publishing date and/or restrict the page's visibility if needed; - - publish/unpublish several pages at once: go to :menuselection:`Website --> Site --> Pages`, - select the pages, then click :guilabel:`Action` and select :guilabel:`Publish` or - :guilabel:`Unpublish`. - -Homepage --------- - -When you create a website, Odoo creates a dedicated :guilabel:`Home` page by default, but you can -define any website page as your homepage. To do so, go to :menuselection:`Website --> Configuration ---> Settings`, then, in the :guilabel:`Website info` section, define the URL of the desired page in -the field :guilabel:`Homepage URL` (e.g., `/shop`). - -Alternatively, you can define any :ref:`static page ` as your homepage by going -to :menuselection:`Website --> Site --> Properties`. Select the :guilabel:`Publish` tab and enable -:guilabel:`Use as Homepage`. - -.. _website/page_properties: - -Page properties ---------------- - -To modify a :ref:`static page's ` properties, access the page you wish to -modify, then go to :menuselection:`Site --> Properties`. - -The :guilabel:`Name` tab allows you to: - -- rename the page using the :guilabel:`Page Name` field; -- modify the :guilabel:`Page URL`. In this case, you can redirect the old URL to the new one if - needed. To do so, enable :guilabel:`Redirect Old URL`, then select the :guilabel:`Type` of - :ref:`redirection `: - - - :guilabel:`301 Moved permanently`: to redirect the page permanently; - - :guilabel:`302 Moved temporarily`: to redirect the page temporarily. - - .. image:: pages/page-redirection.png - :alt: Redirect old URL - -You can further adapt the page's properties in the :guilabel:`Publish` tab: - -- :guilabel:`Show in Top Menu`: Disable if you don't want the page to appear in the menu; -- :guilabel:`Use as Homepage`: Enable if you want the page to be the homepage of your website; -- :guilabel:`Indexed`: Disable if you don't want the page to be shown in search engine results; -- :guilabel:`Published`: Enable to publish the page; -- :guilabel:`Publishing Date`: To publish the page at a specific moment, select the date, - click the clock icon to set the time, then click the green check mark to validate your selection. -- :guilabel:`Visibility`: Select who can access the page: - - - :guilabel:`All` - - :guilabel:`Signed In` - - :guilabel:`Restricted Group`: Select the :doc:`user access group(s) - ` in the :guilabel:`Authorized group` field. - - :guilabel:`With Password`: Enter the password in the :guilabel:`Password` field. - -.. tip:: - *Some* of these properties can also be modified from :menuselection:`Website --> Site --> Pages`. - -Duplicating pages -~~~~~~~~~~~~~~~~~ - -To duplicate a page, access the page, then go to :menuselection:`Site --> Properties` and click -:guilabel:`Duplicate Page`. Enter a :guilabel:`Page Name`, then click :guilabel:`OK`. By default, -the new page is added after the duplicated page in the menu, but you can remove it from the menu or -change its position using the :doc:`menu editor `. - -.. _website/delete-page: - -Deleting pages -~~~~~~~~~~~~~~ - -To delete a page, proceed as follows: - -#. Access the page, then go to :menuselection:`Site --> Properties` and click :guilabel:`Delete - Page`. -#. A pop-up window appears on the screen with all links referring to the page you want to delete, - organized by category. To ensure website visitors don't land on a 404 error page, you must update - all the links on your website referring to the page. To do so, expand a category, then click on a - link to open it in a new window. Alternatively, you can set up a :ref:`redirection - ` for the deleted page. -#. Once you have updated the links (or set up a :ref:`redirection `), - select the :guilabel:`I am sure about this` check box, then click :guilabel:`OK`. - -.. _website/URL-redirection: - -URL redirect mapping --------------------- - -URL redirect mapping consists in sending visitors and search engines to a URL different from -the one they initially requested. This technique is used, for example, to prevent broken links when -you :ref:`delete a page `, :ref:`modify its URL `, or -migrate your site from another platform to an Odoo :doc:`domain `. It -can also be used to improve :doc:`pages/seo`. - -To access existing URL redirections and create new ones, :doc:`activate the developer mode -` and go to :menuselection:`Website --> Configuration --> -Redirects`. - -.. note:: - - A redirect record is added automatically every time you :ref:`modify a page's URL - ` and enable :guilabel:`Redirect Old URL`. - - You can set up redirections for :ref:`static and dynamic pages `. - -To create a new redirection, click the :guilabel:`New` button, then fill in the fields: - -- :guilabel:`Name`: Enter a name to identify the redirect. -- :guilabel:`Action`: Select the type of redirection: - - - :guilabel:`404 Not found`: visitors are redirected to a 404 error page when they try to access - an unpublished or deleted page. - - :guilabel:`301 Moved Permanently`: for permanent redirections of unpublished or deleted - :ref:`static pages `. The new URL is shown in search engine results, and the - redirect is cached by browsers. - - :guilabel:`302 Moved Temporarily`: for short-term redirections, for example, if you are - redesigning or updating a page. The new URL is neither cached by browsers nor shown in search - engine results. - - :guilabel:`308 Redirect/Rewrite`: for permanent redirections of existing :ref:`dynamic pages - `. The URL is renamed; the new name is shown in search engine results and is - cached by browsers. Use this redirect type to rename a dynamic page, for example, if you wish - to rename `/shop` into `/market`. - -- :guilabel:`URL from`: Enter the URL to be redirected (e.g., `/about-the-company`) or search for - the desired :ref:`dynamic page ` and select it from the list. -- :guilabel:`URL to`: For 301, 302, and 308 redirects, enter the URL to be redirected to. If you want - to redirect to an external URL, include the protocol (e.g., `https://`). -- :guilabel:`Website`: Select a specific website. -- :guilabel:`Sequence`: To define the order in which redirections are performed, e.g., in the case - of redirect chains (i.e., a series of redirects where one URL is redirected to another one, which - is itself further redirected to another URL). - -Toggle the :guilabel:`Activate` switch to deactivate the redirection. - -.. important:: - 404, 301, and 302 redirections are meant to migrate traffic from - :ref:`unpublished ` or :ref:`deleted ` pages - to *new* pages, while the 308 redirect is used for *permanent* redirections of *existing* pages. - -.. seealso:: - - `Google documentation on redirects and search `_ - - :doc:`pages/seo` - -.. toctree:: - :titlesonly: - - pages/menus - pages/seo diff --git a/content/applications/websites/website/pages/menus.rst b/content/applications/websites/website/pages/menus.rst deleted file mode 100644 index f2ef6bb42e..0000000000 --- a/content/applications/websites/website/pages/menus.rst +++ /dev/null @@ -1,96 +0,0 @@ -===== -Menus -===== - -Menus are used to organize your website’s content and help visitors navigate through your web pages -effectively. User-friendly and well-structured website menus also play a crucial role in improving -:doc:`search engine rankings `. - -Odoo allows you to customize the content and appearance of your website's menu to your needs. - -Menu editor -=========== - -The menu editor allows you to edit your website's menu and add :ref:`regular menu items -` and :ref:`mega menus `. - -To edit your website's menu, go to :menuselection:`Website --> Site --> Menu Editor`. From there, -you can: - -- **rename** a menu item or change its URL using the :guilabel:`Edit Menu Item` icon; -- **delete** a menu item using the :guilabel:`Delete Menu Item` icon; -- **move** a menu item by dragging and dropping it to the desired place in the menu; -- **create a regular drop-down menu** by dragging and dropping the sub-menu items to the right, - underneath their parent menu. - -.. image:: menus/menu-editor.png - :alt: Menu editor with sub-menus - -.. note:: - - You can also access the menu editor by clicking :guilabel:`Edit`, selecting any menu item and - clicking the :guilabel:`Edit Menu` icon. - - .. image:: menus/edit-menu-icon.png - :alt: Access the Menu editor while in Edit mode. - -.. _website/regular-menus: - -Adding regular menu items -------------------------- - -By default, pages are added to the menu as regular menu items when :doc:`they are created -<../pages>`. You can also add regular menu items from the menu editor by clicking :guilabel:`Add -Menu Item`. Enter the :guilabel:`Name` and URL of the related page in the pop-up window that appears -on the screen and click :guilabel:`OK`. - -.. tip:: - In the :guilabel:`URL or Email` field, you can type `/` to search for a page on your website or - `#` to search for an existing custom anchor. - -.. _website/mega-menus: - -Adding mega menus ------------------ - -Mega menus are similar to drop-down menus, but instead of a simple list of sub-menus, they display a -panel divided into groups of navigation options. This makes them suitable for websites with large -amounts of content, as they can help include all of your web pages in the menu while still making -all menu items visible at once. Mega menus can also be structured more visually than regular -drop-down menus, for example, through layout, typography, and icons. - -.. image:: menus/mega-menu.png - :alt: Mega menu in the navigation bar. - -To create a mega menu, go to :menuselection:`Website --> Site --> Menu Editor` and click -:guilabel:`Add Mega Menu Item`. Enter the :guilabel:`Name` of the mega menu in the pop-up, click -:guilabel:`OK`, then :guilabel:`Save`. - -To adapt the options and layout of the mega menu, click it in the navigation bar, then click -:guilabel:`Edit`. Mega menus are composed of building blocks, which means you can customize each -component individually using inline formatting, as well as the options available in the -:guilabel:`Customize` tab in the website builder. For example, you can: - -- edit the text directly in the building block; -- edit a menu item's URL by selecting the menu item, then clicking the :guilabel:`Edit link` button - in the small preview pop-up. Type `/` to search for a page on your website, or `#` to search for - an existing custom anchor. - - .. image:: menus/mega-menu-option.png - :alt: Edit a mega menu option. - -- move a menu item by dragging and dropping the related block to the desired position in the mega - menu; -- delete a menu item by deleting the related block. - -.. tip:: - You can adapt the general layout of the mega menu by selecting the desired :guilabel:`Template` - and :guilabel:`Size` in the :guilabel:`Mega menu` section in the :guilabel:`Customize` tab in the - website builder. - -Header and navigation bar appearance -==================================== - -To customize the appearance of your website's menu, click :guilabel:`Edit`, then select the -navigation bar or any menu item. You can then adapt the fields in the :guilabel:`Header` and -:guilabel:`Navbar` sections in the :guilabel:`Customize` tab in the website builder. diff --git a/content/applications/websites/website/pages/menus/mega-menu.png b/content/applications/websites/website/pages/menus/mega-menu.png deleted file mode 100644 index 5d93674c53..0000000000 Binary files a/content/applications/websites/website/pages/menus/mega-menu.png and /dev/null differ diff --git a/content/applications/websites/website/pages/page-redirection.png b/content/applications/websites/website/pages/page-redirection.png deleted file mode 100644 index e5fbb3a5cc..0000000000 Binary files a/content/applications/websites/website/pages/page-redirection.png and /dev/null differ diff --git a/content/applications/websites/website/pages/un-published_toggle.png b/content/applications/websites/website/pages/un-published_toggle.png deleted file mode 100644 index 54ac8673ca..0000000000 Binary files a/content/applications/websites/website/pages/un-published_toggle.png and /dev/null differ diff --git a/content/applications/websites/website/reporting/analytics.rst b/content/applications/websites/website/reporting/analytics.rst index 72f275fcc5..4ad4db87b7 100644 --- a/content/applications/websites/website/reporting/analytics.rst +++ b/content/applications/websites/website/reporting/analytics.rst @@ -18,47 +18,58 @@ Plausible.io ============ Odoo hosts its own Plausible.io server and provides a free and ready-to-use Plausible.io -solution for **Odoo Online** databases. Odoo automatically creates and sets up your account. Start using it -by going to :menuselection:`Website --> Reporting --> Analytics`. +solution for **Odoo Online** databases that use the odoo.com domain. Odoo automatically creates and +sets up your account. Start using it by going to :menuselection:`Website --> Reporting --> +Analytics`. .. note:: - **If you already have a Plausible.io account** and you want to connect it to your Odoo Online - database, you must create two `ir.config.parameters` to use Plausible.io's servers. To do so, - enable the :ref:`developer mode ` and go to :menuselection:`General Settings --> - Technical --> System Parameters`. Click :guilabel:`New` and fill in the following :guilabel:`Key` - and :guilabel:`Value` fields: - - .. list-table:: - :header-rows: 1 - - * - Key - - Value - * - `website.plausible_script` - - `https://plausible.io/js/plausible.js` - * - `website.plausible_server` - - `https://plausible.io` + - If you use a custom :doc:`domain name <../configuration/domain_names>` (e.g., `example.com`), + you need to create your own Plausible.io account and subscription. + - **If you already have a Plausible.io account** and you want to connect it to your Odoo Online + database, you must create two `ir.config.parameters` to use Plausible.io's servers. To do so, + enable the :ref:`developer mode ` and go to :menuselection:`General Settings --> + Technical --> System Parameters`. Click :guilabel:`New` and fill in the following + :guilabel:`Key` and :guilabel:`Value` fields: + + .. list-table:: + :header-rows: 1 + + * - Key + - Value + * - `website.plausible_script` + - `https://plausible.io/js/plausible.js` + * - `website.plausible_server` + - `https://plausible.io` Then, follow the steps below to connect your existing account with Plausible.io servers. + .. warning:: + Deactivating the free Plausible.io account linked to your **Odoo Online** database + will also remove the existing keys. As a result, new keys will be generated, while all + historical data will remain associated with the old keys. If you plan to deactivate the + account, it is recommended to save the existing keys to preserve access to that data. + If your database is hosted on **Odoo.sh** or **On-premise**, or if you wish to use your own Plausible.io account, proceed as follows: #. Create or sign in to a Plausible.io account using the following link: ``_. -#. If you are creating a new account, go through the registration and activation steps. On the :guilabel:`Add website - info` page, add the :guilabel:`Domain` of your website without including `www` (e.g., - `example.odoo.com`) and change the :guilabel:`Reporting Timezone`, if necessary. Click - :guilabel:`Install Plausible` to proceed to the next step. Ignore the :guilabel:`Manual installation` - instructions and click :guilabel:`Start collecting data`. +#. If you are creating a new account, go through the registration and activation steps. + On the :guilabel:`Add website info` page, add the :guilabel:`Domain` of your website without + including `www` (e.g., `example.odoo.com`) and change the :guilabel:`Reporting Timezone`, + if necessary. Click :guilabel:`Install Plausible` to proceed to the next step. Ignore the + :guilabel:`Manual installation` instructions and click :guilabel:`Start collecting data`. #. Once done, click the Plausible.io logo in the upper-left part of the page to access your `list of - websites `_, then click the :icon:`fa-ellipsis-v` (:guilabel:`ellipsis`) icon next to the - website and select :icon:`fa-cog` :guilabel:`Settings` from the drop-down menu. + websites `_, then click the :icon:`fa-ellipsis-v` + (:guilabel:`ellipsis`) icon next to the website and select :icon:`fa-cog` :guilabel:`Settings` + from the drop-down menu. .. image:: analytics/plausible-gear-icon-settings.png :alt: Click the gear icon in the list of websites. #. In the sidebar, select :guilabel:`Visibility`, then click :guilabel:`Add Shared link`. -#. Enter a :guilabel:`Name`, leave the :guilabel:`Password (optional)` field empty, as the Plausible analytics - dashboard integration in Odoo does not support it, then click :guilabel:`Create shared link`. +#. Enter a :guilabel:`Name`, leave the :guilabel:`Password (optional)` field empty, as the Plausible + analytics dashboard integration in Odoo does not support it, then click :guilabel:`Create + shared link`. #. Copy the shared link. @@ -73,7 +84,8 @@ Plausible.io account, proceed as follows: If you have :doc:`multiple websites <../configuration/multi_website>`, add your websites to your Plausible.io account by going to ``_ and clicking :guilabel:`+ Add Website`. In Odoo, in the **Website settings**, make sure to select the website in the - :guilabel:`Settings of Website` field at the top of the page before pasting the :guilabel:`Shared link`. + :guilabel:`Settings of Website` field at the top of the page before pasting the + :guilabel:`Shared link`. .. note:: Odoo automatically pushes two custom goals: `Lead Generation` and `Shop`. @@ -91,9 +103,9 @@ To follow your Odoo website's traffic with Google Analytics: #. Create or sign in to a Google account using the following link: ``_. #. - If you are setting up Google Analytics for the first time, click :guilabel:`Start measuring` and go through the account creation step. - - If you already have a Google Analytics account, sign in and click the :icon:`fa-cog` icon in the - bottom-left corner of the page to access the **Admin** page. Then, click :guilabel:`+ Create` and select - :guilabel:`Property` from the drop-down menu. + - If you already have a Google Analytics account, sign in and click the :icon:`fa-cog` icon + in the bottom-left corner of the page to access the **Admin** page. Then, click + :guilabel:`+ Create` and select :guilabel:`Property` from the drop-down menu. #. Complete the next steps: `property creation `_, business details and business objectives. @@ -117,7 +129,8 @@ To follow your Odoo website's traffic with Google Analytics: If you have :doc:`multiple websites <../configuration/multi_website>` with separate domains, it is recommended to create `one property `_ per domain. In Odoo, in the **Website settings**, make sure to select the website in the - :guilabel:`Settings of Website` field at the top of the page before pasting the :guilabel:`Measurement ID`. + :guilabel:`Settings of Website` field at the top of the page before pasting the + :guilabel:`Measurement ID`. .. seealso:: `Google documentation on setting up Analytics for a website @@ -134,8 +147,8 @@ app, directly through the code injector. .. note:: :abbr:`GTM (Google Tag Manager)` is not an analytics tool and does not offer reporting features; - it is used to collect data and works alongside Google Analytics to provide more detailed insights. - In order to use GTM properly, it is recommended to configure Google Analytics as well. + it is used to collect data and works alongside Google Analytics to provide more detailed + insights. In order to use GTM properly, it is recommended to configure Google Analytics as well. For more information refer to the `documentation on linking Google Analytics and Google Tag Manager `_. diff --git a/content/applications/websites/website/reporting/link_tracker.rst b/content/applications/websites/website/reporting/link_tracker.rst index cd4316c605..9fa1e0ac3e 100644 --- a/content/applications/websites/website/reporting/link_tracker.rst +++ b/content/applications/websites/website/reporting/link_tracker.rst @@ -38,20 +38,9 @@ Fill in the following information and click :guilabel:`Get tracked link` to gene The :guilabel:`Campaign`, :guilabel:`Medium`, and :guilabel:`Source` are called :abbr:`UTM (Urchin Tracking Module)` parameters. They are incorporated in the tracked URL. -Website visibility ------------------- - -You can use the :abbr:`UTM (Urchin Tracking Module)` parameters to hide or show building blocks for -specific audiences. To achieve this, click the :guilabel:`Edit` button on your website, select a -building block, go to the :guilabel:`Customize` tab, scroll down to :guilabel:`Visibility`, and -click :guilabel:`Conditionally`. - -.. image:: link_tracker/conditional-visibility.png - :alt: Use the conditional visibility to display site elements to specific audiences. - -For each parameter available in the :ref:`Visibility ` section, you can -choose :guilabel:`Visible for` or :guilabel:`Hidden for` and select the record you want from the -dropdown list. + .. tip:: + You can customize the :ref:`visibility ` of building blocks + using the :abbr:`UTM (Urchin Tracking Module)` parameters, amongst other conditions. Tracked links overview ====================== diff --git a/content/applications/websites/website/structure.rst b/content/applications/websites/website/structure.rst new file mode 100644 index 0000000000..df0e491d28 --- /dev/null +++ b/content/applications/websites/website/structure.rst @@ -0,0 +1,44 @@ +:nosearch: +:show-content: +:hide-page-toc: + +========= +Structure +========= + +Structure your website using :doc:`pages <../website/structure/pages>`, provide consistent visual +and navigational framework with :doc:`headers and footers <../website/structure/header_footer>` and +optimize your online presence with :doc:`Search Engine Optimization (SEO) <../website/structure/seo>`. + +.. cards:: + + .. card:: Pages + :target: structure/pages + :large: + + Create pages for your website and customize their content and appearance to your needs. + + .. card:: Headers and footers + :target: structure/header_footer + :large: + + Create a consistent look and feel for your website by customizing the header and footer, and + help users navigate through web pages effectively by providing clear menus, links, and calls + to action. + + + .. card:: Search Engine Optimization (SEO) + :target: structure/seo + :large: + + Improve your website’s visibility and ranking in search engine results. + +.. seealso:: + `Odoo Tutorials: Website `_ + +.. toctree:: + :titlesonly: + + structure/pages + structure/header_footer + structure/seo diff --git a/content/applications/websites/website/structure/header_footer.rst b/content/applications/websites/website/structure/header_footer.rst new file mode 100644 index 0000000000..58c6db1fc7 --- /dev/null +++ b/content/applications/websites/website/structure/header_footer.rst @@ -0,0 +1,169 @@ +=================== +Headers and footers +=================== + +The website header is the top section of a web page and usually contains elements such as the logo, +the :ref:`menu `, the search bar, the sign-in/customer account +button, etc. The footer is displayed at the bottom of a web page and usually contains information +such as contact details, links, legal notices, and other options. + +Header design +============= + +To modify the header's design, click on :guilabel:`Edit`, then click on the header. The following +options are available in the :guilabel:`Header` section of the :guilabel:`Customize` tab in the +website editor: + +- Choose a :guilabel:`Template` from the drop-down menu. +- Select :guilabel:`Background` settings to change the color palette through different + :ref:`Theme styles `, :guilabel:`Custom` color options, and + :guilabel:`Gradient` ones. +- When adding a :guilabel:`Border` to the header, its size, style, and color can be defined. +- Adapt :guilabel:`Round corners` to fit the design. +- Add a :guilabel:`Shadow` and define its :guilabel:`Color`, :guilabel:`Offset`, :guilabel:`Blur`, + and :guilabel:`Spread`. +- Add a :guilabel:`Scroll Effect`. Hover on an effect to preview it. +- Choose the :guilabel:`Header Position` between :guilabel:`Regular`, :guilabel:`Hidden`, and + :guilabel:`Over The Content`. When :guilabel:`Over The Content` is selected, you can customize + the :guilabel:`Background` and :guilabel:`Text Color`. +- Show or hide :guilabel:`Elements` such as text, the search bar, :guilabel:`Sign in` button, social + media links, :guilabel:`Contact us` button, and logo. + +To finalize changes, click on :guilabel:`Save`. + +.. tip:: + To hide the header, click on :guilabel:`Edit`, click on the header, and go to the + :guilabel:`Theme` tab of the website editor. Scroll down to the :guilabel:`Advanced` section and + toggle the :guilabel:`Show Header` switch to hide/show the header. + +.. _website/header_footer/header-content: + +Header content +============== + +Menus organize the header’s content and help users navigate through web pages effectively. +User-friendly and well-structured menus also play a crucial role in improving +:doc:`search engine rankings `. + +.. _website/header_footer/menu-editor: + +Menu editor +----------- + +The menu editor allows to edit the website's header and add +:ref:`menu items ` and +:ref:`mega menus `. + +To edit the header's content, go to :menuselection:`Website --> Site --> Menu Editor`. From there, +you can: + +- **rename** a menu item or change its URL using the :guilabel:`Edit Menu Item` icon; +- **delete** a menu item using the :guilabel:`Delete Menu Item` icon; +- **move** a menu item by dragging and dropping it to the desired place in the menu; +- **create a regular drop-down menu** by dragging and dropping the sub-menu items to the right, + underneath their parent menu. + +.. image:: header_footer/menu-editor.png + :alt: Menu editor with sub-menus + +.. note:: + You can also access the menu editor by clicking :guilabel:`Edit`, selecting any menu item, and + clicking the :guilabel:`Edit Menu` icon. + + .. image:: header_footer/edit-menu-icon.png + :alt: Access the Menu editor while in Edit mode. + +.. _website/header_footer/menu-items: + +Adding menu items +----------------- + +By default, pages are added to the menu as drop-down menu items when +:doc:`they are created <../structure/pages>`. To add a new menu item, follow these steps: + +#. Go to :menuselection:`Website --> Site --> Menu Editor`. +#. In the menu editor, click :guilabel:`Add Menu Item`. +#. In the pop-up window, enter the :guilabel:`Name` to be displayed in the menu. +#. Type `/` in the :guilabel:`URL or Email` field to search for a page on your website or `#` to + search for an existing custom anchor. +#. Click :guilabel:`OK`. +#. Edit the :ref:`menu structure ` if needed, then + :guilabel:`Save`. + +Menu item design +~~~~~~~~~~~~~~~~ + +To modify the menu items, click on :guilabel:`Edit`, click on a menu item, then go to the +:guilabel:`Navbar` section of the website editor. The following options are available: + +- Adapt the :guilabel:`Mobile Alignment`. +- Choose the :guilabel:`Font` for the menu items. +- Change the font size, color, and alignment in the :guilabel:`Format` field. +- Select a :guilabel:`Links Style` to highlight the current page in the menu. +- Change the :ref:`style of the header buttons `. +- Choose to display the :guilabel:`Sub Menus` :guilabel:`On Hover` or :guilabel:`On Click`. + +.. note:: + The fields available in the :guilabel:`Navbar` section can vary depending on the chosen template. + +To finalize changes, click on :guilabel:`Save`. + +.. _website/header_footer/mega-menus: + +Mega menus +---------- + +Mega menus are similar to drop-down menus, but instead of a simple list of sub-menus, they display a +panel divided into groups of navigation options. This makes them suitable for websites with large +amounts of content or :doc:`e-commerce websites <../../ecommerce>`, as they can help include all of +your web pages or :doc:`e-commerce categories <../../ecommerce/products/catalog>` in the menu while +still making all menu items visible at once. + +.. image:: header_footer/mega-menu.png + :alt: Mega menu in the navigation bar. + +To create a mega menu, go to :menuselection:`Website --> Site --> Menu Editor` and click +:guilabel:`Add Mega Menu Item`. Enter the :guilabel:`Name` of the mega menu in the pop-up, click +:guilabel:`OK`, then :guilabel:`Save`. + +To adapt the options and content of the mega menu, click on a mega menu item in the header, then +click :guilabel:`Edit`. Mega menus are composed of building blocks, which means you can customize +each component individually. For example: + +- Edit the text directly in the building block. +- Edit a menu item's URL by selecting the menu item and clicking the :guilabel:`Edit link` button + in the small preview pop-up. Type `/` to search for a page on your website, or `#` to search for + an existing custom anchor. + + .. image:: header_footer/mega-menu-option.png + :alt: Edit a mega menu option. + +- Move a menu item by dragging and dropping the related block to the desired position in the mega + menu. +- Delete a menu item by deleting the related block. + +To adapt the general layout of the mega menu, go to the :guilabel:`Customize` tab of the website +editor, then, in the :guilabel:`Mega Menu` section: + +- Choose a :guilabel:`Template`. +- Pick the :guilabel:`Size`: either :guilabel:`Full-Width` or :guilabel:`Narrow`. + +To finalize changes, click on :guilabel:`Save`. + +Footer design +============= + +To modify the footer, click on :guilabel:`Edit`, click on the footer, and in the :guilabel:`Footer` +section of the :guilabel:`Customize` tab in the website editor: + +- Select a :guilabel:`Template`. +- Choose its :guilabel:`Colors`. +- Choose a :guilabel:`Slideout Effect`: :guilabel:`Regular` (i.e., no effect), + :guilabel:`Slide Hover`, or :guilabel:`Shadow`. +- Toggle the :guilabel:`Copyright` switch to hide or show the copyright. +- Choose the :guilabel:`Border` size. +- Add a :guilabel:`Shadow`. +- Add a :guilabel:`Scroll Top Button` and choose its position. +- Hide or show the footer by toggling the :guilabel:`Page visibility` switch. + +To finalize changes, click on :guilabel:`Save`. diff --git a/content/applications/websites/website/pages/menus/edit-menu-icon.png b/content/applications/websites/website/structure/header_footer/edit-menu-icon.png similarity index 100% rename from content/applications/websites/website/pages/menus/edit-menu-icon.png rename to content/applications/websites/website/structure/header_footer/edit-menu-icon.png diff --git a/content/applications/websites/website/pages/menus/mega-menu-option.png b/content/applications/websites/website/structure/header_footer/mega-menu-option.png similarity index 100% rename from content/applications/websites/website/pages/menus/mega-menu-option.png rename to content/applications/websites/website/structure/header_footer/mega-menu-option.png diff --git a/content/applications/websites/website/structure/header_footer/mega-menu.png b/content/applications/websites/website/structure/header_footer/mega-menu.png new file mode 100644 index 0000000000..6ba0e2b292 Binary files /dev/null and b/content/applications/websites/website/structure/header_footer/mega-menu.png differ diff --git a/content/applications/websites/website/pages/menus/menu-editor.png b/content/applications/websites/website/structure/header_footer/menu-editor.png similarity index 100% rename from content/applications/websites/website/pages/menus/menu-editor.png rename to content/applications/websites/website/structure/header_footer/menu-editor.png diff --git a/content/applications/websites/website/structure/pages.rst b/content/applications/websites/website/structure/pages.rst new file mode 100644 index 0000000000..c37cdf468a --- /dev/null +++ b/content/applications/websites/website/structure/pages.rst @@ -0,0 +1,208 @@ +:show-content: + +===== +Pages +===== + +Odoo allows you to create pages for your website and customize their content and appearance to your +needs. + +.. _website/pages/page_type: + +**Static** pages, such as the homepage or any :ref:`custom-created `, +contain fixed content that does not change dynamically. You can manually create these pages, define +their URLs, and adapt their :ref:`properties ` as needed. **Dynamic** +pages, on the other hand, are generated dynamically. All pages generated automatically by Odoo, for +example, when you install an app or module (e.g., `/shop` or `/blog`) or publish a new product or +:doc:`blog post <../../blog>`, are dynamic pages and are therefore managed differently. + +.. _website/pages/page_creation: + +Page creation +============= + +Website pages can be created from the **frontend** and the **backend**. To create a new website +page, proceed as follows: + + #. - Either open the **Website** app, click :guilabel:`+ New` in the top-right corner, then select + :guilabel:`Page`; + - Or go to :menuselection:`Website --> Site --> Pages` and click :guilabel:`New`. + #. In the :guilabel:`New Page` selection menu, click on a template. They are sorted by type: + + - :guilabel:`Basic`: Multi-purpose page. A blank page is also available to start from scratch. + - :guilabel:`About`: Information about your brand. + - :guilabel:`Landing Pages`: Summary of company content and info. + - :guilabel:`Gallery`: Photos and media showcase. + - :guilabel:`Services`: Focus on what you're selling and contact. + - :guilabel:`Pricing Plans`: Highlight on subscription and prices. + - :guilabel:`Team`: The people behind your company. + - :guilabel:`Custom`: To select a custom template. To add a template to this category, open the + page you want to save as a template, then go to :menuselection:`Site --> Properties`, enter + the :guilabel:`Page Title`, :ref:`edit the page's properties + `, enable :guilabel:`Is a template`, and click + :guilabel:`Save`. + + #. Enter a :guilabel:`Page Title`; this title is used in the menu and the page's URL. + #. Click :guilabel:`Create`. + #. If needed, :doc:`customize the page's content and appearance <../web_design>` using the website + editor, then click :guilabel:`Save`. + #. :ref:`Publish ` the page. + +.. tip:: + Disable :guilabel:`Add to menu` if the page should not appear in the menu. + +.. _website/pages/page_management: + +Page management +=============== + +.. _website/pages/un-publish-page: + +Publishing/unpublishing pages +----------------------------- + +Pages need to be published to make them visible to website visitors. To publish or unpublish a +page, access it and toggle the switch in the upper-right corner from :guilabel:`Unpublished` +to :guilabel:`Published`, or vice versa. + +.. image:: pages/un-published_toggle.png + :alt: Unpublished/Published toggle + +.. note:: + It is also possible to: + + - Publish/unpublish a page from the :ref:`page properties `, + where you can define a publishing date and/or restrict the page's visibility if needed; + - Publish/unpublish several pages at once: go to :menuselection:`Website --> Site --> Pages`, + select the pages, then click :guilabel:`Action` and select :guilabel:`Publish` or + :guilabel:`Unpublish`. + + +Alternatively, you can define any :ref:`static page ` as your homepage by +going to :menuselection:`Website --> Site --> Properties`. Select the :guilabel:`Publish` tab and +enable :guilabel:`Use as Homepage`. + +.. _website/pages/page_properties: + +Page properties +--------------- + +To modify a :ref:`static page's ` properties, access the page you wish to +modify, then go to :menuselection:`Site --> Properties`, where you can change the following +properties: + + - :guilabel:`Page URL` : Modify the page URL in the field. In this case, you can redirect the + old URL to the new one if needed. To do so, enable :guilabel:`Redirect old URL`, then select the + :guilabel:`Type` of :ref:`redirection `: + + - :guilabel:`301 Moved permanently`: to redirect the page permanently. + - :guilabel:`302 Moved temporarily`: to redirect the page temporarily. + + .. image:: pages/page-properties.png + :alt: Redirect old URL + + - :guilabel:`In Menu`: Disable if you don't want the page to appear in the menu. + - :guilabel:`Is Homepage`: Enable if you want the page to be the homepage of your website. + - :guilabel:`Published`: Enable to publish the page. + - :guilabel:`Publishing Date`: To publish the page at a specific date and time, click the field, + set the date and time, then press **Enter** or click :guilabel:`Apply` to validate your selection. + - :guilabel:`Indexed`: Disable if you don't want the page to appear in search engine results. + - :guilabel:`Visibility`: Select who can access the page: + + - :guilabel:`Public`: Everyone can access the page. + - :guilabel:`Signed In`: Only signed-in users can access the page. + - :guilabel:`Restricted Group`: Select the :doc:`user access group(s) + ` in the :guilabel:`Authorized group` field. + - :guilabel:`With Password`: Type the password required to access the page in the + :guilabel:`Password` field. + + - :guilabel:`Is a template`: Toggle the switch to save the page as a template and add it to the + :guilabel:`Custom` category. + +.. tip:: + *Some* of these properties can also be modified in batch from + :menuselection:`Website --> Site --> Pages`. + +.. _website/pages/duplicate-page: + +Duplicating pages +~~~~~~~~~~~~~~~~~ + +To duplicate a page, access the page, then go to :menuselection:`Site --> Properties`, and click +:guilabel:`Duplicate Page`. Enter a :guilabel:`Page Name`, then click :guilabel:`OK`. By default, +the new page is added after the duplicated page in the menu, but you can remove it from the menu or +change its position using the :doc:`menu editor `. + +.. _website/pages/delete-page: + +Deleting pages +~~~~~~~~~~~~~~ + +To delete a page, proceed as follows: + +#. Access the page, then go to :menuselection:`Site --> Properties` and click :guilabel:`Delete Page`. +#. A pop-up window shows all links referring to the page you want to delete, + organized by category. To ensure website visitors don't land on an error page, you must update + all the links on your website referring to the page. To do so, expand a category, then click on a + link to open it in a new window. Alternatively, you can set up a :ref:`redirection + ` for the deleted page. +#. Once you have updated the links (or set up a :ref:`redirection `), + tick the :guilabel:`I am sure about this` check box, then click :guilabel:`OK`. + +.. _website/pages/URL-redirection: + +URL redirect mapping +-------------------- + +URL redirect mapping consists in sending visitors and search engines to a URL different from +the one they initially requested. This technique is used, for example, to prevent broken links when +you :ref:`delete a page `, +:ref:`modify its URL `, or migrate your site from another platform to +an Odoo :doc:`domain <../configuration/domain_names>`. It can also be used to improve :doc:`seo`. + +To access existing URL redirections and create new ones, :doc:`activate the developer mode +` and go to :menuselection:`Website --> Configuration --> +Redirects`. + +.. note:: + - A redirect record is added automatically every time you :ref:`modify a page's URL + ` and enable :guilabel:`Redirect Old URL`. + - You can set up redirections for :ref:`static and dynamic pages `. + +To create a new redirection, click the :guilabel:`New` button, then fill in the fields: + +- :guilabel:`Name`: Enter a name to identify the redirect. +- :guilabel:`Action`: Select the type of redirection: + + - :guilabel:`404 Not found`: visitors are redirected to a 404 error page when they try to access + an unpublished or deleted page. + - :guilabel:`301 Moved Permanently`: for permanent redirections of unpublished or deleted + :ref:`static pages `. The new URL is shown in search engine results, + and the redirect is cached by browsers. + - :guilabel:`302 Moved Temporarily`: for short-term redirections, for example, if you are + redesigning or updating a page. The new URL is neither cached by browsers nor shown in search + engine results. + - :guilabel:`308 Redirect/Rewrite`: for permanent redirections of existing :ref:`dynamic pages + `. The URL is renamed; the new name is shown in search engine results + and is cached by browsers. Use this redirect type to rename a dynamic page, for example, if you + wish to rename `/shop` into `/market`. + +- :guilabel:`URL from`: Enter the URL to be redirected (e.g., `/about-the-company`) or search for + the desired :ref:`dynamic page ` and select it from the list. +- :guilabel:`URL to`: For 301, 302, and 308 redirects, enter the URL to be redirected to. If you + want to redirect to an external URL, include the protocol (e.g., `https://`). +- :guilabel:`Website`: Select a specific website. +- :guilabel:`Sequence`: To define the order in which redirections are performed, e.g., in the case + of redirect chains (i.e., a series of redirects where one URL is redirected to another one, which + is itself further redirected to another URL). + +Toggle the :guilabel:`Activate` switch to deactivate the redirection. + +.. important:: + 404, 301, and 302 redirections are meant to migrate traffic from + :ref:`unpublished ` or :ref:`deleted ` pages + to *new* pages, while the 308 redirect is used for *permanent* redirections of *existing* pages. + +.. seealso:: + - `Google documentation on redirects and search `_ + - :doc:`seo` diff --git a/content/applications/websites/website/structure/pages/page-properties.png b/content/applications/websites/website/structure/pages/page-properties.png new file mode 100644 index 0000000000..f0cdf59ddd Binary files /dev/null and b/content/applications/websites/website/structure/pages/page-properties.png differ diff --git a/content/applications/websites/website/structure/pages/un-published_toggle.png b/content/applications/websites/website/structure/pages/un-published_toggle.png new file mode 100644 index 0000000000..ce4a77f92d Binary files /dev/null and b/content/applications/websites/website/structure/pages/un-published_toggle.png differ diff --git a/content/applications/websites/website/pages/seo.rst b/content/applications/websites/website/structure/seo.rst similarity index 74% rename from content/applications/websites/website/pages/seo.rst rename to content/applications/websites/website/structure/seo.rst index 6fa359884e..3246f5d879 100644 --- a/content/applications/websites/website/pages/seo.rst +++ b/content/applications/websites/website/structure/seo.rst @@ -15,6 +15,10 @@ speed. `_ to render efficiently according to the device: desktop, tablet, or mobile, which positively impacts ranking in search engines. +.. seealso:: + `Magic Sheet - Optimize your website [PDF] + `_ + Content optimization ==================== @@ -72,7 +76,7 @@ image by clicking the upward arrow. shared. - If you change the title of a blog post or the name of a product, the changes apply automatically everywhere on your website. The old link still functions when external websites - use a :ref:`301 redirect `, maintaining the SEO link juice. + use a :ref:`301 redirect `, maintaining the SEO link juice. Images ====== @@ -127,20 +131,66 @@ like the price and rating of a product: robots.txt ---------- -A robots.txt file tells search engine crawlers which URLs the crawler can access on your site, to -index its content. This is used mainly to avoid overloading your site with requests. +A `robots.txt` file instructs search engine crawlers which parts of a website they are permitted to +access. Its primary purpose is to: + + - **Prevent overloading the website:** By guiding crawlers away from certain sections, robots.txt + helps manage server load. + - **Control access to resources and detailed descriptions:** It can prevent crawlers from accessing + media files (images, videos), CSS stylesheets, and JavaScript files, and from reading the content + (text) of specific pages. -When indexing your website, search engines take a first look at the robots.txt file. Odoo -automatically creates one robot.txt file available on `mydatabase.odoo.com/robots.txt`. +When indexing your website, search engines first look at the robots.txt file. Odoo automatically +creates one robot.txt file available on `mydatabase.odoo.com/robots.txt`. + +.. note:: + Reputable bots adhere to robots.txt; others may require blocking via + :ref:`Cloudflare ` on your custom domain. + +Edit robots.txt +~~~~~~~~~~~~~~~ By editing a robots.txt file, you can control which site pages are accessible to search engine crawlers. To add custom instructions to the file, go to :menuselection:`Website --> Configuration --> Settings`, scroll down to the :guilabel:`SEO` section, and click :guilabel:`Edit robots.txt`. .. example:: - If you do not want the robots to crawl the `/about-us` page of your site, you can edit the + If you do not want robots to crawl the `/about-us` page of your site, you can edit the robots.txt file to add `Disallow: /about-us`. +.. important:: + While `robots.txt` prevents content from being crawled, **it does not guarantee that a page + will not be indexed**. A page can still appear in search results if it is linked to from other + crawled pages (indexed by "reference"). Google generally does not recommend using robots.txt to + block webpages that you wish to keep out of search results entirely. + +Prevent a page from being indexed +--------------------------------- + +To effectively prevent a page from appearing in search engine results, use one of the following +methods: + + - **noindex tag:** Access the page's :ref:`properties ` and toggle + the :guilabel:`Indexed` switch off. + + .. note:: + This option is not yet available for :ref:`dynamic pages `. + + - **404 or 403:** Configure the page to return a 404 (Not Found) or 403 (Forbidden) HTTP status + code. These codes signal to search engines that the page does not exist or is inaccessible, + leading to its eventual removal from the index. + + - **404:** :ref:`Configure a 404 redirection. ` + - **403:** Access the page's :ref:`properties ` + and toggle the :guilabel:`Visibility` switch off or :ref:`unpublish the page `. + + - **Google Search Console:** Use Google Search Console to request the removal of specific URLs from + Google's index. + +.. seealso:: + - :doc:`../configuration/google_search_console` + - :doc:`pages` + Sitemap ------- diff --git a/content/applications/websites/website/pages/seo/data-markup.png b/content/applications/websites/website/structure/seo/data-markup.png similarity index 100% rename from content/applications/websites/website/pages/seo/data-markup.png rename to content/applications/websites/website/structure/seo/data-markup.png diff --git a/content/applications/websites/website/pages/seo/image-format.png b/content/applications/websites/website/structure/seo/image-format.png similarity index 100% rename from content/applications/websites/website/pages/seo/image-format.png rename to content/applications/websites/website/structure/seo/image-format.png diff --git a/content/applications/websites/website/pages/seo/optimize-seo.png b/content/applications/websites/website/structure/seo/optimize-seo.png similarity index 100% rename from content/applications/websites/website/pages/seo/optimize-seo.png rename to content/applications/websites/website/structure/seo/optimize-seo.png diff --git a/content/applications/websites/website/pages/seo/page-properties.png b/content/applications/websites/website/structure/seo/page-properties.png similarity index 100% rename from content/applications/websites/website/pages/seo/page-properties.png rename to content/applications/websites/website/structure/seo/page-properties.png diff --git a/content/applications/websites/website/web_design.rst b/content/applications/websites/website/web_design.rst index 671e29f4de..98c099e2f3 100644 --- a/content/applications/websites/website/web_design.rst +++ b/content/applications/websites/website/web_design.rst @@ -1,12 +1,50 @@ :nosearch: +:show-content: +:hide-page-toc: ========== Web design ========== +Design your website using :doc:`building blocks <../website/web_design/building_blocks>`, customize +its :doc:`theme <../website/web_design/themes>` with various options, structure and present content +with :doc:`elements <../website/web_design/elements>`, and display or hide building blocks using +:doc:`visibility settings <../website/web_design/visibility>`. + +.. cards:: + + .. card:: Building blocks + :target: web_design/building_blocks + :large: + + Design your website by dragging and dropping building blocks, then editing them to fit your + content and layout needs. + + .. card:: General theme + :target: web_design/themes + :large: + + Customize your website’s theme by adjusting its colors, fonts, and layout. + + .. card:: Elements + :target: web_design/elements + :large: + + Structure and present content effectively with elements such as titles, lists, etc. + + .. card:: Visibility + :target: web_design/visibility + :large: + + Display or hide building blocks based on several criteria. + +.. seealso:: + `Odoo Tutorials: Website `_ + .. toctree:: :titlesonly: web_design/building_blocks web_design/themes web_design/elements + web_design/visibility diff --git a/content/applications/websites/website/web_design/building_blocks.rst b/content/applications/websites/website/web_design/building_blocks.rst index f98f612301..59e53ee16f 100644 --- a/content/applications/websites/website/web_design/building_blocks.rst +++ b/content/applications/websites/website/web_design/building_blocks.rst @@ -4,172 +4,262 @@ Building blocks =============== -Building blocks let you design your website quickly by dragging and dropping them onto your web -pages. Four types of building blocks are available depending on their use: -:doc:`Structure `, :doc:`Features `, -:doc:`Dynamic Content `, and -:doc:`Inner Content `. +You can design your website by :ref:`dragging and dropping building blocks +`, then :ref:`editing them ` to fit your +content and layout needs. .. seealso:: - `Odoo Tutorial: Design your first webpage `_ + `Odoo Tutorial: Design your website: text and colors `_ -.. _websites/website/web_design/building_blocks: +.. _website/building_blocks/add: -Adding a building block -======================= +Add a building block +==================== -To add a building block to your website page, click :guilabel:`Edit`, select the desired building -block, and drag and drop it to your page. You can add as many blocks as needed. +To add a block to a :doc:`website page <../structure/pages>`, access the page, click :guilabel:`Edit`, then +drag and drop the desired building block into the appropriate location. Two types of building blocks +are available: :guilabel:`Categories` and :guilabel:`Inner Content`. :guilabel:`Inner Content` +building blocks can only be added into :guilabel:`Categories` building blocks. -To edit the content of a building block, click on it and go to the :guilabel:`Customize` tab, where -available features depend on the block you selected. +When clicking on a category block, a popup appears, allowing you to select between multiple +templates for each category. -Color preset and background -=========================== +.. tip:: + You can also search for a specific block in the :guilabel:`Insert a block` popup using the + search bar. -You can customize and apply color presets to building blocks. To proceed, select a building block, -go to the :guilabel:`Customize` tab, click the :guilabel:`Background` button, and select a -:guilabel:`Preset`. + .. image:: building_blocks/insert-a-block.png + :alt: Pop-up block selection -When you modify a color preset, all elements using it are automatically updated to match the new -configuration. +Once the category block is placed, you can drag and drop :guilabel:`Inner content` blocks +within it. The :guilabel:`Inner content` blocks allow you to add elements, such as videos, images, +social media buttons, etc., into pre-existing category blocks. -.. seealso:: - :doc:`Website themes ` +.. note:: + Access to certain blocks requires the installation of their respective application or module + (e.g., eCommerce for the :guilabel:`Products` block). -Layout: grid and columns -======================== +.. example:: + Add all your social media accounts in one place with the inner content :guilabel:`Social Media` + block. Toggle the switch on or off next to the desired platform and copy/paste your account URL. -You can choose between two layout styles for most building blocks: :ref:`grid -` or :ref:`columns (cols) `. To change the default -layout, go to the :guilabel:`Customize` tab. Under the :guilabel:`Banner` section, select -:guilabel:`Grid` or :guilabel:`Cols` as the :guilabel:`Layout`. + .. image:: building_blocks/social-media-inner-content.png + :alt: Social Media inner content block -.. _building_blocks/grid: +.. _website/building_blocks/form: -Grid +Form ---- -The :guilabel:`Grid` layout allows you to reposition and resize elements, such as images or text, by -dragging and dropping them. +The :guilabel:`Form` block is used to collect information from website visitors and create records +in your database, if applicable. -.. image:: building_blocks/grid-layout.png - :alt: When the grid layout is selected, choose an image and drag and drop it where needed. +.. image:: building_blocks/form-block.png + :alt: Example of a form block -.. tip:: - Position images behind the text by using the above/below icons. +Action +~~~~~~ - .. image:: building_blocks/superimpose-images-to-text.png - :alt: Positioning an image behind text +By default, when the form is submitted, an email containing the information entered by the visitor +is automatically sent. Depending on the apps installed on your database, additional actions that can +automatically create records may become available. To choose a different action, click +:guilabel:`Edit`, click the form, navigate to the :guilabel:`Customize` tab, and select the desired +:guilabel:`Action`: -.. _building_blocks/cols: +- :guilabel:`Apply for a Job` (:doc:`Recruitment `) +- :guilabel:`Create a Customer` (:doc:`eCommerce <../../ecommerce>`) +- :guilabel:`Create a Ticket` (:doc:`Helpdesk `) +- :guilabel:`Create an Opportunity` (:doc:`CRM `) +- :guilabel:`Subscribe to Newsletter` (:doc:`Email Marketing `) +- :guilabel:`Create a Task` (:doc:`Project `) -Cols ----- +.. image:: building_blocks/inner-content-edit-form.png + :alt: Editing a form to change its action -Choosing the :guilabel:`Cols` layout allows you to determine the number of elements per line within -the block. To do so, select the block to modify, click the :guilabel:`Cols` :guilabel:`Layout`, and -adjust the number. +By default, submitting the form redirects visitors to a *Thank you* page. Use the :guilabel:`URL` +field to send them to a different page. Alternatively, you can choose not to redirect and keep +them on the form's page by selecting :guilabel:`Nothing` or :guilabel:`Show Message` in the +:guilabel:`On Success` field. -By default, **on mobile devices**, one element is visible per line to ensure that content remains -easily readable and accessible on smaller screens. To adjust the value, click the :icon:`fa-mobile` -(:guilabel:`mobile icon`) at the top of the website editor and adapt the number of columns. +Fields +~~~~~~ -.. image:: building_blocks/cols.png - :alt: Adjust the number of images per line on mobile view. +To add a new field to the form, navigate to the :guilabel:`Customize tab` and click the +:guilabel:`+ Field` button next to the :guilabel:`Form` or :guilabel:`Field` section. To modify the +new (or any other) field on the form, select the field, then use the options available in the +:guilabel:`Field` section of the :guilabel:`Customize` tab. For example, you can: -Duplicating a building block -============================ +- Change the field :guilabel:`Type`. -You can duplicate a building block by clicking on the duplicate icon. Once duplicated, the new block -appears on your website beneath the original one. + .. tip:: + It is also possible to select an :guilabel:`Existing Field` from the database and use the data + it contains. The fields available depend on the selected action. Property fields added to the + database can also be used. -.. image:: building_blocks/duplicate-container.png - :alt: Duplicating a building block + .. spoiler:: Click here to preview all field types. -Reordering a building block -=========================== + .. image:: building_blocks/all-types-of-field.png + :alt: All types of form fields -To reorder a building block, select it and click the up arrow to move it before the previous block -or click the down arrow to move it after. + Some fields are visually similar, but the data entered must follow a specific format. -You can also use the drag-and-drop icon to move a block manually. +- Edit the field's :guilabel:`Label` and adapt its :guilabel:`Position`. +- Enable a field :guilabel:`Description`. Click the default description on the form to modify it. +- Add a :guilabel:`Placeholder` or :guilabel:`Default value`. +- Specify if the field is :guilabel:`Required`. +- Edit the field's :doc:`visibility ` settings. +- Add an :ref:`animation `. -.. image:: building_blocks/reordering-blocks.png - :alt: Reordering building blocks +Once you have made the desired changes, click :guilabel:`Save`. -Saving a custom building block -============================== +.. _website/building_blocks/embed_code: -You can save a customized building block and reuse it elsewhere. To do so, select it, navigate to -the :guilabel:`Customize` tab, and click the :icon:`fa-floppy-o` (:guilabel:`floppy disk`) icon to -save it. +Embed code +---------- -.. image:: building_blocks/saving-custom-block.png - :alt: Saving a building block +Embedding code allows you to integrate content from third-party services into a page, such as videos +from YouTube, maps from Google Maps, social media posts from Instagram, etc. -Saved building blocks are available in the :guilabel:`Custom` section of the :guilabel:`Blocks` tab. -Click the :icon:`fa-pencil` (:guilabel:`pen`) icon to edit their name. +After adding the block to a page, click the block, then go to the :guilabel:`Customize` tab and +click :guilabel:`Edit`. Replace the placeholder code with your custom embed code. -.. image:: building_blocks/custom-blocks.png - :alt: Custom section with saved building blocks +.. image:: building_blocks/embed-code-pop-up.png + :alt: Add the link to the embedded code you want to point to -.. _building_blocks/visibility: +.. warning:: + Do not copy/paste code you do not understand, as it could put your data at risk. -Visibility -========== +.. _website/building_blocks/move_switch_delete: -Visibility on desktop/mobile ----------------------------- +Move, switch, or delete a building block +======================================== -You can hide specific elements depending on the visitor's device. To do so, select the element to -hide, and in the :guilabel:`Customize` tab, scroll down to :guilabel:`Visibility`, and click the -:guilabel:`Show/Hide on Mobile` or the :guilabel:`Show/Hide on Desktop` icon. +Pull the turquoise borders on the block to reduce or increase the space at the top or bottom of it. -.. image:: building_blocks/show-hide-on-mobile.png - :alt: Click the "show/hide on mobile" icons to show or hide some elements on mobile. +Change the block order by clicking :icon:`fa-chevron-up` (:guilabel:`chevron up`) or +:icon:`fa-chevron-down` (:guilabel:`chevron down`) and move the block on the page by clicking +:icon:`fa-arrows` (:guilabel:`arrows`). When you have multiple :ref:`columns +`, move a column to the left or right by clicking +:icon:`fa-chevron-left` (:guilabel:`chevron left`) or :icon:`fa-chevron-right` +(:guilabel:`chevron right`). + +To delete a block, click :icon:`fa-trash` (:guilabel:`trash`). + + .. image:: building_blocks/padding-building-block.png + :alt: Extend margins on building block + +.. tip:: + Quickly change the block category by clicking :icon:`fa-exchange` (:guilabel:`exchange`). + +.. _website/building_blocks/edit: + +Edit a building block +===================== + +To edit the content of a building block, click on it and go to the :guilabel:`Customize` tab. +Available customization options vary depending on the type of block selected. + +.. seealso:: + - :doc:`Web design elements ` + - :doc:`Visibility ` + +Background +---------- + +To modify the background of a building block, select the block, go to the :guilabel:`Customize` tab, +and click the color dot or another :guilabel:`Background` option. You can change the +color and/or add an image, video, and/or shape. Once you've selected a shape, new fields appear to +allow you to customize the shape. .. tip:: - Click the :icon:`fa-mobile` (:guilabel:`mobile`) icon at the top of the configurator to preview - how your website would look on a mobile device. + - Position an element (image, text, etc.) behind or in front of another one by using the + :guilabel:`Send to back` or :guilabel:`Bring to front` icons. - .. image:: building_blocks/phone-icon.png - :alt: Mobile phone preview icon + .. image:: building_blocks/change-block-position.png + :alt: Change block position -Conditional visibility ----------------------- + - To resize a block, click and drag the dots around its edges to adjust it as needed. -You can also hide or show building blocks using other conditions. To do so, select an element, go to -:guilabel:`Visibility`, click :guilabel:`No condition`, and select :guilabel:`Conditionally` -instead. Then, configure the condition(s) to apply by selecting :guilabel:`Visible for` or -:guilabel:`Hidden for` and which :guilabel:`Records` will be impacted. + .. image:: building_blocks/adapt-block-size.png + :alt: Adapt block size .. seealso:: - :doc:`Link Tracker <../reporting/link_tracker>` + :doc:`General theme ` + +Layout: grid and columns +------------------------ + +For most building blocks, you can choose between two layout styles: :ref:`grid +` or :ref:`columns (cols) `. To change +the default layout style, click the block, go to the :guilabel:`Customize` tab, and set the +:guilabel:`Layout` field to :guilabel:`Grid` or :guilabel:`Cols`. + +.. _website/building_blocks/grid: + +Grid +~~~~ + +The :guilabel:`Grid` layout allows you to reposition and resize elements, such as images or text, by +dragging and dropping them. When :guilabel:`Grid` is selected, additional options are available to +:guilabel:`Add Elements` by clicking :guilabel:`Image`, :guilabel:`Text`, or :guilabel:`Button`. + +.. image:: building_blocks/grid-layout.png + :alt: When the grid layout is selected, choose an image and drag and drop it where needed. + +.. _website/building_blocks/cols: + +Cols +~~~~ + +Choosing the :guilabel:`Cols` layout allows you to determine the number of elements per line within +the block. To do so, select the block to modify, click the dropdown next to the :guilabel:`Cols` +field, and adjust the number. You can then modify a specific column's settings using the options in +the :guilabel:`Column` section of the :guilabel:`Customize` tab. + +.. note:: + By default, :doc:`on mobile devices `, only one element (column) is visible per line + to ensure that content remains easily readable and accessible on smaller screens. To adjust + the value, click the :icon:`fa-mobile` (:guilabel:`mobile icon`) at the top of the website editor + and adapt the number of columns. Shapes are hidden by default on mobiles. + +.. _website/building_blocks/duplicate: + +Duplicate a building block +========================== -Invisible elements ------------------- +To duplicate a building block, click the :icon:`fa-clone` (:guilabel:`duplicate`) icon at the top of +the :guilabel:`Customize` tab. Once duplicated, the new block appears on the page beneath the +original one. -Depending on the visibility settings, some elements can become hidden from your current view. To -make a building block visible again, go to the :guilabel:`Invisible Elements` section at the bottom -of the configurator and select a building block. +.. _website/building_blocks/custom: + +Save a custom building block +============================ + +You can save a customized building block to reuse it elsewhere. To do so, select it, navigate to +the :guilabel:`Customize` tab, and click the :icon:`fa-floppy-o` (:guilabel:`floppy disk`) icon. +Click the :guilabel:`Save and reload` button in the popup to confirm saving your custom block. + +To add a saved building block to the page, navigate to the :guilabel:`Blocks` tab and drag and drop +the :guilabel:`Custom` block from the :guilabel:`Categories` section. In the popup that opens, click +the desired block in the :guilabel:`Custom` category. + +.. tip:: + In the :guilabel:`Insert a block` popup, click :icon:`fa-pencil` (:guilabel:`edit`) to rename the + custom block or :icon:`fa-trash` (:guilabel:`delete`) to delete it. -Mobile view customization -========================= +.. _website/building_blocks/anchor: -You can customize building block elements for the mobile view without impacting the desktop view. -To do so, open the website editor, click the :icon:`fa-mobile` (:guilabel:`mobile`) icon at the top, -and select the building block element. Then, you can: +Create an anchor link +===================== -- reorder the elements by clicking the :icon:`fa-angle-left` :icon:`fa-angle-right` - (:guilabel:`left/right arrow`) icons; -- edit the :ref:`Cols ` and :ref:`Visibility ` - features in the :guilabel:`Customize` tab of the website editor. +Anchor links are hyperlinks that direct users to a **specific section** of a page. To create an +anchor link for a block, follow these steps: -.. toctree:: - :titlesonly: +#. Click :guilabel:`Edit` and select the block you want to link to. +#. Click :icon:`fa-link` (:guilabel:`link`) at the top of the :guilabel:`Customize` tab. +#. To edit the default anchor name, click :guilabel:`Edit` in the green popup message that opens. +#. Replace the anchor name and click :guilabel:`Save & copy`. - building_blocks/structure - building_blocks/features - building_blocks/dynamic_content - building_blocks/inner_content +Once the anchor is saved, you can :ref:`link to it ` from anywhere on your +website. diff --git a/content/applications/websites/website/web_design/building_blocks/adapt-block-size.png b/content/applications/websites/website/web_design/building_blocks/adapt-block-size.png new file mode 100644 index 0000000000..740424fbfa Binary files /dev/null and b/content/applications/websites/website/web_design/building_blocks/adapt-block-size.png differ diff --git a/content/applications/websites/website/web_design/building_blocks/all-types-of-field.png b/content/applications/websites/website/web_design/building_blocks/all-types-of-field.png new file mode 100644 index 0000000000..d944c5b3c0 Binary files /dev/null and b/content/applications/websites/website/web_design/building_blocks/all-types-of-field.png differ diff --git a/content/applications/websites/website/web_design/building_blocks/change-block-position.png b/content/applications/websites/website/web_design/building_blocks/change-block-position.png new file mode 100644 index 0000000000..552fa1536a Binary files /dev/null and b/content/applications/websites/website/web_design/building_blocks/change-block-position.png differ diff --git a/content/applications/websites/website/web_design/building_blocks/cols.png b/content/applications/websites/website/web_design/building_blocks/cols.png deleted file mode 100644 index 0a25f85e9a..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/cols.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/custom-blocks.png b/content/applications/websites/website/web_design/building_blocks/custom-blocks.png deleted file mode 100644 index a320080dbc..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/custom-blocks.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/duplicate-container.png b/content/applications/websites/website/web_design/building_blocks/duplicate-container.png deleted file mode 100644 index 0a5d5a972e..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/duplicate-container.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/dynamic_content.rst b/content/applications/websites/website/web_design/building_blocks/dynamic_content.rst deleted file mode 100644 index bfd391a366..0000000000 --- a/content/applications/websites/website/web_design/building_blocks/dynamic_content.rst +++ /dev/null @@ -1,104 +0,0 @@ -=============== -Dynamic content -=============== - -The :guilabel:`Dynamic Content` :doc:`building blocks <../building_blocks>`, such as -:ref:`Form `, :ref:`Products `, -:ref:`Embed Code `, or :doc:`Blog Posts <../../../blog>`, help -you create interactive and visually appealing layouts for your web :doc:`pages <../../pages>`. - -.. note:: - To add a building block, click :guilabel:`Edit`, select the desired building block under the - :guilabel:`Blocks` tab, and drag and drop it onto the page. To access its settings, click it and - go to the :guilabel:`Customize` tab, where the available options depend on the type of block - selected. - -.. _website/dynamic_content/form: - -Form -==== - -The :guilabel:`Form` block is used to collect information from website visitors and create records -in your database. - -.. image:: dynamic_content/form-block.png - :alt: Example of a form block - -Action ------- - -By default, submitting the form **sends you an email** containing what the visitor entered. -Depending on the apps installed on your database, new actions that can automatically create records -become available: - -- :guilabel:`Apply for a Job` (Recruitment) -- :guilabel:`Create a Customer` (eCommerce) -- :guilabel:`Create a Ticket` (Helpdesk) -- :guilabel:`Create an Opportunity` (CRM) -- :guilabel:`Subscribe to Newsletter` (Email Marketing) -- :guilabel:`Create a Task` (Project) - -Select another action with the :guilabel:`Action` field found under the :guilabel:`Customize` tab's -:guilabel:`Form` section. - -.. image:: dynamic_content/form-block-settings.png - :alt: Editing a form to change its action - -By default, actions redirect visitors to a *thank you* page after submitting the form. Use the -:guilabel:`URL` field to change where they are redirected. It is also possible to let visitors stay -on the form's page by selecting :guilabel:`Nothing` or :guilabel:`Show Message` under the -:guilabel:`On Success` field. - -Fields ------- - -To add a new field to the form, click the :guilabel:`+ Field` button found next to the Customize -tab's :guilabel:`Form` or :guilabel:`Field` section. By default, new fields are *text* fields. To -change the type, use the :guilabel:`Type` field and select an option under the :guilabel:`Custom -Field` heading. - -.. spoiler:: Click here to preview all field types - - .. image:: dynamic_content/form-field-types.png - :alt: All types of form fields - - Some fields are visually similar, but the data entered must follow a specific format. - -It is also possible to select an :guilabel:`Existing Field` from a database and use the data it -contains. The fields available depend on the selected action. - -.. tip:: - Property fields added to the database can also be used. - -.. _website/dynamic_content/products: - -Products -======== - -The :guilabel:`Products` block is available after installing the eCommerce app. It is used to -display a selection of products sold on your website. - -.. image:: dynamic_content/products-block.png - :alt: Example of a products block - -By default, the block displays the :guilabel:`Newest Products`. To change which products are shown, -go to the :guilabel:`Customize` tab's :guilabel:`Products` section and select as :guilabel:`Filter` -the :guilabel:`Recently Sold Products` or :guilabel:`Recently Viewed Products` option. - -In addition, it is possible to display products from a single category only by selecting one with -the :guilabel:`Category` field. - -.. _website/dynamic_content/embed_code: - -Embed code -========== - -Embedding code allows you to integrate content from third-party services into a page, such as videos -from YouTube, maps from Google Maps, social media posts from Instagram, etc. - -.. image:: dynamic_content/embed-code.png - :alt: Add the link to the embedded code you want to point to - -After adding the block to a page, click the :guilabel:`Edit` button found under the -:guilabel:`Customize` tab's :guilabel:`Embed Code` section and enter the code, replacing the code -used to show the block's instructions. diff --git a/content/applications/websites/website/web_design/building_blocks/dynamic_content/embed-code.png b/content/applications/websites/website/web_design/building_blocks/dynamic_content/embed-code.png deleted file mode 100644 index fa6b7e69e9..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/dynamic_content/embed-code.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/dynamic_content/form-block-settings.png b/content/applications/websites/website/web_design/building_blocks/dynamic_content/form-block-settings.png deleted file mode 100644 index 461e6ecb72..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/dynamic_content/form-block-settings.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/dynamic_content/form-block.png b/content/applications/websites/website/web_design/building_blocks/dynamic_content/form-block.png deleted file mode 100644 index a090b8eb86..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/dynamic_content/form-block.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/dynamic_content/form-field-types.png b/content/applications/websites/website/web_design/building_blocks/dynamic_content/form-field-types.png deleted file mode 100644 index e5bb7ee685..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/dynamic_content/form-field-types.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/dynamic_content/products-block.png b/content/applications/websites/website/web_design/building_blocks/dynamic_content/products-block.png deleted file mode 100644 index 56af96e107..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/dynamic_content/products-block.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/embed-code-pop-up.png b/content/applications/websites/website/web_design/building_blocks/embed-code-pop-up.png new file mode 100644 index 0000000000..e85658c9d3 Binary files /dev/null and b/content/applications/websites/website/web_design/building_blocks/embed-code-pop-up.png differ diff --git a/content/applications/websites/website/web_design/building_blocks/features.rst b/content/applications/websites/website/web_design/building_blocks/features.rst deleted file mode 100644 index 09ee2974d6..0000000000 --- a/content/applications/websites/website/web_design/building_blocks/features.rst +++ /dev/null @@ -1,40 +0,0 @@ -======== -Features -======== - -The :guilabel:`Features` :doc:`building blocks <../building_blocks>` allow you to list multiple -items next to each other. - -The :ref:`Table of Content ` and the :ref:`Call to Action -` blocks are presented below. - -.. note:: - To add a building block, click :guilabel:`Edit`, select the desired building block under the - :guilabel:`Blocks` tab, and drag and drop it onto the page. To access its settings, click it and - go to the :guilabel:`Customize` tab, where the available options depend on the type of block - selected. - -.. _features/table_of_content: - -Table of content -================ - -The :guilabel:`Table of Content` block is used to list many different items grouped under several -headings. A clickable index is available to navigate quickly between the different categories. - -.. image:: features/table-of-content.png - :alt: The default Table of Content block - -.. _features/call_to_action: - -Call to action -============== - -The :guilabel:`Call to Action` block is used to prompt visitors to take a specific action, such -as signing up for a newsletter or contacting you. - -.. image:: features/call-to-action.png - :alt: The default Call to Action block - -To change the button's link, select it, go to the :guilabel:`Customize` tab's :guilabel:`Inline -Text` section and replace `/contactus` with another URL. diff --git a/content/applications/websites/website/web_design/building_blocks/features/call-to-action.png b/content/applications/websites/website/web_design/building_blocks/features/call-to-action.png deleted file mode 100644 index 0fb1f0400a..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/features/call-to-action.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/features/table-of-content.png b/content/applications/websites/website/web_design/building_blocks/features/table-of-content.png deleted file mode 100644 index df2c831841..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/features/table-of-content.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/form-block.png b/content/applications/websites/website/web_design/building_blocks/form-block.png new file mode 100644 index 0000000000..9a55b2559a Binary files /dev/null and b/content/applications/websites/website/web_design/building_blocks/form-block.png differ diff --git a/content/applications/websites/website/web_design/building_blocks/grid-layout.png b/content/applications/websites/website/web_design/building_blocks/grid-layout.png index 086c6b1fec..8ab0a3bb09 100644 Binary files a/content/applications/websites/website/web_design/building_blocks/grid-layout.png and b/content/applications/websites/website/web_design/building_blocks/grid-layout.png differ diff --git a/content/applications/websites/website/web_design/building_blocks/inner-content-edit-form.png b/content/applications/websites/website/web_design/building_blocks/inner-content-edit-form.png new file mode 100644 index 0000000000..c4ecd46b53 Binary files /dev/null and b/content/applications/websites/website/web_design/building_blocks/inner-content-edit-form.png differ diff --git a/content/applications/websites/website/web_design/building_blocks/inner_content.rst b/content/applications/websites/website/web_design/building_blocks/inner_content.rst deleted file mode 100644 index a5167de2a8..0000000000 --- a/content/applications/websites/website/web_design/building_blocks/inner_content.rst +++ /dev/null @@ -1,34 +0,0 @@ -============= -Inner content -============= - -The :guilabel:`Inner content` :doc:`building blocks <../building_blocks>` allow you to add elements -such as videos, images, and :ref:`social media buttons `, into -pre-existing blocks. - -.. note:: - To add a building block, click :guilabel:`Edit`, select the desired building block under the - :guilabel:`Blocks` tab, and drag and drop it onto the page. To access its settings, click it and - go to the :guilabel:`Customize` tab, where the available options depend on the type of block - selected. - -.. _inner_content/social_media: - -Social media -============ - -The :guilabel:`Social Media` block inserts clickable buttons leading to your social network's URL. -By default, the buttons display the icons of seven major social networks. You can click -:guilabel:`Add New Social Network` to create a new button and switch the buttons next to a URL to -turn them on or off. - -.. image:: inner_content/social-media-block.png - :alt: The social media building block and its settings - -.. Note:: - - You cannot edit the default icons but can edit the ones you added by clicking - :guilabel:`Add New Social Network`. To do so, select the icon, then click the - :guilabel:`Replace` button found under the :guilabel:`Customize` tab's :guilabel:`Icon` section, - and either select one of the available icons or click the :guilabel:`Images` tab and upload an - image or add its URL. diff --git a/content/applications/websites/website/web_design/building_blocks/inner_content/social-media-block.png b/content/applications/websites/website/web_design/building_blocks/inner_content/social-media-block.png deleted file mode 100644 index fc4208802b..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/inner_content/social-media-block.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/insert-a-block.png b/content/applications/websites/website/web_design/building_blocks/insert-a-block.png new file mode 100644 index 0000000000..bd0a0d7cf1 Binary files /dev/null and b/content/applications/websites/website/web_design/building_blocks/insert-a-block.png differ diff --git a/content/applications/websites/website/web_design/building_blocks/padding-building-block.png b/content/applications/websites/website/web_design/building_blocks/padding-building-block.png new file mode 100644 index 0000000000..19793c95f2 Binary files /dev/null and b/content/applications/websites/website/web_design/building_blocks/padding-building-block.png differ diff --git a/content/applications/websites/website/web_design/building_blocks/phone-icon.png b/content/applications/websites/website/web_design/building_blocks/phone-icon.png deleted file mode 100644 index 424b8741ee..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/phone-icon.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/reordering-blocks.png b/content/applications/websites/website/web_design/building_blocks/reordering-blocks.png deleted file mode 100644 index 4807d0610e..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/reordering-blocks.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/saving-custom-block.png b/content/applications/websites/website/web_design/building_blocks/saving-custom-block.png deleted file mode 100644 index b143b40f3b..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/saving-custom-block.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/show-hide-on-mobile.png b/content/applications/websites/website/web_design/building_blocks/show-hide-on-mobile.png deleted file mode 100644 index 482350aeee..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/show-hide-on-mobile.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/social-media-inner-content.png b/content/applications/websites/website/web_design/building_blocks/social-media-inner-content.png new file mode 100644 index 0000000000..d48e445693 Binary files /dev/null and b/content/applications/websites/website/web_design/building_blocks/social-media-inner-content.png differ diff --git a/content/applications/websites/website/web_design/building_blocks/structure.rst b/content/applications/websites/website/web_design/building_blocks/structure.rst deleted file mode 100644 index 551adb2a9d..0000000000 --- a/content/applications/websites/website/web_design/building_blocks/structure.rst +++ /dev/null @@ -1,60 +0,0 @@ -========= -Structure -========= - -The website configurator provides a range of :guilabel:`Structure` :doc:`building blocks -<../building_blocks>` to design your website's layout, including headings, images, and text. - -Below are presented two types of structure blocks: :ref:`Banner ` and -:ref:`Masonry `. - -.. note:: - To add a building block, click :guilabel:`Edit`, select the desired building block under the - :guilabel:`Blocks` tab, and drag and drop it onto the page. To access its settings, click it and - go to the :guilabel:`Customize` tab, where the available options depend on the type of block - selected. - -.. _structure/banner: - -Banner ------- - -The :guilabel:`Banner` block combines a title, text, images, and a call to action button, making it -suitable for placement at the top of a website. - -.. image:: structure/default-image-content.png - :alt: The default banner block - -Call to action -~~~~~~~~~~~~~~ - -The call to action button encourages visitors to take a specific action, for example, consulting -your shop, downloading a file, or making an appointment. - -.. image:: structure/call-to-action.png - :alt: Selecting the call to action button - -To change the button's link, select it and click the :guilabel:`Edit Link` icon. Additional -customization options are available in the :guilabel:`Inline Text` section. - -.. image:: structure/inline-text.png - :alt: Configuring the call to action button - -.. _structure/masonry: - -Masonry -------- - -The :guilabel:`Masonry` block offers a range of templates that associate image and text bricks. To -change the default template, go to the :guilabel:`Customize` tab, click :guilabel:`Template` and -select one. - -.. image:: structure/masonry-template.png - :alt: Selecting a masonry building block template - -.. tip:: - The :guilabel:`Masonry` block allows you to add text on top of images. To do so, go to the - :guilabel:`Customize` tab, scroll to :guilabel:`Add Elements`, and click :guilabel:`Text`. - - .. image:: structure/masonry-text-box.png - :alt: Adding text on top of an image diff --git a/content/applications/websites/website/web_design/building_blocks/structure/call-to-action.png b/content/applications/websites/website/web_design/building_blocks/structure/call-to-action.png deleted file mode 100644 index 9a515d9826..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/structure/call-to-action.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/structure/default-image-content.png b/content/applications/websites/website/web_design/building_blocks/structure/default-image-content.png deleted file mode 100644 index a50cbc9b8c..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/structure/default-image-content.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/structure/inline-text.png b/content/applications/websites/website/web_design/building_blocks/structure/inline-text.png deleted file mode 100644 index 914e1c1212..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/structure/inline-text.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/structure/masonry-template.png b/content/applications/websites/website/web_design/building_blocks/structure/masonry-template.png deleted file mode 100644 index b9948ee389..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/structure/masonry-template.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/structure/masonry-text-box.png b/content/applications/websites/website/web_design/building_blocks/structure/masonry-text-box.png deleted file mode 100644 index bdaa7af7bf..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/structure/masonry-text-box.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/building_blocks/superimpose-images-to-text.png b/content/applications/websites/website/web_design/building_blocks/superimpose-images-to-text.png deleted file mode 100644 index 8dee0f1a99..0000000000 Binary files a/content/applications/websites/website/web_design/building_blocks/superimpose-images-to-text.png and /dev/null differ diff --git a/content/applications/websites/website/web_design/elements.rst b/content/applications/websites/website/web_design/elements.rst index 8cab451e38..04a17784dc 100644 --- a/content/applications/websites/website/web_design/elements.rst +++ b/content/applications/websites/website/web_design/elements.rst @@ -114,7 +114,8 @@ Links Links are used to connect different pages and resources, guiding visitors and improving navigation. To add a link, type `/link`, then, in the pop-up that opens, enter the link's :guilabel:`Label` and -add the :guilabel:`URL or Email`. Type `/` to search for a page and `#` to link to an anchor. +add the :guilabel:`URL or Email`. Type `/` to search for a page and `#` to link to an :ref:`anchor +`. .. tip:: By default, the :guilabel:`Style` field is set to :guilabel:`Link`. Select a different style to diff --git a/content/applications/websites/website/web_design/themes.rst b/content/applications/websites/website/web_design/themes.rst index 2d6bf10b74..65cee5998c 100644 --- a/content/applications/websites/website/web_design/themes.rst +++ b/content/applications/websites/website/web_design/themes.rst @@ -134,6 +134,8 @@ a Custom Font` at the bottom of the dropdown menu. In the pop-up window: Once done, click on :guilabel:`Save and Reload`. +.. _website/themes/button-styles: + Button styles ============= @@ -143,6 +145,7 @@ To customize the style of your website's primary and secondary buttons, navigate - Click the arrow next to the :guilabel:`Primary Style` or :guilabel:`Secondary Style` fields and select one of the available styles for each type of button: :guilabel:`Fill`, :guilabel:`Outline`, or :guilabel:`Flat`. When selecting :guilabel:`Outline`, the :guilabel:`Border Width` option + appears below, allowing you to adjust the width of the button's outline. - :ref:`Modify the fonts `. - Adjust the :guilabel:`Padding` to change the size of the spacing (in pixels) around the buttons' labels. diff --git a/content/applications/websites/website/web_design/visibility.rst b/content/applications/websites/website/web_design/visibility.rst new file mode 100644 index 0000000000..10a9b0685f --- /dev/null +++ b/content/applications/websites/website/web_design/visibility.rst @@ -0,0 +1,104 @@ +========== +Visibility +========== + +You can choose to display or hide building blocks based on a visitor's: + +- device type (mobile or computer), +- country (IP-based geolocation), +- website language, +- :doc:`UTM parameters <../reporting/link_tracker>`, and +- login state. + +.. _website/visibility/mobile-and-computer: + +Mobile/computer +=============== + +.. role:: raw-html(raw) + :format: html + +.. |desktop icon| replace:: :raw-html:`` + +.. |mobile icon| replace:: :raw-html:`` + +To toggle the visibility of a building block based on the visitor's device type: + +- Open the website editor and select a block. +- In the :guilabel:`Customize` tab, under the block's customization options, look for + :guilabel:`Visibility`. + + - Click the |desktop icon| (:guilabel:`Show/Hide on Desktop`) button to hide + the block for users visiting your website from a computer. + - Click the |mobile icon| (:guilabel:`Show/Hide on Mobile`) button to hide the block + for users visiting your website from a mobile device. + +- Click :guilabel:`Save` to apply the changes. + +It is also sometimes possible to hide elements within blocks. It is mostly used to hide specific +elements inside blocks that may be too wide to be correctly displayed on mobile devices. To see if +the option is available, select an element within a block and look for the :guilabel:`Visibility` +option under the element's customization option. + +.. example:: + The selected image is hidden on mobile devices. + + .. image:: visibility/element-visibility.png + :alt: Example of an column element hidden on mobile devices + +.. _website/visibility/conditions: + +Conditions +========== + +To access the country, website language, UTM parameters, and login state conditions: + +- Open the website editor and select a building block. +- In the :guilabel:`Customize` tab, look for :guilabel:`Visibility`. +- Click :guilabel:`No condition` and select :guilabel:`Conditionally` instead to display the + different options: + + - :guilabel:`Country`: the country of the visitor's IP address. + - :guilabel:`Languages`: the website language used by the visitor. + + .. note:: + This option is only available if more than one :doc:`language is installed + <../configuration/translate>`. + + - :guilabel:`UTM Campaign`: the selected campaign. + - :guilabel:`UTM Medium`: the selected medium of any campaign. + - :guilabel:`UTM Source`: the selected source of any campaign. + - :guilabel:`Users`: select whether the visitor should be :guilabel:`Logged In` or + :guilabel:`Logged Out` to view the block. By default, the option is set to :guilabel:`Visible + for Everyone`. + +- For one or more of the first five options, choose if the block should be :guilabel:`Visible for` + or :guilabel:`Hidden for`, then click :guilabel:`Choose a record...` and select it. + +.. tip:: + - You can select multiple records for each option by clicking :guilabel:`Choose a record...` + again. + - Click the :icon:`fa-minus` (:guilabel:`remove`) button to remove an option. + +Click :guilabel:`Save` to apply the changes. + +.. example:: + A block with the following configuration will only be displayed to visitors with a Belgian IP + address, for which the website is displayed in French, unless they visit the page using the + `Sales` campaign tracked URL. + + .. image:: visibility/visibility-conditions.png + :alt: Example of a block configured with several visibility conditions + +.. _website/visibility/invisible-elements: + +Invisible elements +================== + +Blocks and elements with custom visibility settings are listed at the bottom of the website editor +sidebar. You can preview how the page would look like by clicking the :icon:`fa-eye` +(:guilabel:`visible`) button to hide a block or element, or the :icon:`fa-eye-slash` +(:guilabel:`hidden`) to show it in the website editor. + +.. image:: visibility/invisible-elements.png + :alt: Blocks and elements with custom visibility settings displayed at the bottom of the editor diff --git a/content/applications/websites/website/web_design/visibility/element-visibility.png b/content/applications/websites/website/web_design/visibility/element-visibility.png new file mode 100644 index 0000000000..2a55e67ec8 Binary files /dev/null and b/content/applications/websites/website/web_design/visibility/element-visibility.png differ diff --git a/content/applications/websites/website/web_design/visibility/invisible-elements.png b/content/applications/websites/website/web_design/visibility/invisible-elements.png new file mode 100644 index 0000000000..12316c9b48 Binary files /dev/null and b/content/applications/websites/website/web_design/visibility/invisible-elements.png differ diff --git a/content/applications/websites/website/web_design/visibility/visibility-conditions.png b/content/applications/websites/website/web_design/visibility/visibility-conditions.png new file mode 100644 index 0000000000..450ab06d74 Binary files /dev/null and b/content/applications/websites/website/web_design/visibility/visibility-conditions.png differ diff --git a/content/contributing.rst b/content/contributing.rst index dc141711ff..f052074ea8 100644 --- a/content/contributing.rst +++ b/content/contributing.rst @@ -40,7 +40,7 @@ lists the most important of them. - Users of Odoo * - Translate Odoo - Translate the user interface and documentation of Odoo into different languages. - - * `Odoo project on Transifex `_ + - * `Odoo Translations `_ - Anyone fluent in multiple languages * - Contribute to the codebase - Submit pull requests to the Odoo GitHub repositories to fix bugs, add new features, or diff --git a/content/contributing/development/coding_guidelines.rst b/content/contributing/development/coding_guidelines.rst index afc540ce68..d6736e8233 100644 --- a/content/contributing/development/coding_guidelines.rst +++ b/content/contributing/development/coding_guidelines.rst @@ -28,6 +28,11 @@ These guidelines should be applied to every new module and to all new developmen Module structure ================ +.. warning:: + + For modules developed by the community, it is strongly recommended to name + your module with a prefix like your company name. + Directories ----------- @@ -872,7 +877,7 @@ Symbols and Conventions - When defining *report* model (SQL views e.i.) : use ``.report.``, based on the Transient convention. -- Odoo Python Class : use camelcase (Object-oriented style). +- Odoo Python Class : use Pascal case (Object-oriented style). .. code-block:: python @@ -881,7 +886,7 @@ Symbols and Conventions ... - Variable name : - - use camelcase for model variable + - use Pascal case for model variable - use underscore lowercase notation for common variable. - suffix your variable name with *_id* or *_ids* if it contains a record id or list of id. Don't use ``partner_id`` to contain a record of res.partner @@ -1012,7 +1017,7 @@ Javascript coding guidelines - ``use strict;`` is recommended for all javascript files - Use a linter (jshint, ...) - Never add minified Javascript Libraries -- Use camelcase for class declaration +- Use Pascal case for class declaration More precise JS guidelines are detailed in the `github wiki `_. You may also have a look at existing API in Javascript by looking Javascript diff --git a/content/contributing/development/git_guidelines.rst b/content/contributing/development/git_guidelines.rst index 9323555f14..c5a9f1a52b 100644 --- a/content/contributing/development/git_guidelines.rst +++ b/content/contributing/development/git_guidelines.rst @@ -66,6 +66,8 @@ Tags are used to prefix your commit. They should be one of the following - **[CLA]** for signing the Odoo Individual Contributor License; - **[I18N]** for changes in translation files; - **[PERF]** for performance patches; +- **[CLN]** for code cleanup; +- **[LINT]** for linting passes; After tag comes the modified module name. Use the technical name as functional name may change with time. If several modules are modified, list them or use diff --git a/content/contributing/documentation/rst_guidelines.rst b/content/contributing/documentation/rst_guidelines.rst index 3496db4ea7..2c3d9830d9 100644 --- a/content/contributing/documentation/rst_guidelines.rst +++ b/content/contributing/documentation/rst_guidelines.rst @@ -415,21 +415,28 @@ Use the `command` markup to highlight a command. Icons ----- -Use the `icon` markup to add the class name of an icon. There are two icon sets used in Odoo: -`FontAwesome4 `_ and :doc:`Odoo UI -`. Follow the icon with its name as a -:ref:`contributing/rst/guilabel` in brackets as a descriptor. +Use the `icon` markup to add the class name of an icon. There are three icon sets used in Odoo: +`FontAwesome4 `_ (`fa-*`), :ref:`Odoo UI ` +(`oi-*`) and :ref:`Odoo Spreadsheet ` (`os-*`) icons. + +Follow the icon with its name as a :ref:`contributing/rst/guilabel` in brackets as a descriptor. .. list-table:: - :class: o-showcase-table + :class: o-showcase-table + + * - The graph view is represented by the :icon:`fa-area-chart` :guilabel:`(area chart)` icon. - * - The graph view is represented by the :icon:`fa-area-chart` :guilabel:`(area chart)` icon. The - pivot view is represented by the :icon:`oi-view-pivot` icon. + The pivot view is represented by the :icon:`oi-view-pivot` :guilabel:`(pivot table)` icon. - * - .. code-block:: text + Use :icon:`os-global-filters` :guilabel:`(global filters)` in Odoo **Spreadsheet**. + + * - .. code-block:: text - The graph view is represented by the :icon:`fa-area-chart` :guilabel:`(area chart)` icon. - The pivot view is represented by the :icon:`oi-view-pivot` icon. + The graph view is represented by the :icon:`fa-area-chart` :guilabel:`(area chart)` icon. + + The pivot view is represented by the :icon:`oi-view-pivot` icon. + + Use :icon:`os-global-filters` :guilabel:`(global filters)` in Odoo **Spreadsheet**. .. _contributing/rst/lists: @@ -714,9 +721,9 @@ See also * - .. code-block:: text .. seealso:: - - :doc:`Accounting documentation <../../../applications/finance/accounting>` - - :doc:`../../../applications/sales/sales/invoicing/proforma` - - `Google documentation on setting up Analytics for a website `_ + - :doc:`Accounting documentation <../../../applications/finance/accounting>` + - :doc:`../../../applications/sales/sales/invoicing/proforma` + - `Google documentation on setting up Analytics for a website `_ .. _contributing/rst/note: diff --git a/content/developer/howtos/translations.rst b/content/developer/howtos/translations.rst index 572c977783..fdddf39615 100644 --- a/content/developer/howtos/translations.rst +++ b/content/developer/howtos/translations.rst @@ -144,7 +144,7 @@ functions or python comprehensions. Lazy translations are bound to the module during their creation and the language is resolved when evaluating using ``str()``. -Note that you can also pass a lazy translation to ``Envionrment._`` +Note that you can also pass a lazy translation to ``Environment._`` to translate it without any magic language resolution. Variables @@ -176,8 +176,8 @@ Blocks **Do** keep in one block, giving the full context to translators:: # good, allow to change position of the number in the translation - _("You have %s invoices wainting") % len(invoices) - _.str.sprintf(_t("You have %s invoices wainting"), invoices.length); + _("You have %s invoices waiting") % len(invoices) + _.str.sprintf(_t("You have %s invoices waiting"), invoices.length); # good, full sentence is understandable _("Reference of the document that generated " + \ diff --git a/content/developer/howtos/website_themes/building_blocks.rst b/content/developer/howtos/website_themes/building_blocks.rst index ef55192b14..9ec06bc10d 100644 --- a/content/developer/howtos/website_themes/building_blocks.rst +++ b/content/developer/howtos/website_themes/building_blocks.rst @@ -476,7 +476,7 @@ page, directly from the edit panel. 2. Group creation ~~~~~~~~~~~~~~~~~ -Add a group at the top of the list (feel free to the put it where needed in this list). +Add a group at the top of the list (feel free to put it where needed in this list). .. code-block:: xml :caption: ``/website_airproof/views/snippets/options.xml`` diff --git a/content/developer/howtos/website_themes/going_live.rst b/content/developer/howtos/website_themes/going_live.rst index 893b969739..2c0134942a 100644 --- a/content/developer/howtos/website_themes/going_live.rst +++ b/content/developer/howtos/website_themes/going_live.rst @@ -62,8 +62,8 @@ redirects as well as your domain name. **SEO & Redirects** - - :doc:`../../../applications/websites/website/pages/seo` - - :ref:`website/URL-redirection` + - :doc:`/applications/websites/website/structure/seo` + - :ref:`website/pages/URL-redirection` **Domain name** diff --git a/content/developer/howtos/website_themes/layout.rst b/content/developer/howtos/website_themes/layout.rst index 63a371dc75..3d945ad961 100644 --- a/content/developer/howtos/website_themes/layout.rst +++ b/content/developer/howtos/website_themes/layout.rst @@ -434,7 +434,8 @@ Custom Create your own template and add it to the list. .. important:: - Don't forget that you may need to disable the active header template first. + Don't forget that you may need to disable the active header template first before enabling the + custom one. **Option** @@ -443,11 +444,11 @@ Use the following code to add an option for your new custom header on the Websit .. code-block:: xml :caption: ``/website_airproof/views/website_templates.xml`` -