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..d9dcf4ac40 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.4 endif ifneq ($(CURRENT_LANG),en) HTML_BUILD_DIR := $(HTML_BUILD_DIR)/$(CURRENT_LANG) diff --git a/conf.py b/conf.py index 6e7c5d4594..27d698b95d 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.4' # `current_branch` is the technical name of the current branch. # E.g., saas-15.4 -> saas-15.4; 12.0 -> 12.0, master -> master (*). @@ -232,11 +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", } @@ -331,29 +331,29 @@ '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'), ] 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..5d16c073ce 100644 --- a/content/administration/odoo_online.rst +++ b/content/administration/odoo_online.rst @@ -79,8 +79,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/supported_versions.rst b/content/administration/supported_versions.rst index e893e777d7..2ff7f19731 100644 --- a/content/administration/supported_versions.rst +++ b/content/administration/supported_versions.rst @@ -31,54 +31,48 @@ This matrix shows the support status of every version. - On-Premise - Release date - End of support - * - Odoo SaaS 18.3 + * - **Odoo 19.0** + - |green| - |green| + - |green| + - September 2025 + - September 2028 (planned) + * - Odoo SaaS 18.4 + - |red| - N/A - N/A - - May 2025 + - July 2025 - - * - Odoo SaaS 18.2 - - |green| + * - Odoo SaaS 18.3 + - |red| - N/A - N/A - - March 2025 + - May 2025 - - * - Odoo SaaS 18.1 - - |green| + * - Odoo SaaS 18.2 + - |red| - N/A - N/A - - January 2025 + - March 2025 - * - **Odoo 18.0** - |green| - |green| - |green| - October 2024 - - October 2027 (planned) - * - Odoo SaaS 17.4 - - |red| - - N/A - - N/A - - July 2024 - - October 2024 - * - Odoo SaaS 17.2 - - |red| - - N/A - - N/A - - April 2024 - - 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/property_fields.rst b/content/applications/essentials/property_fields.rst new file mode 100644 index 0000000000..3d5b6531b9 --- /dev/null +++ b/content/applications/essentials/property_fields.rst @@ -0,0 +1,202 @@ +=============== +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:`Edit 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. + * - :guilabel:`Multiline Text` + - Full text on multiple lines + - Enter a :guilabel:`Default Value` if desired. + * - :ref:`HTML ` + - HTML field + - 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. + +.. 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:`Approvals` + - Approval Request + - Category + * - :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..95c1e383ea 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 remove 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 remove 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 90e2d2c6df..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,7 +198,9 @@ real-time: | +----------------------------------+ | | Cash flow statement | | +----------------------------------+ -| | Tax report | +| | Executive summary | +| +----------------------------------+ +| | Tax return | | +----------------------------------+ | | EC sales list | +------------+----------------------------------+ @@ -152,7 +208,7 @@ real-time: | +----------------------------------+ | | 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 533259f9f5..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 8fd7656140..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 7ec7f38ccb..8517c83d99 100644 --- a/content/applications/finance/accounting/customer_invoices/electronic_invoicing.rst +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing.rst @@ -4,299 +4,258 @@ 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:`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. +By default, the format available in the :ref:`send window ` +depends on the customer's country. -.. image:: electronic_invoicing/customer-form.png - :alt: Select an EDI format for a specific customer +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. -National electronic invoicing ------------------------------ +.. _accounting/e-invoicing/generation: -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. +E-invoice 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. +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-invoicing/generation: - -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. - -.. _e-invoicing/peppol: +.. _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). -.. _e-invoicing/peppol-registration: +.. _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, :ref:`deregister from + the demo mode ` and :ref:`register + ` in production. -.. image:: electronic_invoicing/peppol-phone-verification.png - :alt: phone validation +.. _accounting/e-invoicing/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. +Contact verification +-------------------- -Then, set the default journal for receiving vendor bills in the :guilabel:`Incoming Invoices -Journal`. +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: -.. 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. +#. 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: -Your receiver application status should be updated soon after you are registered on the Peppol -network. + - :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. -.. image:: electronic_invoicing/peppol-receiver.png - :alt: receiver application +#. 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. -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/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/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/get_started.rst b/content/applications/finance/accounting/get_started.rst index 4341b0b4c4..5b9b5569ad 100644 --- a/content/applications/finance/accounting/get_started.rst +++ b/content/applications/finance/accounting/get_started.rst @@ -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 eba7abcf4c..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: 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 d6994482d8..df127e0b32 100644 --- a/content/applications/finance/accounting/payments.rst +++ b/content/applications/finance/accounting/payments.rst @@ -113,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 @@ -130,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`. @@ -172,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. diff --git a/content/applications/finance/accounting/payments/batch.rst b/content/applications/finance/accounting/payments/batch.rst index a3ddceedcc..71792fa9c0 100644 --- a/content/applications/finance/accounting/payments/batch.rst +++ b/content/applications/finance/accounting/payments/batch.rst @@ -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/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..1fb5dbdaef 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:`Update`. 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/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 c39096b36d..12c6379b1a 100644 --- a/content/applications/finance/accounting/vendor_bills.rst +++ b/content/applications/finance/accounting/vendor_bills.rst @@ -38,18 +38,17 @@ click :guilabel:`New`. Automatically ------------- -Vendor bills can be automatically created through various methods: - -- Emailing to an :ref:`email alias ` associated with the purchase - journal. If the email does not contain a valid file, an automatic response notifies the sender - that no document was received. -- Uploading a PDF: To upload a bill, go to :menuselection:`Accounting --> Vendors --> Bills`, then - click :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. + - 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. @@ -62,6 +61,10 @@ options: - :guilabel:`Ask after 3 validations without edits` - :guilabel:`Never` +.. seealso:: + :ref:`Vendor bills matching with purchase orders + ` + .. _accounting/vendor_bills/bill-completion: Bill completion 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/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/esg.rst b/content/applications/finance/esg.rst new file mode 100644 index 0000000000..75a533f3bd --- /dev/null +++ b/content/applications/finance/esg.rst @@ -0,0 +1,332 @@ +=== +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 + +To add the data to the emitted emissions, click :guilabel:`Add Emissions`, define the +:guilabel:`Emissions Period` that should be covered, and click :guilabel:`Save`. + +.. _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`. + +Sex parity and pay gap +====================== + +Sex parity tracks the distribution of sexes 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 sex parity and pay gap measures, set the sex 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 --> Sex 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/sex-graph-group-by.png + :alt: The sex parity graph filtering options + +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..667557b895 Binary files /dev/null and b/content/applications/finance/esg/employee-commuting-pivot.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/esg/sex-graph-group-by.png b/content/applications/finance/esg/sex-graph-group-by.png new file mode 100644 index 0000000000..f9c08cd681 Binary files /dev/null and b/content/applications/finance/esg/sex-graph-group-by.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 56064c5e6c..ef32ded339 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: @@ -576,8 +576,8 @@ IoT box, you must contact us through our `support contact form ` it to your database. To verify that the IoT Box recognizes the FDM, go to the IoT homepage and scroll down the diff --git a/content/applications/finance/fiscal_localizations/brazil.rst b/content/applications/finance/fiscal_localizations/brazil.rst index 0a21479cd6..6dbc821bce 100644 --- a/content/applications/finance/fiscal_localizations/brazil.rst +++ b/content/applications/finance/fiscal_localizations/brazil.rst @@ -89,27 +89,8 @@ local fiscal and accounting regulations: to Brazilian accounting standards - :ref:`Taxes `: pre-configured tax rates, including standard VAT, zero-rated, and exempt options. -- :ref:`Products ` -- :ref:`Contacts ` -- :ref:`Fiscal positions `: automated tax adjustments based - on customer or supplier registration status. - :doc:`Payroll ` - :doc:`Reporting <../accounting/reporting>` -- :ref:`AvaTax integration ` -- :ref:`Tax computation ` - -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, configure the -:ref:`contacts `, :ref:`company -`, and :ref:`products ` -and :ref:`create an account in AvaTax ` in the general -settings. - -For the services taxes, create and configure them from Odoo directly without computing them with -AvaTax. .. _localizations/brazil/chart-of-accounts: @@ -136,64 +117,19 @@ Taxes used for services must be manually added and configured, as the rate may d the city where the service is offered. .. important:: - For service taxes created manually, NFS-e can't be issued. To electronically send an NFS-e, - compute taxes using Avalara. + NFS-e can't be issued for service taxes created manually. To :ref:`electronically send an NFS-e + `, compute taxes using Avalara. .. 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. However, the account - used to register the tax must be re-configured in the tax's :guilabel:`Definition` tab, under + 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. -.. seealso:: - :doc:`Taxes functional documentation <../accounting/taxes>` - -.. _localizations/brazil/products: - -Products --------- - -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. - -E-Invoice for goods (NF-e) -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- :guilabel:`CEST Code`: code for products subject to ICMS tax substitution -- :guilabel:`Mercosul NCM Code`: Mercosur Common Nomenclature Product Code -- :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 SPED list table -- :guilabel:`Purpose of Use`: intended purpose of use for this product - -.. image:: brazil/product-configuration.png - :alt: Product configuration. - -.. note:: - Odoo automatically creates three products to be used for transportation costs associated with - 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: - - - :guilabel:`Product Type` :guilabel:`Service` - - :guilabel:`Transportation Cost Type`: :guilabel:`Insurance`, :guilabel:`Freight`, or - :guilabel:`Other Costs` - -E-Invoice for services (NFS-e) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- :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 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. - .. _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 `: @@ -214,37 +150,28 @@ To use all the features of this fiscal localization, the following fields are re - :guilabel:`Phone` - :guilabel:`Email` - .. image:: brazil/contact-configuration.png - :alt: Company configuration. - 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: - - 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 - .. image:: brazil/contact-fiscal-configuration-nfse.png - :alt: Company fiscal configuration for NFSe. - -.. note:: - If it is a simplified regime, the ICMS rate under :menuselection:`Accounting --> Configuration - --> Settings --> Taxes --> AvaTax Brazil` must be configured. +.. 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. The same configuration applies to the relevant :doc:`contact <../../essentials/contacts>` form when using the AvaTax integration. @@ -253,72 +180,58 @@ using the AvaTax integration. Select the :guilabel:`Company` option for a contact with a tax ID (CNPJ), or check :guilabel:`Individual` for a contact with a CPF. -.. _localizations/brazil/fiscal-positions: - -Fiscal positions ----------------- - -To compute taxes and send electronic invoices on sales orders and invoices, both the -:guilabel:`Detect Automatically` and the :guilabel:`Use AvaTax Brazil API` options need to be -enabled in the :guilabel:`Fiscal Position`. To do so, go to :menuselection:`Accounting --> -Configuration --> Fiscal Positions`. Then, open :guilabel:`Automatic Tax Mapping (Avalara Brazil)` -and update it accordingly. - -.. image:: brazil/fiscal-position-configuration.png - :alt: Fiscal position configuration - -The :doc:`fiscal positions <../accounting/taxes/fiscal_positions>` can be configured: - -- either on the :ref:`contact `, in the :guilabel:`Sales - & Purchase` tab under the :guilabel:`Fiscal Information` section; -- or when creating a sales order or an invoice, in the :guilabel:`Other Info` tab under the - :guilabel:`Invoicing` or :guilabel:`Accounting` section. - .. _localizations/brazil/avatax-account: AvaTax integration ------------------- - -Avalara AvaTax is a tax calculation and electronic invoicing provider that can be integrated into -Odoo to compute taxes automatically. It considers 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. - -This integration requires :doc:`In-App-Purchases (IAPs) <../../essentials/in_app_purchase>` to -compute taxes and send electronic invoices. To 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 the `IAP credit balance -`_. +================== .. note:: + - Make sure to :ref:`install ` the :guilabel:`AvaTax Brazil` (`l10n_br_avatax`) + module. - Odoo is a certified partner of Avalara Brazil. - - Buy `IAP credits 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. -.. seealso:: - :doc:`In-App-Purchases (IAPs) <../../essentials/in_app_purchase>` +To compute the goods and services tax and process electronic invoices, the following configurations +are needed: -.. _localizations/brazil/credential-configuration: +- :ref:`Company ` +- :ref:`Contacts ` +- :ref:`AvaTax configuration`. +- :ref:`A1 digital certificate ` +- :ref:`Tax mapping ` +- :ref:`Products ` + +.. _localizations/brazil/avatax-configuration: + +Configuration +------------- -Credential configuration -~~~~~~~~~~~~~~~~~~~~~~~~ +.. _localizations/brazil/avatax-credentials: -To activate AvaTax in Odoo, an account must be created. To do so, go to :menuselection:`Accounting ---> Configuration --> Settings --> Taxes`. In the :guilabel:`AvaTax Brazil` section, add the -administration Email address for the AvaTax portal in :guilabel:`AvaTax Portal Email`, and click -:icon:`fa-plug` :guilabel:`Create account`. +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 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 the account is created from Odoo, select the right environment. Moreover, the Email used to + 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. @@ -329,18 +242,16 @@ After the account is created from Odoo, go to the Avalara Portal to set up the p #. Access the `Avalara portal `_. #. Click :guilabel:`Meu primeiro acesso`. -#. Add the Email address used in Odoo to create the Avalara/AvaTax account, and click +#. Add the email address used in Odoo to create the Avalara/AvaTax account, and click :guilabel:`Solicitar Senha`. -#. An Email will then be received with a token and a link to create a password. Click on this link +#. 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:: - Start using AvaTax in Odoo for tax computation **only**, without creating a password and - accessing the Avalara portal in the Odoo database. However, to use the electronic invoice - service, you **must** access the AvaTax portal and upload the 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:: |API| credentials can be transferred. This option should be used only when an account has already @@ -355,8 +266,8 @@ To issue electronic invoices, a certificate must be uploaded to the `AvaTax port `_. 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. +AvaTax portal matches, without special characters, with the CNPJ number, and the identification +number (CNPJ) in Odoo matches the CNPJ in AvaTax. .. important:: Some cities require the certificate to be linked within the City Portal system before issuing @@ -365,17 +276,144 @@ identification number (CNPJ) in Odoo matches the CNPJ in AvaTax. 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. +.. _localizations/brazil/fiscal-positions: + +Fiscal positions +~~~~~~~~~~~~~~~~ + +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. + +.. seealso:: + :doc:`Fiscal positions <../accounting/taxes/fiscal_positions>` + +.. _localizations/brazil/products: + +Products +~~~~~~~~ + +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. + +.. _localizations/brazil/e-invoice-goods: + +E-invoices for goods (NF-e) +*************************** + +.. 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: + + **Sales application** + + - Tax calculation on quotations and sales orders. + + **Accounting application** + + - Tax calculation on invoices. + - Electronic invoice submission (NF-e or NFS-e). + + **Occasional operations**: (each step is billed separately) + + - :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. + +.. 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`: 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 :guilabel:`Freight`, :guilabel:`Insurance`, and :guilabel:`Other Costs` + and are already configured. If more need to be created, duplicate and use the same configuration: + + - :guilabel:`Product Type` :guilabel:`Service` + - :guilabel:`Transportation Cost Type`: :guilabel:`Insurance`, :guilabel:`Freight`, or + :guilabel:`Other Costs` + +.. _localizations/brazil/e-invoice-services: + +E-invoices for services (NFS-e) +******************************* + +.. 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: + + **Sales application** + + - Tax calculation on quotations and sales orders. + + **Accounting application** + + - 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). + + **Occasional operations**: (each step is billed separately) + + - :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. + +.. 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:`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. + .. _localizations/brazil/tax-computation: Tax computation --------------- -.. warning:: - Actions that trigger |API| calls for tax computation come with a cost. Be mindful of the - actions that trigger these calls to manage costs effectively. - .. seealso:: - :doc:`In-App-Purchases (IAPs) <../../essentials/in_app_purchase>` + :ref:`Tax calculation ` .. _localizations/brazil/tax-calculations: @@ -392,7 +430,7 @@ any of the following ways: - **Preview** Click :guilabel:`Preview`. - **Email a quotation/sales order** - Send a quotation or sales order to a customer via Email. + 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. @@ -437,17 +475,14 @@ 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 assigned for each series. +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?` field is selected on the journal. +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. -.. image:: brazil/journal-configuration.png - :alt: Journal configuration with the Use Documents? field checked. - .. 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 @@ -461,12 +496,12 @@ Customer invoices 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: -- :guilabel:`Customer`, with all the customer information -- :guilabel:`Payment Method: Brazil`: how the invoice is planned to be paid. -- :guilabel:`Document Type` set as :guilabel:`(55) Electronic Invoice (NF-e)` or :guilabel:`(SE) +- :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)`. -And in the :guilabel:`Other Info` tab: +:guilabel:`Other Info` tab: - :guilabel:`Fiscal Position` set as :guilabel:`Automatic Tax Mapping (Avalara Brazil)`. @@ -477,42 +512,34 @@ government when the invoice is submitted: - :guilabel:`Freight Model` determines how the goods are planned to be transported - domestic. - :guilabel:`Transporter Brazil` determines who is doing the transportation. -.. image:: brazil/invoice-info-needed.png - :alt: Invoice information needed to process an electronic invoice. - -.. 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 - :guilabel:`Download` or :guilabel:`Email`. Finally, click +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 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, allocated as the first number to be used sequentially for subsequent invoices. + 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, a credit note can be created in Odoo and 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 that were not accurately provided in the -original invoice need to be corrected, a debit note can be issued. +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). @@ -521,9 +548,6 @@ original invoice need to be corrected, a debit note can be issued. 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 @@ -542,10 +566,7 @@ E-invoices for goods (NF-e) 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. - -.. image:: brazil/invoice-cancellation.png - :alt: Invoice cancellation reason in Odoo. +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 @@ -556,9 +577,9 @@ customer via Email, enable the :guilabel:`E-mail` checkbox. E-invoices for services (NFS-e) ******************************* -To cancel an e-invoice for services (NFS-e) in Odoo, click :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: @@ -569,40 +590,29 @@ Correction letter A correction letter can be created and linked to an electronic invoice for goods (NF-e) that the government validated. -To do so in Odoo, click :guilabel:`Correction Letter` and add a correction :guilabel:`Reason` on the -pop-up that appears. To send the correction reason to a customer via Email, enable the -:guilabel:`E-mail` checkbox. - -.. 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). -.. _localizations/brazil/invalidate-invoice-number: +.. _localizations/brazil/invoice-number-invalidation: -Invalidate invoice number range -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +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, open the journal, -click the :icon:`fa-cog` (gear) icon, and select :guilabel:`Invalidate Number Range (BR)`. On the +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). - .. note:: - The journal's chatter records the log of the cancelled numbers, along with the XML file. + - 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. .. _localizations/brazil/vendor-bills: @@ -610,12 +620,12 @@ Vendor bills ------------ When receiving an invoice from a supplier, 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 `. +information and the same Brazilian-specific information recorded on the :ref:`customer invoices +`. These Brazilian-specific fields are: -- :guilabel:`Payment Method: Brazil`: how the invoice is planned to be paid +- :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 @@ -626,14 +636,27 @@ These Brazilian-specific fields are: 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 app**. +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>` @@ -643,83 +666,73 @@ Configuration ------------- :ref:`Install ` the :guilabel:`Brazilian Accounting EDI for POS` (`l10nbr_edi_pos`) -module. +module and make sure to activate :doc:`AvaTax <../accounting/taxes/avatax>`. .. _localizations/brazil/pos-csc-details: CSC details ----------- -Go to :menuselection:`Accounting --> Configuration --> Settings`, scroll to the :guilabel:`Taxes` +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 your state's website of State Department of - Finance (SEFAZ). + 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. + Brazilian State by the company's accountant. .. _localizations/brazil/pos-product: Product configuration --------------------- -First, :doc:`create a new product in POS <../../sales/point_of_sale/configuration>`, then in the -:guilabel:`Sales` tab, configure the following :guilabel:`Brazil Accounting` fields: - -- :guilabel:`CEST Code`: A tax classification code identifying goods and products subject to tax - substitution under ICMS regulations. It helps determine the applicable tax treatment and - procedures for specific items. Check if the product is subject to this at - https://www.codigocest.com.br/. -- :guilabel:`Mercosul NCM Code`: NCM (Nomenclatura Comun do Mercosul) code from the Mercosur list. -- :guilabel:`Source of Origin`: Indicates whether the product is of foreign or national origin, with - different variations and characteristics depending on the product use case. -- :guilabel:`SPED Fiscal Product Type`: Fiscal product type according to the SPED list table. -- :guilabel:`Purpose of Use`: Shows what this product is used for. +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: -Shop configuration ------------------- - -Go to :menuselection:`Point of Sale --> Configuration --> Point of Sales` and create a -:guilabel:`New` shop. Choose an internal name for the new POS and save. +Point of sale +------------- -Then, go to :menuselection:`Point of Sale --> Configuration --> Settings` and make sure that the -correct 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: +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`. -.. note:: - For the production environment, make sure that this information is updated. +.. _localizations/brazil/pos-workflow: + +Workflow +-------- .. _localizations/brazil/generate-nfc-e: Generating an NFC-e -------------------- +~~~~~~~~~~~~~~~~~~~ -First, :ref:`open the Shop and make a sale `. +To generate an NFC-e, follow these steps: -After validating the payment, Odoo calculates taxes and issues an NFC-e. The valid NFC-e appears on -the right side of the screen. +#. :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 if they are already - registered, or click :guilabel:`Create`. + 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: @@ -727,49 +740,39 @@ the right side of the screen. - :guilabel:`City` and :guilabel:`State` where the invoice is being issued - :guilabel:`CPF/CNPJ` -After saving the register, click :guilabel:`Validate`. The NFC-e appears, highlighting the -customer's CPF on the print. - -Finally, select one of the two options to deliver the invoice to the customer: - -- :guilabel:`Print` -- :guilabel:`Send via e-mail` +#. 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. -.. example:: - .. figure:: brazil/l10n-br-nfc-e-print.png - :alt: Printed NFC-e ticket example. - - This is the DANFC-e, the print of NFC-e when it is successfully issued, and shows all the - important information that is legally required. - -.. tip:: - #. Using an :doc:`Odoo IoT Box <../../general/iot>` to integrate the print NFC-e through the - **Point of Sale** app is unnecessary. - #. The Odoo NFC-e feature works with any thermal printer. +.. 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-issue PoS order with NFC-e error ------------------------------------ +Re-issuing a PoS order with an NFC-e error +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -If the NFC-e returns an error, correct the error first. Then, to re-issue the NFC-e, click the -:icon:`fa-bars` :guilabel:`(menu)` icon and select :guilabel:`Orders`. +If the NFC-e returns an error, follow these steps: -Filter the list to show only :guilabel:`Paid` orders and click :guilabel:`Details`. The error will -then be displayed, and the :guilabel:`Send NFC-e` button will be available. +#. 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 was fixed and the PoS Session was closed, Odoo indicates the tax adjustment on that - journal entry in the chatter. The order's journal entry shows that the taxes were not calculated - correctly. In that case, reprocessing the NFC-e is necessary. + 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. @@ -777,28 +780,18 @@ then be displayed, and the :guilabel:`Send NFC-e` button will be available. .. _localizations/brazil/nfc-e-refunds-cancellations: NFC-e refunds & cancellations ------------------------------ - -*Refunds* can be created from Odoo, but *cancellations* must be done from the government portal. - -.. 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*. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -To issue a refund, click the :icon:`fa-bars` :guilabel:`(menu)` icon and select :guilabel:`Orders`. -Filter the list to show only :guilabel:`Paid` orders, open the order, and click :guilabel:`Refund`. - -Choose the :guilabel:`Payment method` and :guilabel:`Amount`, then click :guilabel:`Refund payment`. - -.. note:: - Alternatively, to reimburse and cancel the NFC-e through the backend, go to - :menuselection:`Point of Sale --> Orders --> Orders`. Open the order, select the customer, - and click :guilabel:`Payment` to reimburse. Then click :guilabel:`Invoice` to create the invoice - and issue the *Return of Goods NF-e*. +: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-nfc-e-print.png b/content/applications/finance/fiscal_localizations/brazil/l10n-br-nfc-e-print.png deleted file mode 100644 index 6039e18bcf..0000000000 Binary files a/content/applications/finance/fiscal_localizations/brazil/l10n-br-nfc-e-print.png and /dev/null 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/colombia.rst b/content/applications/finance/fiscal_localizations/colombia.rst index 5ae0cb9702..ae91ba5e64 100644 --- a/content/applications/finance/fiscal_localizations/colombia.rst +++ b/content/applications/finance/fiscal_localizations/colombia.rst @@ -289,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 2142f6990d..9d6575d586 100644 --- a/content/applications/finance/fiscal_localizations/ecuador.rst +++ b/content/applications/finance/fiscal_localizations/ecuador.rst @@ -2,7 +2,7 @@ Ecuador ======= -With the Ecuadorian localization, it is possible to generate electronic documents using XML, fiscal +With the Ecuadorian localization, electronic documents can be generated using XML, fiscal folio, electronic signature, and direct connection to tax authority SRI. The supported documents are invoices, credit notes, debit notes, purchase liquidations, and @@ -18,32 +18,23 @@ each purchase invoice. - :doc:`Documentation on e-invoicing's legality and compliance in Ecuador <../accounting/customer_invoices/electronic_invoicing/ecuador>` -.. _l10n_ec/glossary: - -Glossary -======== - -Here are some terms that are essential to the Ecuadorian localization: - -- **SRI**: Stands for *Servicio de Rentas Internas*, which is 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**: Stands for *Electronic Data Interchange*, which refers to the electronic transmission of - documents. -- **RIMPE**: Stands for *Regimen Simplificado para Emprendedores y Negocios*, which is 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 @@ -54,18 +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 + :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. + 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. @@ -81,15 +72,104 @@ 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:: - In some cases, such as when upgrading to a version with additional modules, it is possible that - those modules may not be installed automatically. Any missing modules can be manually installed. + 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`. -.. _l10n_ec/configure-your-company: +.. _localizations/ecuador/taxes: -Configure a company or individual contact ------------------------------------------ +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>` + +.. _localizations/ecuador/document types: + +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. + +.. _localizations/ecuador/company-contact: + +Company and contact +------------------- .. seealso:: :doc:`Configure a company or individual contact <../../essentials/contacts>` @@ -99,7 +179,7 @@ The following fields should be completed for localization purposes on the contac - :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:`Cedula` or :guilabel:`Passport` number. + 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 @@ -107,8 +187,10 @@ The following fields should be completed for localization purposes on the contac .. 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. + profit withholding ` taxes apply when using this contact + on a vendor bill. + +.. _localizations/ecuador/electronic-documents: Electronic documents -------------------- @@ -136,9 +218,8 @@ Configure the following information, starting with the :guilabel:`Electronic Inv :guilabel:`SRI Connection` section: -- :guilabel:`Certificate file for SRI`: Select the company's :ref:`SRI certificate - `. Click :icon:`oi-arrow-right` :guilabel:`SRI Certificates` to upload one, if - necessary. +- :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. @@ -157,7 +238,7 @@ Configure the following information, starting with the :guilabel:`Electronic Inv - The entered :guilabel:`Credit Card` withholding value is always applied when a credit or debit card SRI payment method is used. -.. _l10n_ec/VAT-withholding: +.. _localizations/ecuador/vat-withholding: VAT withholding --------------- @@ -167,15 +248,15 @@ VAT withholding skip this step. To configure a VAT withholding, go to :menuselection:`Accounting --> Configuration --> Taxpayer Type -SRI`. - -Configure the :guilabel:`Name` of the taxpayer type, the :guilabel:`Goods VAT Withholding`, and the -:guilabel:`Services VAT Withholding`. +SRI`. Then, configure the :guilabel:`Name` of the taxpayer type, the :guilabel:`Goods VAT +Withholding`, and the :guilabel:`Services VAT Withholding`. .. tip:: If the :guilabel:`Taxpayer Type` is :guilabel:`Rimpe`, configure the :guilabel:`Profit Withhold` percentage. +.. _localizations/ecuador/printer-points: + Printer points -------------- @@ -183,10 +264,8 @@ Printer points invoices, 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: +Journals`. For each electronic document, click :guilabel:`New`, and enter the following information +on the journal form: - :guilabel:`Journal Name`: Enter in this format: `[Emission Entity]-[Emission Point] [Document Type]`, e.g., `001-001 Sales Documents`. @@ -213,7 +292,7 @@ in the following fields: - :guilabel:`Short Code`: Enter a unique 5-digit code for the accounting entry sequence (e.g., VT001). -Customer invoices, credit notes, and debit notes need to use the same journal as the +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` @@ -222,6 +301,8 @@ checkbox to enable sending XML/EDI invoices. .. seealso:: :doc:`../accounting/customer_invoices/electronic_invoicing` +.. _localizations/ecuador/withholding: + Withholding ----------- @@ -249,187 +330,165 @@ in the following fields: Finally, in the :guilabel:`Advanced Settings` tab, check the :guilabel:`Electronic invoicing` checkbox to enable sending XML/EDI invoices. -Purchase liquidations ---------------------- +.. _localizations/ecuador/reporting: -A specific journal must be created for *purchase liquidations*. Go to :menuselection:`Accounting --> -Configuration --> Journals`. Click :guilabel:`New`, and enter the following information: +Reporting +--------- -- :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`. +Ecuadorian companies submit fiscal reports to the SRI, with Odoo supporting two main ones: **reports +103** and **104**. -Once the :guilabel:`Type` is selected, complete the following fields: +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)`. -- :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`). +.. _localizations/ecuador/report-103: -Finally, in the :guilabel:`Advanced Settings` tab, check the :guilabel:`Electronic invoicing` -checkbox to enable sending XML/EDI invoices. +Report 103 +~~~~~~~~~~ -Configure master data ---------------------- +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. -Chart of accounts -~~~~~~~~~~~~~~~~~ +.. _localizations/ecuador/report-104: -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*. +Report 104 +~~~~~~~~~~ -Ecuador's chart of accounts is based on the most updated version of the *Superintendency of -Companies*, which is grouped into several categories and is compatible with NIIF accounting. +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. -Accounts can be added or deleted according to the company's needs. +.. _localizations/ecuador/ats: -Products -~~~~~~~~ +ATS report +~~~~~~~~~~ -If products have any withholding taxes, they must be configured on the product form. +To enable downloading the ATS :abbr:`ATS (Anexo Transaccional Simplificado)` report in XML format, +:doc:`install ` the *ATS Report* (`l10n_ec_reports_ats`) module. -Go to :menuselection:`Accounting --> Vendors --> Products`. On the :guilabel:`General Information` -tab, specify both :guilabel:`Purchase Taxes` and :guilabel:`Profit Withhold`. +.. note:: + The Ecuadorian *ATS Report* module depends on the previous installation of the *Accounting* app + and the *Ecuadorian EDI module*. -Taxes -~~~~~ +.. _localizations/ecuador/ats-configuration: -The localization module automatically creates and configures taxes. If new taxes need to be created, -it is recommended to base them on the configuration of the existing ones. +Configuration +************* -To manage taxes, navigate to :menuselection:`Accounting --> Configuration --> Taxes`. Depending on -the tax type, the following options may be required for additional configuration: +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. -- :guilabel:`Tax Name`: Follows a specific format depending on the tax type: +.. _localizations/ecuador/ats-vendor-bills: - - | **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` +Vendor bills +^^^^^^^^^^^^ -- :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. +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. -In the :guilabel:`Definition` tab: +.. _localizations/ecuador/ats-credit-debit-notes: -- :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. +Credit and debit notes +^^^^^^^^^^^^^^^^^^^^^^ -.. seealso:: - :doc:`Configuring taxes <../accounting/taxes>` +When creating a :ref:`credit ` or :ref:`debit +` note manually or through an import, link it to the sales +invoice it modifies. -Document types -~~~~~~~~~~~~~~ +.. 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. -Some accounting transactions like *customer invoices* and *vendor bills* are classified by *document -types*. These are defined by the government fiscal authorities, which in this case is the SRI. +.. _localizations/ecuador/ats-xml-generation: -To access or configure document types, go to :menuselection:`Accounting --> Configuration --> -Document Types`. +XML generation +************** + +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*. -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 in which the document is applicable; also the -data is created automatically when the localization module is installed. +.. 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. -The information required for the document types is included by default and doesn't need to be -changed. +.. _localizations/ecuador/accounting: -Workflows -========= +Accounting +========== -Once a company's database is configured, documents can be registered to enable workflows across -Odoo's applications, such as **Accounting**, **Inventory**, and **Sales**. +.. _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 :doc:`created from your sales order or manually -<../accounting/customer_invoices/overview>`. +Customer invoice +~~~~~~~~~~~~~~~~ -They must contain the following data: +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: - :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. -.. seealso:: - :doc:`Manage customer invoices <../accounting/customer_invoices/overview>` +.. _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. A validated (posted) invoice is necessary to register -a credit note. - -On the invoice, click :guilabel:`Credit note` and complete the following information in the -:guilabel:`Credit note` window: +: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:`Journal`: Select the journal for the reversal. -- :guilabel:`Document Type`: By default, :guilabel:`(04) Credit Note` is selected. -- :guilabel:`Reversal date`: Set the date for the reversal. +Keep the :guilabel:`Document Type` on :guilabel:`(04) Credit Note` in the :guilabel:`Credit note` +window. -Then, click :guilabel:`Reverse` to first review the invoice or click :guilabel:`Reverse and Create -Invoice`. +Filling out a credit note follows the same process as completing an :ref:`invoice +`. .. 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. + number or, by default, Odoo assigns `NotCr 001-001-000000001` as the first credit note number. -Once the credit note is created, modify :guilabel:`Product` and :guilabel:`Quantity` if needed. Make -sure the correct :guilabel:`Customer`, :guilabel:`Journal`, and :guilabel:`Document Type` are -specified, and the products listed on the :guilabel:`Invoice Lines` tab are configured with the -correct taxes. - -To validate, click :guilabel:`Confirm`. +.. _localizations/ecuador/debit-notes: Customer debit note ~~~~~~~~~~~~~~~~~~~ -The :ref:`customer debit note ` is an electronic document -that, when validated, is sent to SRI. - -A validated (posted) invoice is necessary to register a debit note. Select the related invoice to -issue a debit note in the :guilabel:`Invoices` list view, click :icon:`fa-cog` :guilabel:`Actions` -and select :guilabel:`Create Debit Note`. Then, complete the following information in the -:guilabel:`Create Debit Note` window. +: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`: Enter the reason for the debit note. -- :guilabel:`Debit note date`: Set the debit note date. -- :guilabel:`Copy lines`: Select this option 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 - 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. -Then, click :guilabel:`Create Debit Note`. - -The debit note amount can be changed, if desired. +.. _localizations/ecuador/customer-withholdings: Customer withholding ~~~~~~~~~~~~~~~~~~~~ -The :guilabel:`Customer withholding` is a non-electronic document issued by the client in order to -apply a withholding to a 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. -A validated (posted) invoice is necessary to register a customer withholding. On the invoice, click -:guilabel:`Add Withhold` and complete the following information in the :guilabel:`Customer -withholding` window: +On the invoice, click :guilabel:`Add Withhold` and complete the following information in the +:guilabel:`Customer withholding` window: - :guilabel:`Document Number`: Enter the withholding number. - :guilabel:`Withhold Lines`: Select the taxes that the customer is withholding. @@ -437,55 +496,50 @@ withholding` window: Before validating the withholding, review that the amounts for each tax are the same as the original document. -Purchase Documents +.. _localizations/ecuador/purchase-documents: + +Purchase documents ------------------ -.. _l10n_ec/vendor-bills: +.. _localizations/ecuador/vendor-bill: Vendor bill ~~~~~~~~~~~ -:doc:`Vendor bills <../accounting/vendor_bills>` are non-electronic documents issued by vendors when -a company generates a purchase. Vendor bills can be created from purchase orders or manually. +:doc:`Vendor bills <../accounting/vendor_bills>`, non-electronic documents created from purchase +orders or manually, require a specific :ref:`vendor bill journal +`. -.. important:: - A vendor bill journal must be created to create vendor bill documents. - -Create a vendor bill journal -**************************** +.. _localizations/ecuador/vendor-bills-journal: -To create a new journal, go to :menuselection:`Accounting --> Configuration --> Journals`, and click -:guilabel:`New`. +Vendor bills journal +******************** -Then, configure the following: +Use the following configuration to set up the vendor bills journal: - Select :guilabel:`Purchase` as the :guilabel:`Type`. - **Do not** tick the :guilabel:`Purchase Liquidations` checkbox. - Add a :guilabel:`Default Expense Account`. -Configure a vendor bill -*********************** - -To configure a vendor bill, make sure also to complete the following Ecuador specific fields: +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 the vendor bill will be paid. +- :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 :guilabel:`Edit`. Or, + 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. -.. _l10n_ec/purchase-liquidation: +.. _localizations/ecuador/purchase-liquidation: Purchase liquidation ~~~~~~~~~~~~~~~~~~~~ -The *purchase liquidation* is an electronic document that, when validated, is sent to SRI. - -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: +*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. @@ -495,45 +549,65 @@ one or more of the following reasons: relationship (full-time employee). - Members of collegiate bodies have provided services in the exercise of their function. -In these cases, a purchase liquidation journal must be created. +In these cases, a :ref:`purchase liquidation journal +` must be created. + +.. _localizations/ecuador/purchase-liquidation-journal: Create a purchase liquidation journal ************************************* -To create a new journal, go to :menuselection:`Accounting --> Configuration --> Journals`, and click -:guilabel:`New`. +To create a *purchase liquidations* journal, enter the following information: -Then, configure the following: +- :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`. -- Select :guilabel:`Purchase` as the :guilabel:`Type`. -- Tick the :guilabel:`Purchase Liquidations` checkbox. -- Add a :guilabel:`Default Expense Account`. +Once the :guilabel:`Type` is selected, complete the following fields: + +- :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`). + +Finally, in the :guilabel:`Advanced Settings` tab, check the :guilabel:`Electronic invoicing` +checkbox to enable sending XML/EDI invoices. + +.. _localizations/ecuador/purchase-liquidation-creation: Create a purchase liquidation ***************************** -These types of electronic documents can be created from the *purchase order* or manually from the -*vendor bills* form. Purchase liquidations must contain the following data: +Purchase liquidations, created from *purchase orders* or manually from *vendor bills*, must contain +the following data: - :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 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 the invoice is going to be paid. +- :guilabel:`Payment Method (SRI)`: Select how to pay the invoice. - :guilabel:`Products`: Specify the product with the correct taxes. -Once the information has been reviewed, validate the :guilabel:`Purchase Liquidation`. +Then, validate the :guilabel:`Purchase Liquidation`. + +.. _localizations/ecuador/purchase-withholding: Purchase withholding ~~~~~~~~~~~~~~~~~~~~ -The *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. -An invoice in a validated state is necessary before registering a :guilabel:`Purchase withholding`. On the invoice, click :guilabel:`Add Withhold` and complete the following fields in the -:guilabel:`Withholding` window: +:guilabel:`Withhold` window: - :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. @@ -548,26 +622,28 @@ Then, validate the :guilabel:`Withholding`. applied on the :guilabel:`Vendor Bill` and change the :guilabel:`Tax Support` there. A withholding tax can be divided into two or more lines, depending on whether two or more -withholdings percentages apply. +withholding percentages apply. .. example:: - The system suggests a VAT withholding of 30% with tax support 01. VAT withholding of 70% can be - added in a new line with the same tax support. Odoo allows it if the base total matches the + 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. +.. _localizations/ecuador/expense reimbursement: + Expense reimbursement --------------------- Expense reimbursements apply to the following cases: -- :guilabel:`Individual`: reimbursement to an employee for miscellaneous expenses (e.g. purchase +- :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) + (e.g., hiring a lawyer) -To enable an 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. +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. .. note:: In the vendor bills journal, be sure the following necessary configurations are set for a legal @@ -577,9 +653,9 @@ To enable an expense reimbursement, make sure a :ref:`purchase liquidation journ - **Do not** tick the :guilabel:`Purchase Liquidations` checkbox. - Add a :guilabel:`Default Expense Account`. -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: +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. @@ -602,10 +678,110 @@ 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:: + 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). + +.. _localizations/ecuador/generate-electronic-delivery: + +Generate an electronic delivery guide +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +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: + +- :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). + +.. 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: +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. @@ -614,8 +790,10 @@ The :ref:`ATS Report module ` enables the following: .. 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 @@ -626,62 +804,68 @@ to set the :guilabel:`SRI Payment Method` for each method. invoice from an eCommerce sale. Select a **payment method** to access its configuration menu and field. +.. _localizations/ecuador/automatic-invoice: + Automatic invoice -~~~~~~~~~~~~~~~~~ +----------------- -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. +:ref:`Invoices ` can be generated after the checkout process. .. 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 sequence of priority in the + The sales journal used for invoicing is the first in the priority sequence in the :guilabel:`Journal` menu. -eCommerce workflow -~~~~~~~~~~~~~~~~~~ +.. _localizations/ecuador/ecommerce-workflow: Identification type and number -****************************** +------------------------------ -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. +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 + 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. +.. _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 P0S cashier can :ref:`create a new contact for a customer ` who requests an invoice from an open POS session. @@ -691,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. @@ -715,80 +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 :menuselection:`Accounting --> Reporting --> Tax Return`. Click the -:icon:`fa-book` :guilabel:`Report:` icon and select `103 (EC)` or `104 (EC)`. - -Report 103 ----------- - -This report provides details on 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. - -Report 104 ----------- - -This report provides details on 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. - -.. _l10n_ec/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 the 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 -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. - -Credit and debit notes -********************** - -When generating a credit note or debit note manually or through an import, 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 --> Reporting --> Tax Return`. 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*. - -.. 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. 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/france.rst b/content/applications/finance/fiscal_localizations/france.rst index 72973f2a7b..b2605f435f 100644 --- a/content/applications/finance/fiscal_localizations/france.rst +++ b/content/applications/finance/fiscal_localizations/france.rst @@ -34,7 +34,7 @@ The following modules related to the French localization are available: - `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)` - - `10n_fr_pos_cert` + - `l10n_fr_pos_cert` - :ref:`Point of Sale VAT anti-fraud certification ` @@ -101,8 +101,8 @@ 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. +#. :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. @@ -150,7 +150,7 @@ To send invoices to Chorus Pro, follow these steps: Once the invoice is sent, the Peppol status of the invoice is updated to :guilabel:`Done`. .. seealso:: - :ref:`Peppol ` + :ref:`Peppol ` .. _localizations/france/fec: @@ -575,7 +575,7 @@ information to complete the synchronization: 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. + :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. 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 aedb87c450..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 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 6b52e388c2..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 ===================================== @@ -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 b5c909f712..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..bfe99e2b50 100644 --- a/content/applications/finance/fiscal_localizations/mexico.rst +++ b/content/applications/finance/fiscal_localizations/mexico.rst @@ -2,72 +2,23 @@ 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)` +.. |IEPS| replace:: :abbr:`IEPS (Impuesto Especial sobre Producción y Servicios)` -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 -============ - -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). - -.. 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: +.. _l10n/mx/modules: -#. 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. +Modules +======= -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 +29,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 + 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`. - -.. 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`. + - Allows the export of XML files of journal entries for a compulsory audit. -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 +62,364 @@ 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. + +.. seealso:: + :doc:`Documentation on e-invoicing's legality and compliance in Mexico + <../accounting/customer_invoices/electronic_invoicing/mexico>` -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. +.. _l10n/mx/requirements: -Enter the full :guilabel:`Address` in the resulting form, including: :guilabel:`ZIP` code, -:guilabel:`State`, :guilabel:`Country`, and |RFC| (:guilabel:`VAT` number). +Requirements +------------ -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. +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 + `_. + +.. _l10n/mx/company: + +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). -.. image:: mexico/mx-company-info.png - :alt: Main company contact requirements for a correct invoicing. +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`. +Branches +-------- + +When using branches, all the invoicing information will be taken from the main company except for +the zip. Unless the |RFC| is set on the branch, then the information will be taken directly from the +branch. + +Branches enable users to establish multiple brands within the same parent company. Additionally, +when different fiscal regimes are required for invoicing purposes, it is necessary to create a +branch for each regime. By default, the regime is inherited from the parent company. However, if the +regime is explicitly set on the branch, Odoo will adopt the regime applicable to that branch. + +.. _l10n/mx/contacts: + Contacts -------- -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). +.. note:: + :ref:`Install ` the **Contacts** application to access contact records. + +To create a contact that can be invoiced, go to the :menuselection:`Contacts` app and click +:guilabel:`New`. Then, enter 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 the company itself, all contacts must have their correct business name registered in the + |SAT|. The :guilabel:`Fiscal Regime` must also 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. + +.. tip:: + RESICO ISR withholdings and some |IEPS| taxes are created automatically, but the feature is not + active by default. To enable it, go to :menuselection:`Accounting --> Configuration --> 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 **Factor Type** and **SAT Tax Type** fields are pre-loaded in the default taxes. + +For new taxes, set these fields in :menuselection:`Accounting --> Configuration --> Taxes` and click +:guilabel:`New`. Set the :guilabel:`Tax Type` to :guilabel:`Sales`. In the :guilabel:`Advanced +Options` tab, fill :guilabel:`SAT Tax Type` and :guilabel:`Factor Type` fields. + +Odoo supports four groups of :guilabel:`SAT Tax Types`: :guilabel:`IVA`, :guilabel:`ISR`, +:guilabel:`IEPS`, and :guilabel:`Local Taxes`. -.. image:: mexico/mx-factor-type.png - :alt: Factor Type Sales tax type configuration. +If the factor type is :guilabel:`Quota`, standard calculation methods cannot be used. Instead, set +the tax calculation computation to :guilabel:`Custom Formula`. + +.. example:: + .. math:: + result = quantity * 6.455 + + - *quantity* = the number of items in the transaction + - *6.455* = the quota value (a fixed amount per unit) + - Only per-unit quotas are supported, not quotas based on other factors .. 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` to :guilabel:`Tasa` + - For *VAT Exempt*, set the :guilabel:`Factor Type` to :guilabel:`Exento` + +.. note:: + Local taxes are generated in a separate node in the XML file, these do not get validated by the + |PAC|. + +.. warning:: + Quotas and custom formulas require the :guilabel:`Define Taxes as Python Code` module. See + :doc:`Taxes <../accounting/taxes>`. + +.. _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 eight different possible values that are +added in the XML file: + +- `01`: No tax Object: This value is added automatically if the invoice line doesn't contain any + taxes. +- `02`: Tax Object: This is the default configuration of any invoice line that contains taxes. +- `03`: Tax Object and doesn't require breakdown: This can only be added manually. +- `04`: Tax Object and doesn't have tax: This can only be added manually. +- `05`: Tax Object, VAT for PODEBI: This can only be added manually. +- `06`: VAT Object, No VAT forwarded: This object will be selected when there is an ISR withholding + and no VAT tax. +- `07`: No VAT forwarded, |IEPS| breakdown: This object will be selected when there is an ISR + withholding, |IEPS| tax and no VAT tax. +- `08`: No VAT forwarded, |IEPS| breakdown: This object can only be added manually. + +.. warning:: + Using either 01, 03, 04, or 05 will remove the tax node from the XML file. + +.. important:: + The :guilabel:`IEPS breakdown` status affects the behavior of the tax objects due to the missing + |IEPS| when the breakdown does not happen. + +.. _l10n/mx/local-taxes: + +Local taxes +~~~~~~~~~~~ + +Local taxes (e.g., *ISH*, *Cedullar*) require a separate XML node and may not follow standard tax +logic. -- `01`: Not subject to tax - this value is added automatically if your 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. +When configuring a local tax, its name appears in the local tax complement. The rate is treated as a +withholding if negative, or carried forward if positive. -To use the `03` value, navigate to :menuselection:`Contacts --> your customer's invoice --> MX EDI -tab`, and activate the :guilabel:`No Tax Breakdown` checkbox. +.. _l10n/mx/ieps-breakdown: -.. image:: mexico/mx-tax-breakdown.png - :alt: No Tax Breakdown option on the MX EDI tab of the customer's invoice. +IEPS breakdown +~~~~~~~~~~~~~~ + +By default Odoo hides the |IEPS| in the invoices so that the subtotal on which the VAT is calculated +includes the amount of |IEPS|, this is to ensure that Fiscal Regimes that don't require it, don't +recieve it. + +It is possible to make the |IEPS| visible in the XML by selecting the :guilabel:`IEPS Breakdown` +checkbox inside each contact on the :guilabel:`Sales & Purchase` tab. .. 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. + When using either :ref:`eCommerce invoicing ` or the :ref:`Self invoicing + portal `, the customer will have the option to decide whether or not to have + the |IEPS| breakdown. + +.. _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**. +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**. + +.. _l10n/mx/products: + +Withholdings +------------ + +By default, Odoo includes withholdings with special distributions to allocate VAT. -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. +When registering an invoice, add the withholding and its corresponding VAT. Both must be included on +the vendor bill to ensure correct accounting. Using :doc:`fiscal positions +<../accounting/taxes/fiscal_positions>` is recommended so the cash-basis entry properly splits the +distribution. -.. image:: mexico/mx-taxes-config.png - :alt: Tax accounts available for Odoo. +.. example:: + For a lease vendor bill of `10000 MXN`, the `10.67%` lease withholding corresponds to a `16% VAT + 2/3 H`. Both taxes must be applied together to reflect the correct accounting. + +.. image:: mexico/mx-withholdings-cash-basis.png + :alt: Cash Basis entry with VAT split between paid and due. + +.. note:: + Withholdings |CFDI| is not currently supported. Consult with an accountant the proper + distribution. 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 -: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>`. +To configure products, go to :menuselection:`Accounting --> Customers --> Products`. Open an +existing product or click :guilabel:`New`. In the :guilabel:`Accounting` tab, set the +:guilabel:`UNSPSC Product Category`. Products and categories can be set 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,32 +428,70 @@ The invoicing process in Odoo is based on `Annex 20 `_ version 4.0 of electronic invoicing of the |SAT|. +.. _l10n/mx/invoices: + Customer invoices ~~~~~~~~~~~~~~~~~ To start invoicing from Odoo, a customer invoice must be created using the :doc:`standard invoicing 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.) +While the document is in draft mode, changes can be made to it, some fields take values previously +set on the sale order or the contact. + +The fields that need to be reviewed are: + +- CFDI to public. +- Usage +- Payment Policy +- Payment Method (If Payment Policy is not set as |PPD|) + +.. tip:: + :guilabel:`Usage`, :guilabel:`Payment Policy` and :guilabel:`Payment Method` can be previously + set on a sale order and/or can be set on the contact for every invoice. + +The payment policy is a selectable field on the invoice and can be manually set to the required +policy, however if no policy is selected, Odoo will compute an automatic policy based on the +following general rules: + +The value will be set to |PUE| if the due date in which the payment is expected is within the +current month, in case the date is outside the current month, the policy will be set to |PPD| +instead. + +.. warning:: + If the payment policy is not selected and |PPD| policy is expected, either select an invoice + :guilabel:`Due Date` on a different month than the current one, or choose :guilabel:`Payment + terms` that imply changing the due month (i.e., :guilabel:`30 Days`, or :guilabel:`15 Days`, as + long as they fall on the next month). + +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 + +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. -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)`. +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. -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. +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. +.. warning:: + If the partner does not contain the :guilabel:`Country` or :guilabel:`Zip` the invoicing is + assumed as a |CFDI| to public and the invoicing will be addressed to the generic customer. If + however, these fields are left empty and the user unticks the :guilabel:`CFDI to public` + checkbox, a pop-up will appear blocking the operation. + +.. _l10n/mx/credit-notes: Credit notes ~~~~~~~~~~~~ @@ -348,103 +499,118 @@ Credit notes While an invoice is a document type "I" (Ingreso), a credit note is a document type "E" (Egreso). The only addition to the :doc:`standard flow for credit notes -<../accounting/customer_invoices/credit_notes>` is that, as a requirement of the |SAT|, there has -to be a relation between a credit note and an invoice through the fiscal folio. +<../accounting/customer_invoices/credit_notes>` is that, as a requirement of the |SAT|, there has 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/vendor-bills: -Payment policy -************** +Vendor bills +~~~~~~~~~~~~ + +Vendor bills have to have a fiscal folio for reports and payments to work correctly, if the vendor +bill was created by the purchase app or added manually, just add the XML file of the invoice on the +chatter **As a log note** and the fiscal folio will be updated accordingly, keep in mind that the +bill **Must be in draft state** for the update to happen. + +.. tip:: + When clicking :guilabel:`Update SAT`, the :guilabel:`SAT status` field on the invoice will + confirm if the XML file is **Validated** in the |SAT|, this is also true for vendor bills. + +See also :doc:`../accounting/vendor_bills` + +.. _l10n/mx/payments: + +Payments +~~~~~~~~ -One addition of the Mexican localization is the :guilabel:`Payment Policy` field. According to -the SAT documentation, there are two types of payments: +.. _l10n/mx/payment-policy: -- `PUE` (Pago en una Sola Exhibición/Payment in a Single Exhibition) -- `PPD` (Pago en Parcialidades o Diferido/Payment in Installements or Deferred) +Payment policy +************** - .. seealso:: - :doc:`../../inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs` +One addition of the Mexican localization is the :guilabel:`Payment Policy` field. `According to the +SAT documentation `_, +there are two types of payments: -The difference lies in the *Due Date* or *Payment Terms* of the invoice. +- :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) -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). +.. warning:: + Payment Complements are only generated if the policy of the invoice is set to |PPD|, please note + that it is a requirement to set the :guilabel:`Payment Method` to something different than **99 - + Por definir**. .. 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. +If the invoice has a due date outside the current month, it will default to |PPD|. .. 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. + +.. 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. -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`. +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` from the payment view. -.. image:: mexico/mx-signed-complement.png - :alt: CFDI (4.0) E-invoicing service process payment now message. +Regardless of whether the payment was created with or without reconciliation, it is possible to +download the payment PDF from the :guilabel:`CFDI` tab on the invoice by clicking the +:guilabel:`print` button. -.. 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. +.. image:: mexico/mx-print-payment.png + :alt: Example of the print button on the CFDI tab. + +.. _l10n/mx/invoice-cancellations: Invoice cancellations ~~~~~~~~~~~~~~~~~~~~~ @@ -453,10 +619,13 @@ 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. +Invoice cancellations are updated automatically on Odoo but can take some time, to check the status +of the cancellation just press the :guilabel:`Update SAT` button. + Invoice cancellations can be made for one of the following reasons: - 01 - Invoice issued with errors (with related document) @@ -466,18 +635,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 @@ -485,8 +659,8 @@ Cancellation reason 01 - Invoice issued with errors (with related document) replaces the previous invoice, along with the related |CFDI|. #. :guilabel:`Confirm` the draft and :guilabel:`Send & Print` the invoice. #. Return to the initial invoice (i.e., the invoice from which you first requested the - cancellation). Notice the :guilabel:`Substituted By` field appears with a reference to the - new replacement invoice. + cancellation). Notice the :guilabel:`Substituted By` field appears with a reference to the new + replacement invoice. #. Click :guilabel:`Request Cancel`. In the :guilabel:`Request CFDI Cancellation` pop-up window, the :guilabel:`01 - Invoice issued with errors (with related document)` option is automatically selected in the :guilabel:`Reason` field. @@ -498,14 +672,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,372 +689,845 @@ 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 - original document, by adding a `04|` plus the fiscal folio in the :guilabel:`CFDI Origin` field. + Just like invoices, when creating a new payment complement, it is possible to 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 +.. _l10n/mx/cfdi-origin: + +CFDI relations ************** -If the customer you are selling goods or services to does not require an invoice, a *CFDI to Public* -has to be created. +Sometimes it is needed to relate the current document to previously signed CFDIs, to do so just fill +the :guilabel:`CFDI Origin` field on the invoice indicating a relation, there are 7 possible values: -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`). +- 01: Nota de crédito +- 02: Nota de débito de los documentos relacionados +- 03: Devolución de mercancía sobre facturas o traslados previos +- 04: Sustitución de los CFDI previos +- 05: Traslados de mercancias facturados previamente +- 06: Factura generada por los traslados previos +- 07: CFDI por aplicación de anticipo -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`. +.. tip:: + The format is: Origin Type|UUID1, UUID2, ...., UUIDn where more than one Origin Type can be + added. -.. image:: mexico/mx-cfdi-to-public.png - :alt: CFDI to Public Customer field configuration. +.. example:: + Here is an example with two relations: + + .. code-block:: none + + 04|042FE739-7B45-4D64-B26D-360000876D83, + 07|A164BAF8-8016-428C-A422-D9BD2F68F6A0,CEAD9433-3B77-4270-85BF-AC2519587514 + + - The first section has relation type **04** with **1 UUID** + - The second section has relation type **07** with **2 UUIDs** + +Additionally any combination is also visible on the signed PDF. + +.. image:: mexico/mx-CFDI_3relations.png + :alt: Example of the PDF with 3 relations. + +.. _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. +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. -External trade --------------- +In the sales order, all three documents should appear as "In Payment". -The external trade is a complement to a regular invoice that adds certain values in both the XML and -PDF, to invoices with a foreign customer according to `SAT regulations -`_, such as: +Method B +^^^^^^^^ -- 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*). +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. -This allows the correct identification of exporters and importers, in addition to expanding the -description of the merchandise sold. +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|`. -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 +Finally, sign the final invoice via |CFDI|. -In order to use this feature, the modules :guilabel:`l10n_mx_edi_extended` and -:guilabel:`l10n_mx_edi_extended_40` have to be installed. +.. _l10n/mx/addendas-and-complements: -.. important:: - Before installing, make sure your business needs to use this feature. Consult your accountant - first, if needed, before installing any modules. +Addendas and complements +************************ -Configuration -~~~~~~~~~~~~~ +Addendas and complements can be included in the XML. To add one, go to :menuselection:`Accounting +--> Configuration --> Addendas & Complementos (MX)` and :guilabel:`New` to enter the code to be +injected. Additional fields beyond standard Odoo may be required. -Contacts -******** +.. warning:: + This section might require techincal knowledge as well as technical debt, it is recommended to + ask your account manager for the best technical assistance. -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. +Once the desired nodes are created, they can be selected on each contact to make them appear on +every invoice addressed to that contact. By default all the selected nodes will be added +automatically on every invoice. -.. 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`. +It is also possible to just select the nodes as needed on every invoice by selecting the +:guilabel:`Other info` tab and then selecting the desired nodes from :guilabel:`Addendas & +Complementos` -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|. +.. tip:: + It is possible to add more than one per contact or per invoice. -.. image:: mexico/mx-external-trade-rescompany.png - :alt: Optional external trade company fields. +.. _l10n/mx/xml-reader: -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 -following fields completed to avoid errors: +XML reader +********** -#. 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`). +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. -.. 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. +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. -.. image:: mexico/mx-external-trade-customer-contact.png - :alt: Required external trade customer fields. +.. 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. -.. note:: - In the resulting XML and PDF files, the :guilabel:`VAT` is automatically replaced by the generic - VAT for abroad transactions: `XEXX010101000`. +: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. -Products -******** +This can be done for :guilabel:`Vendor Bills` too. -All products involved with external trade have four fields that are required, two of them exclusive -to external trade. +.. tip:: + To retrieve the :guilabel:`Fiscal Folio`, drag and drop XML files as a log note in the chatter + for previously created draft invoices. -#. 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 `correct `_ :guilabel:`Tariff - Fraction` of the product in the :guilabel:`Accounting` tab. -#. The :guilabel:`UMT Aduana` corresponds to the :guilabel:`Tariff Fraction`. +.. _l10n/mx/cfdi: -.. image:: mexico/mx-external-trade-product.png - :alt: Required external trade product fields. +CFDI to public +************** -.. tip:: - - If the UoM code of the :guilabel:`Tariff Fraction` is `01`, the correct :guilabel:`UMT Aduana` - is `kg`. - - If the UoM code of the :guilabel:`Tariff Fraction` is `06`, the correct :guilabel:`UMT Aduana` - is `Units`. +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. -Invoicing flow -~~~~~~~~~~~~~~ +A contact must be created and it must have a particular name. -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`. +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: -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. +- |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-external-trade-other-info.png - :alt: External trade Other Info tab of a product. +.. image:: mexico/mx-cfdi-to-public.png + :alt: CFDI to Public Checkbox -Finally, sign the invoice with the same process as a regular invoice, and click the -:guilabel:`Process Now` button. +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`). -Delivery guide --------------- +.. warning:: + By default sending the invoice is not allowed if the partner does not have either the *Country* + or *Zip code* set, however this is not required if the :guilabel:`CFDI to public` checkbox is + active. -A `Carta Porte `_ is a bill of -lading: a document that states the type, quantity, and destination of goods being carried. +.. seealso:: + `Regla 2.7.1.21 Expedición de comprobantes en operaciones con el público en general + `_. -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/global-invoice: -Odoo can create XML and PDF files with (or without) ground transport, and can process materials that -are treated as *Dangerous Hazards*. +Global invoice +************** -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. +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*. -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. +.. note:: + For this process, the :doc:`Sales <../../sales/sales>` app must be installed. -.. 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. +.. seealso:: + `Guía de llenado del CFDI global + `_ -Configuration -~~~~~~~~~~~~~ +Sales flow +^^^^^^^^^^ -Odoo manages two different types of CFDI: +First, it is necessary to create a special :guilabel:`Journal` created in :menuselection:`Accounting +--> Configuration --> Journals` with the purpose of keeping a separate sequence. -- **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. +Then, make sure that all the sales orders that need to be signed have the following configurations: -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. +- :guilabel:`CFDI to Public` checkbox enabled +- :guilabel:`Invoice Status` marked as :guilabel:`To Invoice` -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. +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`. -Contacts and vehicles -********************* +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`. -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 _`. +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:: - The field, :guilabel:`Locality`, is optional for both addresses. + - 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. -.. image:: mexico/mx-delivery-guide-contacts.png - :alt: Delivery guide contact configuration. +.. 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. -.. 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. +.. _l10n/mx/reporting: -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. +Electronic accounting (reporting) +--------------------------------- -All fields are mandatory to create a correct 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. + +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 fields, :guilabel:`Vehicle Plate Number` and :guilabel:`Number Plate`, must contain between - 5 to 7 characters. + The report can be filtered by period or by journal, depending on the need. -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`. +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: -.. image:: mexico/mx-delivery-guide-vehicle.png - :alt: Delivery guide vehicle configuration. +- :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 website 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 the payments registered in vendor bills, broken +down into the corresponding types of IVA. The :guilabel:`VAT`, :guilabel:`Country` and +:guilabel:`Type of operation` fields are 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)`. + +In case new taxes are created on the database, there are two types of tags, the tags containing +**tax** must go into the tax distribution and the ones with the base name go on the base of the tax. +All lines of a VAT tax **must** containing at least one tax grid. + +.. 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 +-------------- + +The external trade is a complement to a regular invoice that adds certain values in both the XML and +PDF, to invoices with a foreign customer according to `SAT regulations +`_, such as: + +- The specific address of the receiver and the sender +- The addition of a :guilabel:`Tariff Fraction` that identifies the type of product +- 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 2.0. + +.. 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 + first, if needed, before installing any modules. + + The :guilabel:`CFDI to public` checkbox must be ticked when creating foreign invoices. + +Configuration +~~~~~~~~~~~~~ + +Contacts +******** + +To configure your company contact for external trade, navigate to :menuselection:`Accounting --> +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 record*, not in the + company record itself. + +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 +following fields completed to avoid errors: + +#. The entire company :guilabel:`Address`, including a valid :guilabel:`ZIP` code and the foreign + :guilabel:`Country`. +#. 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. + +.. note:: + In the resulting XML and PDF files, the :guilabel:`VAT` is automatically replaced by the generic + VAT for abroad transactions: `XEXX010101000`. Products ******** -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: +All products involved with external trade have four additional fields that are required, two of +which are exclusive to external trade. -- 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`. +#. 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 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. -.. 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-external-trade-product.png + :alt: Required external trade product fields. -.. image:: mexico/mx-delivery-guide-products.png - :alt: Delivery guide product configuration. +.. tip:: + - If the UoM code of the :guilabel:`Tariff Fraction` is `01`, the correct :guilabel:`UMT Aduana` + is `kg`. + - If the UoM code of the :guilabel:`Tariff Fraction` is `06`, the correct :guilabel:`UMT Aduana` + is `Units`. -Sales and inventory flow -~~~~~~~~~~~~~~~~~~~~~~~~ +Invoicing flow +~~~~~~~~~~~~~~ -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. +Before creating an invoice, it is important to take into account that external trade invoices +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. -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`). +Then, with the correct exchange rate set up in :menuselection:`Accounting --> Settings --> +Currency`, set the :guilabel:`Incoterm` and the optional :guilabel:`Certificate Source` fields in +the invoice's :guilabel:`Other Info` tab. + +.. tip:: + While not mandatory, the information will be more complete if :guilabel:`CFDI to public` is also + active. + +Finally, confirm the invoice with the same process as a regular invoice, and click the +:guilabel:`Send` button to sign it via CFDI. + +.. _l10n/mx/pos: + +Point of sale +============= + +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. + +.. _l10n/mx/pos/flow: + +Point of sale flow +------------------ -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. +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`. + +.. tip:: + By default Odoo creates preconfigured payment methods for cash, credit card, and debit card. + +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. + +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. + +.. 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`. + +.. image:: mexico/mx-pos.png + :alt: Invoice Configuration for Point of Sale. + +To sign a credit note automatically, tick the :icon:`fa-file-text-o` :guilabel:`Invoice` checkbox +when processing a :ref:`refund `. .. 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. + Credit notes for returned products will contain the relation type :guilabel:`03 - Devolución de + mercancía sobre facturas o traslados previos`. -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. +.. important:: + - In the Mexican localization, positive and negative lines in a **POS** session cannot be mixed. -.. image:: mexico/mx-delivery-guide-federal-transport.png - :alt: Delivery guide MX EDI tab configuration. + - If a |SAT| validation error occurs customer will get a :doc:`Pro-Forma invoice + <../../sales/sales/invoicing/proforma>` instead. -Dangerous hazards -***************** +.. _l10n/mx/pos/portal: -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`. +Self-invoicing portal +--------------------- -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. +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: -.. image:: mexico/mx-delivery-guide-hazards-designation.png - :alt: Delivery guide hazardous material product required fields. +#. 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`. + +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. + +.. seealso:: + :doc:`../../sales/point_of_sale/receipts_invoices` + +.. _l10n/mx/pos/global-invoice: + +Global invoice +-------------- + +As with regular sales orders, global invoices can also be created from a POS session. + +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`. + +Like with sales orders, choose the correct :guilabel:`Periodicity` and press :guilabel:`Create`. + +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. + +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. + +.. 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. + +.. _l10n/mx/ecommerce: + +eCommerce +========= + +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 file from their own customer portal. + +.. _l10n/mx/ecommerce/flow: + +eCommerce flow +-------------- + +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`. + +Additionally the customer can decide whether or not to request :ref:`IEPS Breakdown +`. + +.. important:: + Make sure to add a :guilabel:`UNSPSC code` to the :ref:`shipping product + `. -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. +If the :guilabel:`Automatic Invoicing` is enabled in :menuselection:`Settings --> Website --> +Invoicing`, the electronic document will be signed automatically. -.. image:: mexico/mx-delivery-guide-hazards-environment.png - :alt: Delivery Guide environment insurer required fields. +.. _l10n/mx/sales: + +Sales +===== + +The **Sales** app contains fields that make invoicing easier, while the fields themselves do not +change the sales behavior, they are directly copied when creating an invoice. + +The copied fields are: + +- Payment Way +- Payment Policy +- CFDI to public +- Usage + +Additionally, it is possible to get a preview of the invoice for validation purposes with the +customer by installing the :doc:`pro-forma module <../../sales/sales/invoicing/proforma>`. This +module adds the mentioned fields to the sale order as well as: + +- Product code +- Unit code +- Fiscal regime + +.. _l10n/mx/subscriptions: + +Subscriptions +============= + +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. + +.. important:: + All invoices generated by the subscription app will always be automatically signed with no + exceptions. + +.. _l10n/mx/inventory: + +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 +1539,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 +1569,214 @@ 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. +In order to print the PDF, the delivery order must be signed by the government and then it can be +printed using the :guilabel:`Print Carta Porte` button on the delivery order. -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>`. +The PDF file contains a QR code to verify the CCP code for the authorities. -.. 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. +In order to transport goods between warehouses, the logistic route must contain a **Delivery** type +of operation, see :doc:`Inter-warehouse replenishment +<../../inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses>` -.. _l10n_mx/chart-of-accounts: +.. note:: + In order to use this feature, the :guilabel:`Mexico - Electronic Delivery Guide` + `l10n_mx_edi_stock` module must be installed. -Chart of accounts -~~~~~~~~~~~~~~~~~ + Additionally, it is necessary to have the :doc:`Inventory <../../inventory_and_mrp/inventory>` + and :doc:`Sales <../../sales/sales>` apps installed. -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 -`_. +.. important:: + Odoo does not support Carta Porte type document type "I" (Ingreso), air, train or marine + transport. -You can create any account, as long as it respects |SAT|'s encoding group: the pattern is -`NNN.YY.ZZ` or `NNN.YY.ZZZ`. + Consult your accountant first if this feature is needed before doing any modifications. -.. example:: - Some examples are `102.01.99` or `401.01.001`. +Configuration +~~~~~~~~~~~~~ -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. +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>`. -Once you create all your accounts, make sure the correct :guilabel:`Tags` are added. +- :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. -.. 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. +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. -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. +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. -Trial balance -~~~~~~~~~~~~~ +Contacts and vehicles +********************* -The trial balance reports the initial balance, credit, and total balance of your accounts, provided -that you added their correct :ref:`encoding group `. +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 +`_. -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 field, :guilabel:`Locality`, is optional for both addresses. -.. image:: mexico/mx-reports-trial-balance.png - :alt: Trial balance report. +.. 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. -.. note:: - Odoo does not generate the *Balanza de Comprobación Complementaria*. +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. -Month 13 trial balance -********************** +All fields are mandatory to create a correct delivery guide. -The *Month 13* report is a closing balance sheet that shows any adjustments or movements made in the -accounting to close the year. +.. tip:: + The fields, :guilabel:`Vehicle Plate Number` and :guilabel:`Number Plate`, must contain between 5 + and 7 characters. -To generate it, proceed as follows: +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`. -#. 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)`. +.. image:: mexico/mx-delivery-guide-vehicle.png + :alt: Delivery guide vehicle configuration. -.. image:: mexico/mx-reports-trial-balance-13-report.png - :alt: Trial Balance Month 13 report. +Products +******** -General ledger -~~~~~~~~~~~~~~ +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: -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. +- 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`. -.. tip:: - You can filter by period, or by journal, according to your current needs. +.. 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. -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: +Sales and inventory flow +~~~~~~~~~~~~~~~~~~~~~~~~ -- :guilabel:`Tax audit` -- :guilabel:`Audit certification` -- :guilabel:`Return of goods` -- :guilabel:`Compensation` +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. -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|. +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:: - If you want to see this report without sending it, use `ABC6987654/99` for :guilabel:`Order - Number` and `AB123451234512` for :guilabel:`Process Number`. + 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. -DIOT report -~~~~~~~~~~~ +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. -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|. +Finally, add a :guilabel:`Gross Vehicle Weight` and click :guilabel:`Generate 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. +.. tip:: + Delivery Guides can also be created from :guilabel:`Receipts`, either from the Inventory app or + by the standard flow of the Purchase app. -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. +Dangerous hazards +***************** -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. +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`. -.. image:: mexico/mx-reports-diot-example.png - :alt: A Vendor Bill that is In Payment. +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. + +.. image:: mexico/mx-delivery-guide-hazards-designation.png + :alt: Delivery guide hazardous material product required fields. .. 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. + 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. - .. image:: mexico/mx-reports-diot-contact.png - :alt: DIOT information on a vendor contact. +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. + +Imports and Exports +******************* + +If your Carta Porte is for international operations (for exports), some additional fields need to be +taken into account. + +First, make sure that all relevant :guilabel:`Products` have the following configuration: + +- :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. + +Then, when creating a :guilabel:`Delivery Guide` from a delivery or receipt, fill the following +fields: + +- :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` with **Two** spaces between text. diff --git a/content/applications/finance/fiscal_localizations/mexico/mx-CFDI_3relations.png b/content/applications/finance/fiscal_localizations/mexico/mx-CFDI_3relations.png new file mode 100644 index 0000000000..7935d4a27a Binary files /dev/null and b/content/applications/finance/fiscal_localizations/mexico/mx-CFDI_3relations.png differ 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-print-payment.png b/content/applications/finance/fiscal_localizations/mexico/mx-print-payment.png new file mode 100644 index 0000000000..6c9f22ce3a Binary files /dev/null and b/content/applications/finance/fiscal_localizations/mexico/mx-print-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/mexico/mx-withholdings-cash-basis.png b/content/applications/finance/fiscal_localizations/mexico/mx-withholdings-cash-basis.png new file mode 100644 index 0000000000..a6ec453ea6 Binary files /dev/null and b/content/applications/finance/fiscal_localizations/mexico/mx-withholdings-cash-basis.png differ diff --git a/content/applications/finance/fiscal_localizations/new_zealand.rst b/content/applications/finance/fiscal_localizations/new_zealand.rst index a77cc74e15..50987dc755 100644 --- a/content/applications/finance/fiscal_localizations/new_zealand.rst +++ b/content/applications/finance/fiscal_localizations/new_zealand.rst @@ -185,8 +185,8 @@ Accounting E-invoicing ----------- -Odoo allows :ref:`electronic invoicing ` settings to be configured per -contact. +Odoo allows :ref:`electronic invoicing ` settings to be +configured per contact. .. image:: new_zealand/peppol_contact_new.png :alt: Peppol Contact. 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 1b9eb41e64..81179c3ed4 100644 --- a/content/applications/finance/payment_providers/xendit.rst +++ b/content/applications/finance/payment_providers/xendit.rst @@ -7,8 +7,10 @@ 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: 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 d0a9e0750e..f8dc847afb 100644 --- a/content/applications/general/email_communication/email_servers_outbound.rst +++ b/content/applications/general/email_communication/email_servers_outbound.rst @@ -53,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: 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/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..236a452549 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 ================ diff --git a/content/applications/general/iot/devices/scale.rst b/content/applications/general/iot/devices/scale.rst index daebc1312a..6a7d2c4295 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/windows_iot.rst b/content/applications/general/iot/windows_iot.rst index 3175eae12c..7d149a4677 100644 --- a/content/applications/general/iot/windows_iot.rst +++ b/content/applications/general/iot/windows_iot.rst @@ -34,14 +34,11 @@ Installation To install the Windows virtual IoT on a Windows computer: -#. Access `Odoo's download page `_ and download the Odoo installation - package for Windows **matching your database's version**. +#. Download the `IoT installation package for Windows + `_ #. Open the downloaded :file:`.exe` file, allow the app to make changes to your device, select a language, and click :guilabel:`OK`. #. Click :guilabel:`Next`, then :guilabel:`I Agree` to accept the terms and conditions and continue. -#. Select :guilabel:`Odoo IoT` from the :guilabel:`Select the type of install` dropdown list. The - following components should be selected: Odoo Server, Odoo IoT, Nginx WebServer, and Ghostscript - interpreter. #. Verify you have the required space on your computer and click :guilabel:`Next`. #. In the :guilabel:`Destination folder`, enter C:\\odoo and click :guilabel:`Install`. @@ -49,16 +46,13 @@ To install the Windows virtual IoT on a Windows computer: Do not install Odoo's Windows virtual IoT in any Windows user directory, as this can cause issues with :ref:`iot/https_certificate_iot/generation`. -#. Once the installation is complete, click :guilabel:`Next`. #. Set up GPL Ghostscript: Click :guilabel:`Next`, agree to the terms and conditions, click :guilabel:`Install`, then :guilabel:`Finish`. -#. Click :guilabel:`Next`, :guilabel:`Next`, and :guilabel:`Finish` to complete the setup. The +#. Click :guilabel:`Next` and :guilabel:`Finish` to complete the setup. The :ref:`IoT system's homepage ` automatically opens in a web browser with the URL `http://localhost:8069`. - .. tip:: - If the web browser does not show anything, :ref:`restart ` the - Windows virtual IoT service. +#. :ref:`Restart ` the Windows virtual IoT service. #. Check that you can access the :ref:`IoT system's homepage ` in a web browser: 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/access_rights.rst b/content/applications/general/users/access_rights.rst index 6d587d97b0..f66350b2ba 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 ======================= @@ -52,6 +54,8 @@ The :guilabel:`Administration` field in the :guilabel:`Access Rights` tab has th .. image:: access_rights/user-permissions-dropdown-menu.png :alt: The Sales apps drop-down menu to set the user's level of permissions. +.. _access-rights/specific-user-permissions: + Manage specific permissions --------------------------- 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/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 39cfbab104..505bee7c96 100644 --- a/content/applications/hr/attendances.rst +++ b/content/applications/hr/attendances.rst @@ -242,9 +242,10 @@ Main details employee has checked out. - :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`: approved overtime (shows **only** when present for the employee). -- :guilabel:`Extra Hours`: unpaid overtime hours worked beyond the expected working schedule (the - :guilabel:`Worked Time` minus the approved :guilabel:`Worked Extra Hours`. +- :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 -------------------------- diff --git a/content/applications/hr/employees.rst b/content/applications/hr/employees.rst index 3f520bb782..3ebf52e47e 100644 --- a/content/applications/hr/employees.rst +++ b/content/applications/hr/employees.rst @@ -15,13 +15,18 @@ reporting. .. card:: New employees :target: employees/new_employee - Set up new employee records + 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 diff --git a/content/applications/hr/employees/departments.rst b/content/applications/hr/employees/departments.rst index fa850733ca..3ece0d3d8c 100644 --- a/content/applications/hr/employees/departments.rst +++ b/content/applications/hr/employees/departments.rst @@ -4,6 +4,8 @@ Departments All employees in the **Employees** app fall under specific departments within a company. +.. _employee/create-departments: + Create new departments ====================== diff --git a/content/applications/hr/employees/new_employee.rst b/content/applications/hr/employees/new_employee.rst index 6df118fba9..ae2cae68a7 100644 --- a/content/applications/hr/employees/new_employee.rst +++ b/content/applications/hr/employees/new_employee.rst @@ -258,6 +258,8 @@ this section to be visible. add the location, or :guilabel:`Create and edit...` to add the location, assign a :guilabel:`Work Address`, and a :guilabel:`Cover Image`. +.. _employees/approvers: + APPROVERS --------- 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/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/payroll_localizations/united_arab_emirates.rst b/content/applications/hr/payroll/payroll_localizations/united_arab_emirates.rst index a5616e68b9..f38a360280 100644 --- a/content/applications/hr/payroll/payroll_localizations/united_arab_emirates.rst +++ b/content/applications/hr/payroll/payroll_localizations/united_arab_emirates.rst @@ -84,8 +84,10 @@ found under the :guilabel:`Salary Information` tab: - Do not tick this checkbox if the standard calculation is to be used. This computes the compensation amount by dividing the monthly salary by **30** and then multiplying it by **21**. - - Tick this checkbox and directly set the actual :guilabel:`Daily Salary` so that it is - used in the end of service calculation. + - Tick this checkbox and directly set the actual :guilabel:`Daily Salary` so that it is used in + the end of service calculation. + - Tick this checkbox and directly set the actual :guilabel:`Daily Salary` so that it is used in + the end of service calculation. Salary structures and salary rules ================================== @@ -227,9 +229,8 @@ There are **3 cases** for the employee to have: The SLI is not mandatory in Odoo but can be done from the setup of the :ref:`time off types `. -#. **50% paid sick leave:** Same as the fully paid one, but the employees are eligible for - **30 days** from this leave type. These 30 days are counted after the first **15** fully paid - days. +#. **50% paid sick leave:** Same as the fully paid one, but the employees are eligible for **30 + days** from this leave type. These 30 days are counted after the first **15** fully paid days. #. **0% paid sick leave:** Same as the fully paid one, but the employees are eligible for **45 days** from this leave type. These **45 days** are counted after the first **15/30** fully/half-paid days. @@ -238,8 +239,7 @@ There are **3 cases** for the employee to have: As per the labor law of the United Arab Emirates, the 15, 30, 45 days are not specified as working days or calendar days so this point will rely on the company policy. -The amount paid for the employee per sick leave day is counted as -follows: +The amount paid for the employee per sick leave day is counted as follows: .. math:: :class: overflow-scroll @@ -351,16 +351,36 @@ Two printout formats can be extracted from the payslip, it depends on the type o a *Monthly* payslip or an *End of Service* Payslip. It is triggered if the employee for the payslip is generated is archived during that month. -Master report -============= +Instant Pay structure +===================== + +This structure is used when off-cycle payslips are required to make payments to employees for +special situations, such as one-time or advance salaries. Examples of one-time payments include: + +- Commissions +- Bonuses +- Allowances + +Salary Advances +=============== + +Employees may request a portion of their salary before the end of the pay cycle. In such cases, the +payroll officer can issue a salary advance using the following steps: + +#. Create an off-cycle payslip using the United Arab Emirates: Instant Pay structure. + +#. Add another input of type Salary Advance and specify the amount to be paid to the employee. -The *Master report* provides a detailed view of the amounts paid to employees for a specific period -based on the payslips that are generated for them during that period with payslip lines being set as -columns in an Excel report. +#. Confirm the payslip and process the payment. -It is mainly used to make the auditing process for the human resources department easier and faster. +In the next cycle, when a payslip is generated for the employee using the `United Arab Emirates: +Regular Pay` structure, another input type, `Advance Recovery` is automatically added for the same +amount that was previously paid. -To access this report, go to :menuselection:`Payroll --> Reporting --> Master Report`. +.. tip:: + If the employee and payroll officer agree to recover the advance over two consecutive cycles, the + payroll officer can adjust the Advance Recovery amount on the first payslip. The remaining + balance is automatically added to the following cycle. .. _payroll/l10n_ae/wps-reports: 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 5dc1c2a108..1374ad9b1b 100644 --- a/content/applications/hr/recruitment.rst +++ b/content/applications/hr/recruitment.rst @@ -35,31 +35,6 @@ app. To view and edit the settings, navigate to :menuselection:`Recruitment app --> Settings`. After any changes are made, click the :guilabel:`Save` button in the top-left corner to save all the changes. -Job posting ------------ - -The :guilabel:`Job Posting` section of the **Recruitment** app settings has two configurations, -enabling posting jobs on the company website, and on external job boards. - -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 :doc:`Website <../websites/website>` - application is also installed. - -The **Recruitment** app can post job positions directly to a job board. To enable this, click -:icon:`oi-arrow-right` :guilabel:`Choose a Job Board`, and the required module is presented, if not -already installed. Click :guilabel:`Install` on the corresponding module, then the main Odoo -dashboard loads after a successful installation. - -Open the **Recruitment** app, and navigate to :menuselection:`Recruitment app --> Configuration --> -Settings`. The corresponding job board credentials are listed. Enter the :guilabel:`Username` and -:guilabel:`Password` for the job board. Click the :guilabel:`Save` button after making any changes. - -.. note:: - Currently, the only job board integration with Odoo is Monster.com. - Process ------- @@ -387,25 +362,27 @@ appears in the chatter. .. 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/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/new_job.rst b/content/applications/hr/recruitment/new_job.rst index e7315a3c00..1b18df86e7 100644 --- a/content/applications/hr/recruitment/new_job.rst +++ b/content/applications/hr/recruitment/new_job.rst @@ -13,6 +13,8 @@ View submitted applications by clicking anywhere on a job position card. .. image:: new_job/jobs.png :alt: Main dashboard view of Recruitment app showing all job positions. +.. _job-position/create-job-position: + Create a new job position ========================= @@ -49,12 +51,6 @@ card to reveal several options, and then click :guilabel:`Configuration` to edit .. image:: new_job/edit-job.png :alt: Edit the job position card. -.. note:: - The top-right corner of the card has a toggle to publish the job position to the website. If the - job position is published, a green :guilabel:`Published` toggle is visible. If the job position - is *not* published a gray :guilabel:`Not Published` toggle appears. Click the toggle to publish - or unpublish the job position. - Recruitment tab ~~~~~~~~~~~~~~~ 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/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/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/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/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/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/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/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/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/engineering_change_orders.rst b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders.rst index 7853d6fcd3..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 @@ -51,7 +51,7 @@ On the |ECO| form, fill in the following fields accordingly: .. note:: :guilabel:`Company` is only available to specify with multiple companies enabled. See - :doc:`../../../general/multi_company`. + :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 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 37218f3393..55b52686f8 100644 --- a/content/applications/inventory_and_mrp/purchase/manage_deals/rfq.rst +++ b/content/applications/inventory_and_mrp/purchase/manage_deals/rfq.rst @@ -187,6 +187,8 @@ Clicking :guilabel:`Print RFQ` downloads a PDF of the |RFQ|. .. seealso:: :doc:`../../../essentials/contacts` +.. _purchase/manage_deals/confirm-order: + Confirm order ------------- 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/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..26f47bf7b2 100644 --- a/content/applications/productivity/knowledge.rst +++ b/content/applications/productivity/knowledge.rst @@ -1,24 +1,440 @@ -: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 :icon:`fa-plus` :guilabel:`New Article` in the top-left +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-o` :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`. + +.. _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 Link`), :icon:`fa-pencil-square-o` (:guilabel:`Edit + Link`), and :icon:`fa-chain-broken` (:guilabel:`Remove Link`) 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:`Open Version History`: Restore a previous version 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 :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. + - Click the :icon:`fa-search` (:guilabel:`serch`) icon in the top-left corner or 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 +:guilabel:`Copy Link` 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`. Alternatively, hold click the article and drag it to the +:guilabel:`Drop here to delete this article` at the bottom left corner. The article is moved to the +trash for 30 days before being permanently deleted. + +To permanently delete an article, click :guilabel:`Articles` 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:`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/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-ellipsis-v` (:guilabel:`ellipsis`) icon, then the :icon:`fa-history` (:guilabel:`history`) +icon 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 ca8ddc14bf..83c01985ba 100644 --- a/content/applications/productivity/spreadsheet.rst +++ b/content/applications/productivity/spreadsheet.rst @@ -1,5 +1,4 @@ :show-content: -:hide-page-toc: =========== Spreadsheet @@ -18,10 +17,11 @@ Spreadsheet similar functionality to other spreadsheet solutions with the added benefit of integrating directly with your Odoo database. -With **Odoo Spreadsheet**, you can: +With Odoo Spreadsheet, you can: -- create spreadsheets or upload existing `.xlsx` or `.csv` files and edit them -- create :doc:`templates ` +- :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 ` @@ -29,3 +29,200 @@ With **Odoo Spreadsheet**, you can: ` - 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 + + 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/manage-spreadsheets/convert-to-dashboard: + +Convert a spreadsheet into a dashboard +-------------------------------------- + +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: + +#. 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`. + +.. 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/global_filters.rst b/content/applications/productivity/spreadsheet/global_filters.rst index d3c9b35d1c..734ebfbcba 100644 --- a/content/applications/productivity/spreadsheet/global_filters.rst +++ b/content/applications/productivity/spreadsheet/global_filters.rst @@ -10,14 +10,13 @@ These filters are particularly useful for reports and dashboards as users can ea customize the view to answer complex business questions spanning multiple data sources. .. 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. + On a dashboard, global filters that have been :ref:`created in the underlying spreadsheet + ` are applied via the search bar at the top of the dashboard. .. image:: global_filters/dashboard-global-filters.png :alt: Global filters at the top of a dashboard -Three types of global filters are available: +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 / @@ -27,6 +26,8 @@ Three types of global filters are available: 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 @@ -65,8 +66,9 @@ filter should act on, or match with. Field matching is further explained in the relevant sections on creating :ref:`Date `, -:ref:`Relation `, and -:ref:`Text ` global filters. +:ref:`Relation `, +:ref:`Text `, and +:ref:`Yes/No ` global filters. .. _spreadsheet/global-filters/create: @@ -76,19 +78,27 @@ 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` to open the +:guilabel:`Filters` panel. Under :guilabel:`Create filter`, click :icon:`fa-calendar` +:guilabel:`Date`, :icon:`fa-link` :guilabel:`Relation`, :icon:`fa-font` :guilabel:`Text`, or +:icon:`fa-toggle-off` :guilabel:`Yes/No` as appropriate. -To add a new filter, click :icon:`os-global-filters` :guilabel:`Filters`, then, under :guilabel:`Add -a new filter...` click :guilabel:`Date`, :guilabel:`Relation`, or :guilabel:`Text` as appropriate. -The :guilabel:`Filter properties` pane opens. +.. note:: + Depending on the data source(s) present in the spreadsheet, suggested :ref:`relation filters + ` may be shown. Clicking on a suggested filter opens + the :guilabel:`Filter properties` panel with certain values preconfigured. 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`. +.. tip:: + - To access the underlying spreadsheet of a dashboard, :ref:`activate developer mode + `, then click the :icon:`fa-pencil` :guilabel:`(Edit)` icon that appears when + hovering over the dashboard name in the left panel. + - Click :icon:`fa-thumb-tack` :guilabel:`(pin)` at the top of the :guilabel:`Filters` panel to + allow another panel, such as the :guilabel:`Filter properties` panel, to open beside it. + .. _spreadsheet/global-filters/create-date: Date @@ -98,35 +108,18 @@ Date 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 :guilabel:`Filter properties` panel open: #. 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: - - - :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. - - 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:`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.). - - To set a :guilabel:`Default value`, select one of the available values. - - - :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`). - +#. To set a :guilabel:`Default value`, select one of the available values, e.g, `Last 30 Days` or + `Month to Date`. When applying the global filter, any of the available values can be selected. #. In the :guilabel:`Field matching` section, for each data source, click beside :guilabel:`Date field` and select the field the filter should match with. 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 of future. + or :guilabel:`Next`, then select the desired number of periods in the past or future. .. tip:: @@ -142,20 +135,19 @@ With the :guilabel:`Filter properties` pane open: #. Click :guilabel:`Save`. .. example:: - 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. + In the example below, a :guilabel:`Date` global filter allows the pivot table and chart to show + sales data for any defined time period, in this case, `July 2025`. The :guilabel:`Custom Range` + always shows the actual dates corresponding to the chosen period; it can also be updated + directly. .. image:: global_filters/example-date.png - :alt: A date filter to filter on quarter and year + :alt: A date filter filters data for July 2025 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. + :guilabel:`Order Date` has been selected as the matching date field. .. image:: global_filters/field-matching-date.png :alt: A date filter with the Order Date selected as the matching field - :scale: 80% .. _spreadsheet/global-filters/create-relation: @@ -168,7 +160,7 @@ Relation `, or :ref:`Many2Many ` field. -With the :guilabel:`Filter properties` pane open: +With the :guilabel:`Filter properties` panel open: #. Enter a name for the new relation filter in the :guilabel:`Label` field. @@ -191,21 +183,19 @@ With the :guilabel:`Filter properties` pane open: #. Click :guilabel:`Save`. .. example:: - 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`. + In the example below, a :guilabel:`Relation` filter allows the pivot table and chart to show + sales data related to selected salespeople only. The *User* model is set as the + :guilabel:`Related model`. .. image:: global_filters/example-relation.png :alt: Relation filter set on a pivot table 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. + and the chart. .. image:: global_filters/field-matching-relation.png :alt: A relation filter with the User model configured - :scale: 80% .. _spreadsheet/global-filters/create-text: @@ -213,15 +203,16 @@ Text ---- .. note:: - A :guilabel:`Text` filter can only match with a :ref:`Text (char) - `, :ref:`Integer ` or - :ref:`Decimal (float) ` field. + 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: +With the :guilabel:`Filter properties` panel 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. + spreadsheet range either by typing the range or selecting it from the relevant sheet. The + referenced range must be in the same 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. @@ -229,28 +220,57 @@ With the :guilabel:`Filter properties` pane open: #. 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. + In the example below, a :guilabel:`Text` global filter allows the pivot table and chart to show + sales data only for products whose internal reference matches or contains the entered value, in + this case, `FURN`. Multiple values can be entered if desired. .. image:: global_filters/example-text.png :alt: Global filters set on a pivot table - In the :guilabel:`Filter properties`, the :guilabel:`Possible values` of the filter were - restricted to the range :guilabel:`'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. + In the :guilabel:`Field matching` section of the :guilabel:`Filter properties`, the + :guilabel:`Internal Reference` of the :guilabel:`Product Variant` was selected as the matching + field for both the pivot table and the chart. .. image:: global_filters/field-matching-text.png - :alt: A text filter with a restricted range - :scale: 80% + :alt: A text filter matched to the product's internal reference + + .. tip:: + If you selected :guilabel:`Restrict values to range` when configuring the text filter and + defined a range, you select the value of the text field from a dropdown. + +.. _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:: + In the example below, a :guilabel:`Yes/No` global filter was created to allow the user to see + all active opportunities, i.e., for which the :guilabel:`Active` checkbox is enabled on the + record, or all inactive opportunities, i.e., for which the :guilabel:`Active` checkbox is + disabled. Leaving the filter empty shows both active and inactive opportunities. + + .. image:: global_filters/example-boolean.png + :alt: Global filters set on a pivot table + + 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. - 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 this case, - :guilabel:`Furniture` has already been selected as the :guilabel:`Product category`, meaning - that only products of this category can be selected as possible values. + .. image:: global_filters/field-matching-checkbox.png + :alt: A yes/no filter with the Active field set as matching field - 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. +.. _spreadsheet/global-filters/manage: Manage and use global filters ============================= @@ -265,8 +285,8 @@ It is possible to: .. 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 --> Refresh all data` from - the menu bar. + global filters that have been applied, click :menuselection:`Data -->` :icon:`os-refresh-data` + :menuselection:`Refresh all data` from the menu bar. - **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. diff --git a/content/applications/productivity/spreadsheet/global_filters/dashboard-global-filters.png b/content/applications/productivity/spreadsheet/global_filters/dashboard-global-filters.png index 5d9b304782..b08d701456 100644 Binary files a/content/applications/productivity/spreadsheet/global_filters/dashboard-global-filters.png and b/content/applications/productivity/spreadsheet/global_filters/dashboard-global-filters.png differ diff --git a/content/applications/productivity/spreadsheet/global_filters/example-boolean.png b/content/applications/productivity/spreadsheet/global_filters/example-boolean.png new file mode 100644 index 0000000000..42eb864ba7 Binary files /dev/null and b/content/applications/productivity/spreadsheet/global_filters/example-boolean.png differ diff --git a/content/applications/productivity/spreadsheet/global_filters/example-date.png b/content/applications/productivity/spreadsheet/global_filters/example-date.png index 53b46ab9a2..960d165d66 100644 Binary files a/content/applications/productivity/spreadsheet/global_filters/example-date.png 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 index 854fa682fe..8183848bdd 100644 Binary files a/content/applications/productivity/spreadsheet/global_filters/example-relation.png 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 index 8077944da3..b786da98fd 100644 Binary files a/content/applications/productivity/spreadsheet/global_filters/example-text.png and b/content/applications/productivity/spreadsheet/global_filters/example-text.png differ diff --git a/content/applications/productivity/spreadsheet/global_filters/field-matching-boolean.png b/content/applications/productivity/spreadsheet/global_filters/field-matching-boolean.png new file mode 100644 index 0000000000..2ac633267c Binary files /dev/null and b/content/applications/productivity/spreadsheet/global_filters/field-matching-boolean.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 index 7b7a6ee7ca..671ef96ddc 100644 Binary files a/content/applications/productivity/spreadsheet/global_filters/field-matching-date.png 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 index 170426892e..3ff5926606 100644 Binary files a/content/applications/productivity/spreadsheet/global_filters/field-matching-relation.png 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 index f2d7e0a380..8ca9ef6edb 100644 Binary files a/content/applications/productivity/spreadsheet/global_filters/field-matching-text.png and b/content/applications/productivity/spreadsheet/global_filters/field-matching-text.png differ diff --git a/content/applications/productivity/spreadsheet/insert.rst b/content/applications/productivity/spreadsheet/insert.rst index 967516c9d7..cf099218a3 100644 --- a/content/applications/productivity/spreadsheet/insert.rst +++ b/content/applications/productivity/spreadsheet/insert.rst @@ -8,11 +8,15 @@ Several elements from your Odoo database can be inserted into an Odoo spreadshee - 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 --> Refresh all -data` from the menu bar. +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 @@ -21,10 +25,6 @@ data` from the menu bar. further manipulated in the spreadsheet. Certain elements of :ref:`inserted charts ` can be modified, but no data manipulation or computation is possible. -.. note:: - Lists, pivot tables, and charts from different apps and models can be inserted into the same - spreadsheet. - .. 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 @@ -45,10 +45,10 @@ Data sources ============ Data sources, which are created each time a :ref:`list `, :ref:`pivot table -` or :ref:`graph ` is inserted into an +`, or :ref:`chart ` is inserted into an Odoo spreadsheet, connect the spreadsheet and the relevant :doc:`model -<../../studio/models_modules_apps>` in your database, keeping the data in the spreadsheet -up-to-date. +<../../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)`, @@ -58,17 +58,19 @@ by their ID and name, e.g., :icon:`oi-view-pivot` *(#1) Sales Analysis by Produc .. 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. +Clicking on a data source opens the related properties in a panel 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 + - The properties panel 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. + between spreadsheet tabs. To close the properties panel, click the :icon:`fa-times` + :guilabel:`(close)` icon at the top right of the panel. + - Click :icon:`fa-thumb-tack` :guilabel:`(pin)` at the top of the properties panel to allow + another panel, such as the :doc:`global filters ` panel, to open beside it. .. note:: Deleting an inserted list or pivot table, or deleting the sheet into which it was inserted, does @@ -83,6 +85,26 @@ Clicking on a data source opens the related properties in a pane on the right of Deleting an inserted chart, on the other hand, also deletes the underlying data source. +.. _spreadsheet/insert/accessing-data: + +Accessing underlying 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 @@ -135,25 +157,20 @@ To insert a list: One way to avoid this is to :ref:`add extra rows ` when inserting the list. -#. Click :guilabel:`Blank spreadsheet` or select in which existing spreadsheet the list should be - inserted. +#. Click :guilabel:`Blank spreadsheet` to create a new spreadsheet, or select in which existing + spreadsheet the list should be inserted. .. note:: - New spreadsheets are saved in the **Odoo Documents** app in either the :icon:`fa-hdd-o` - :guilabel:`My Drive` personal workspace or, if :ref:`file centralization - ` has been enabled for spreadsheets, in the - :guilabel:`Spreadsheet` workspace. + 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 +name of the list followed by the list ID, e.g., *Quotations by Total (List #1)*. A panel on the right side of the screen shows the :ref:`list properties `. .. tip:: - - To view an individual record of an inserted list, right-click on any cell of the relevant row, - then click :icon:`fa-eye` :guilabel:`See record`. To return to the spreadsheet, click the name - of the spreadsheet in the breadcrumbs at the top of the page. - 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`. @@ -231,7 +248,7 @@ relevant. Manage an inserted list ----------------------- -Once a list from an Odoo database has been inserted into an Odoo spreadsheet, you can: +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 @@ -319,7 +336,7 @@ To insert it, perform the following steps: #. 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. +#. Edit the :guilabel:`List Name` in the properties panel if needed. #. Rename the sheet by right-clicking on the sheet tab, selecting :guilabel:`Rename`, and entering the new sheet name. @@ -338,7 +355,7 @@ 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 +- From the :ref:`properties panel ` 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. @@ -364,26 +381,21 @@ To insert a pivot table: .. image:: insert/insert-pivot-table.png :alt: Inserting a pivot table in a spreadsheet -#. Click :guilabel:`Blank spreadsheet` or select in which existing spreadsheet the pivot table - should be inserted. +#. Click :guilabel:`Blank spreadsheet` to create a new spreadsheet, or select in which existing + spreadsheet the pivot table should be inserted. .. note:: - New spreadsheets are saved in the **Odoo Documents** app in either the :icon:`fa-hdd-o` - :guilabel:`My Drive` personal workspace or, if :ref:`file centralization - ` has been enabled for spreadsheets, in the - :guilabel:`Spreadsheet` workspace. + 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 +Team (Pivot #1)*. A panel on the right side of the screen shows the :ref:`pivot table properties `. .. tip:: - - To view the records referenced by an individual cell of a pivot table, right-click on the cell, - then click :icon:`fa-eye` :guilabel:`See record`. To return to the spreadsheet, click the name - of the spreadsheet in the breadcrumbs at the top of the page. - 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`. @@ -476,7 +488,7 @@ To :ref:`duplicate ` or :ref:`delete Manage an inserted pivot table ------------------------------ -Once a pivot table from an Odoo database has been inserted into an Odoo spreadsheet, you can: +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 @@ -503,8 +515,8 @@ To duplicate a pivot table, perform the following steps: 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 pivot table properties open in the right panel. +#. Edit the :guilabel:`Name` in the properties panel 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 @@ -527,7 +539,7 @@ 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 +- From the :ref:`properties panel ` 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. @@ -541,21 +553,19 @@ 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` or select in which existing spreadsheet the chart should be - inserted. +#. Click :guilabel:`Blank spreadsheet` to create a new spreadsheet, or select in which existing + spreadsheet the chart should be inserted. .. note:: - New spreadsheets are saved in the **Odoo Documents** app in either the :icon:`fa-hdd-o` - :guilabel:`My Drive` personal workspace or, if :ref:`file centralization - ` has been enabled for spreadsheets, in the - :guilabel:`Spreadsheet` workspace. + 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,q + 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. @@ -668,9 +678,23 @@ The :icon:`fa-sliders` :guilabel:`Configuration` tab includes the following sect .. image:: insert/chart-type-doughnut.png :alt: Doughnut chart icon - :guilabel:`Doughnut`: A variation of the pie chart with a hollow center, offering similar + :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 @@ -703,6 +727,18 @@ The :icon:`fa-sliders` :guilabel:`Configuration` tab includes the following sect :guilabel:`Filled radar`: fills the area within the radar chart's polygon, emphasizing the overall magnitude of values across different attributes for comparison. + .. 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: Funnel chart icon + + :guilabel:`Funnel`: visualizes data that progressively decreases over stages of a + process, with the option to display cumulative data for each stage. + .. tab:: Other When creating a chart from spreadsheet data, rather than inserting one from a graph view, @@ -721,12 +757,6 @@ The :icon:`fa-sliders` :guilabel:`Configuration` tab includes the following sect 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. - - :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 ` @@ -771,6 +801,42 @@ 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 @@ -786,6 +852,9 @@ You can :ref:`insert a clickable link from any spreadsheet cell - 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 @@ -794,8 +863,9 @@ You can :ref:`insert a clickable link from any spreadsheet cell 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. -You can :ref:`insert a clickable link from any chart ` to -an Odoo menu item. +.. 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: @@ -829,7 +899,7 @@ To insert a clickable link from a chart to an Odoo menu item: 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. + panel, 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. 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-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/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/voip.rst b/content/applications/productivity/voip.rst index ccc58fbe02..e844b4ac18 100644 --- a/content/applications/productivity/voip.rst +++ b/content/applications/productivity/voip.rst @@ -123,6 +123,7 @@ VoIP workflows voip/onsip voip/axivox + voip/didww voip/voip_widget voip/devices_integrations voip/sales_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/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 index f7faa5e8b3..fb97b70813 100644 --- a/content/applications/productivity/voip/support_calls.rst +++ b/content/applications/productivity/voip/support_calls.rst @@ -68,7 +68,7 @@ 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 agnet can access ` during a call. +:doc:`the documents a support agent can access ` during a call. The support agent can also take some actions during the call: 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 79162e3ad9..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. @@ -209,6 +212,7 @@ To get an overview of all orders, regardless of the session, click the vertical :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 df52372034..ac64bf3786 100644 --- a/content/applications/sales/point_of_sale/employee_login.rst +++ b/content/applications/sales/point_of_sale/employee_login.rst @@ -68,7 +68,6 @@ settings `. Then, - :ref:`Open a POS session `. - :ref:`Perform cash-in and cash-out operations `. - - Toggle the visibility of product and category images. **Sales transactions:** 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 aa9eff8ae4..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.com 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,6 +58,7 @@ Successful`. terminals/adyen terminals/ingenico terminals/mercado_pago + terminals/pine_labs terminals/razorpay terminals/six terminals/stripe 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/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..0a827f25c7 --- /dev/null +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/pine_labs.rst @@ -0,0 +1,49 @@ +========= +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 configure the Pine Labs 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 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`. +#. Select the :guilabel:`Point of Sale`. +#. 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. + +.. 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/viva_com.rst b/content/applications/sales/point_of_sale/payment_methods/terminals/viva_com.rst index cdb29092a1..782dd3ad62 100644 --- 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 @@ -2,119 +2,79 @@ Viva.com ======== -Connecting a **Viva.com** :doc:`payment terminal <../terminals>` allows you to offer a fluid -payment flow to your customers and ease the work of your cashiers. +**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 lets you turn your phone into a mobile card reader: `Tap On Phone - `_. + - 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 + `_. -Configuration -============= +.. important:: + Odoo only supports the Euro currency with viva.com. -Start by creating your Viva.com account on `Viva.com website `_. - -Locate your Viva.com credentials --------------------------------- - -When configuring Viva.com in Point of Sale, you need to use specific credentials that are available -in your Viva.com account. These credentials include your :ref:`Merchant ID `, -:ref:`API key `, :ref:`POS API credentials `, and -:ref:`Terminal ID ` number. - -.. _pos/viva_com/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_com/access-cred.png - :alt: merchant ID and API key fields - -.. note:: - These credentials are used for APIs that authenticate with Basic Auth. - -.. _pos/viva_com/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 `. +.. 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:: - These credentials are only displayed once. Ensure you keep a copy to secure them. - -.. image:: viva_com/api-cred.png - :alt: Client secret and client ID fields + The POS API credentials are only displayed once. Make sure to keep a copy to secure them. .. note:: - These credentials are used for Android and iOS POS Activation requests, as well as the Cloud - Terminal API. - -.. _pos/viva_com/identifier: - -Terminal ID -~~~~~~~~~~~ - -Your terminal ID number is used to identify your terminal. To find it: - -#. Go to your Viva.com 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_com/terminal-id.png - :alt: Viva terminal ID - -.. _pos/viva_com/method-creation: - -Configure the payment method ----------------------------- - -#. :doc:`Activate the POS Viva.com 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:`Terminal` in the :guilabel:`Integration` field. -#. Select :guilabel:`Viva.com` in the :guilabel:`Integrate with` 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.com Webhook - Endpoint` field. This URL is necessary :ref:`when configuring the webhook `. - -.. image:: viva_com/create-method-viva-com.png - :alt: payment method creation form - -.. _pos/viva_com/webhook: - -Configure the webhook ---------------------- - -Webhooks allow you to receive real-time notifications whenever a transaction occurs within your -Viva.com account. Set them up for `payment transactions following the Viva.com documentation -`_. - -.. seealso:: - `Setting up webhooks `_ - -Link the payment method to a POS --------------------------------- - -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. + - 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_com/access-cred.png b/content/applications/sales/point_of_sale/payment_methods/terminals/viva_com/access-cred.png deleted file mode 100644 index 1d15a781a2..0000000000 Binary files a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_com/access-cred.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_com/api-cred.png b/content/applications/sales/point_of_sale/payment_methods/terminals/viva_com/api-cred.png deleted file mode 100644 index ce6c3b6d95..0000000000 Binary files a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_com/api-cred.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_com/create-method-viva-com.png b/content/applications/sales/point_of_sale/payment_methods/terminals/viva_com/create-method-viva-com.png deleted file mode 100644 index 5ef054c65a..0000000000 Binary files a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_com/create-method-viva-com.png and /dev/null differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_com/terminal-id.png b/content/applications/sales/point_of_sale/payment_methods/terminals/viva_com/terminal-id.png deleted file mode 100644 index 7c60ed03e0..0000000000 Binary files a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_com/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 7aea1b4329..0000000000 --- a/content/applications/sales/point_of_sale/restaurant/kitchen_printing.rst +++ /dev/null @@ -1,65 +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. - -.. 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/customer_display.rst b/content/applications/sales/point_of_sale/shop/customer_display.rst deleted file mode 100644 index 3eedd09f4d..0000000000 --- a/content/applications/sales/point_of_sale/shop/customer_display.rst +++ /dev/null @@ -1,73 +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 using an HDMI or USB-C cable, then, - -#. :ref:`Open a POS session `. -#. Click the :icon:`fa-bars` icon (:guilabel:`hamburger menu`). -#. Click the :icon:`fa-desktop` icon (:guilabel:`customer screen`) to open a new window to drag and - drop onto the second screen. - -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. -#. Click the :icon:`fa-bars` icon (:guilabel:`hamburger menu`). -#. Once installed, click the :icon:`fa-desktop` icon (:guilabel:`customer screen`) to open the - customer display on the terminal's secondary 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/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/sales_quotations/quote_template.rst b/content/applications/sales/sales/sales_quotations/quote_template.rst index 5aa7603893..e27fec7c6e 100644 --- a/content/applications/sales/sales/sales_quotations/quote_template.rst +++ b/content/applications/sales/sales/sales_quotations/quote_template.rst @@ -96,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 1fa1474601..109ef5929f 100644 --- a/content/applications/sales/subscriptions.rst +++ b/content/applications/sales/subscriptions.rst @@ -15,29 +15,29 @@ for recurring billing. The app integrates with other Odoo modules such as **Invo .. cards:: - .. card:: Subscription plans - :target: subscriptions/plans - :large: - - Customize subscription plan templates tailored to various product offerings - .. card:: Renew a subscription - :target: subscriptions/plans + :target: subscriptions/renewals :large: Understand the core management activity for subscriptions .. card:: Upsell a subscription - :target: subscriptions/plans + :target: subscriptions/upselling :large: Offer more value for current subscribers on the same sales order - .. card:: Integrate subscriptions with eCommerce - :target: subscriptions/plans + .. card:: Close a subscription + :target: subscriptions/closing :large: - Offer subscription products with an Odoo **eCommerce** app integration + 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 `_ @@ -91,11 +91,21 @@ configuration fields: 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`: optionally force new and recurring subscription renewal dates - under this plan to the first day of what is defined in the :guilabel:`Billing Period`. +- :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/multi_company>` functionality enabled. Assigning this value will make the recurring - plan available for that company's location, specifically. + <../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 @@ -288,10 +298,8 @@ tab, under the :guilabel:`SALES` section. :titlesonly: 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 00ff0c4a95..0000000000 --- a/content/applications/sales/subscriptions/automatic_alerts.rst +++ /dev/null @@ -1,168 +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:`../../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 1412781bee..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,4 +101,3 @@ In addition, the specified :guilabel:`Close Reason` appears on the subscription .. seealso:: - :doc:`../subscriptions` - - :doc:`plans` 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/renewals.rst b/content/applications/sales/subscriptions/renewals.rst index e35579216e..c2b436dfcf 100644 --- a/content/applications/sales/subscriptions/renewals.rst +++ b/content/applications/sales/subscriptions/renewals.rst @@ -126,4 +126,3 @@ related to this specific subscription. .. seealso:: - :doc:`../subscriptions` - - :doc:`plans` diff --git a/content/applications/sales/subscriptions/reports.rst b/content/applications/sales/subscriptions/reports.rst index a383dd6dc6..f0f391aa3f 100644 --- a/content/applications/sales/subscriptions/reports.rst +++ b/content/applications/sales/subscriptions/reports.rst @@ -401,4 +401,3 @@ Analysis` reporting page are: .. seealso:: - :doc:`../subscriptions` - - :doc:`plans` diff --git a/content/applications/sales/subscriptions/scheduled_actions.rst b/content/applications/sales/subscriptions/scheduled_actions.rst index 47fb2e333b..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,5 +193,3 @@ For example, if the next invoice date is July 1st, and the :guilabel:`Automatic .. seealso:: - :doc:`../subscriptions` - - :doc:`plans` - - :doc:`automatic_alerts` diff --git a/content/applications/sales/subscriptions/upselling.rst b/content/applications/sales/subscriptions/upselling.rst index a081cff8ec..0187ff5095 100644 --- a/content/applications/sales/subscriptions/upselling.rst +++ b/content/applications/sales/subscriptions/upselling.rst @@ -105,4 +105,3 @@ Status`. .. seealso:: - :doc:`../subscriptions` - - :doc:`plans` 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/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 2d74a8bf52..3b16e323b1 100644 --- a/content/applications/services/project/project_management.rst +++ b/content/applications/services/project/project_management.rst @@ -62,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/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/websites/ecommerce.rst b/content/applications/websites/ecommerce.rst index f1c4d8dc59..5435678839 100644 --- a/content/applications/websites/ecommerce.rst +++ b/content/applications/websites/ecommerce.rst @@ -30,3 +30,4 @@ products and increase your average cart sizes. ecommerce/order_handling ecommerce/customer_accounts ecommerce/performance + ecommerce/google_merchant_center diff --git a/content/applications/websites/ecommerce/checkout.rst b/content/applications/websites/ecommerce/checkout.rst index 995d54c77c..fbbcb7fca4 100644 --- a/content/applications/websites/ecommerce/checkout.rst +++ b/content/applications/websites/ecommerce/checkout.rst @@ -212,13 +212,12 @@ as: `; - :guilabel:`Promo Code`: to allow customers to redeem :ref:`gift cards ` or apply :doc:`discount codes <../../sales/sales/products_prices/loyalty_discount>`; -- :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. +- :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 <../../finance/fiscal_localizations>` is detected + - 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, @@ -257,7 +256,7 @@ 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 ` +Step` option in the website editor. The form can be :ref:`customized ` as needed. .. tip:: 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 dc313c6b10..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,79 +62,6 @@ 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 customization @@ -257,6 +184,27 @@ and select the relevant media. In the :guilabel:`Customize` tab, use the followi .. 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 @@ -281,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 @@ -350,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. @@ -419,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 e1222adc6a..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 +The ribbon is now available for all the eCommerce products. -Additional features -=================== +.. tip:: + - There are other ways to create a new ribbon: -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. + - 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. -- :guilabel:`Add to Cart`: adds a button to - :doc:`add the product to the cart <../checkout>`; -- :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. + - 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-buttons.png - :align: center - :alt: Feature buttons for add to cart, comparison list, and wishlist +.. _ecommerce/catalog/customize-layout: -.. image:: catalog/catalog-features.png - :align: center - :alt: Appearance of buttons when hoovering over the mouse +Shop and category page design +----------------------------- -Add content -=========== +Use :doc:`building blocks <../../website/web_design/building_blocks>` to add content on the shop +and/or category page. -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. +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. -.. image:: catalog/catalog-content.png - :align: center - :alt: Building blocks areas - -- 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..ad5b6be91e 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,122 @@ Options tab ~~~~~~~~~~~ In the :guilabel:`Options` tab, different configurations are available: -:ref:`Course `, :ref:`Communication `, -:ref:`Access rights `, and :ref:`Display `. +:ref:`Course `, :ref:`Access rights `, +:ref:`Communication ` 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-access-rights: -Communication +Access rights ************* -- :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:`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 see the course on your website. Select one of the + following: -.. _elearning/access-rights: + - :guilabel:`Everyone`: The course is publicly visible. + - :guilabel:`Signed In`: The course is only visible to users who are logged in. + - :guilabel:`Course Attendees`: The course is only visible to users who are already enrolled in + the course. + - :guilabel:`Anyone with the link`: The course can only be accessed via a direct link. -Access rights -************* +- :guilabel:`Enroll Policy`: Define how people can enroll in the course. The choice of policy also + determines which internal eLearning users can add, i.e., manually enroll, attendees via the + :guilabel:`Add attendees` button or invite attendees to enroll via the :guilabel:`Invite` button. + + .. note:: + Internal eLearning users have either `Officer` or `Manager` :doc:`access rights + `. + + Select one of the following: + + - :guilabel:`Open`: + + - Anyone who can see the course can enroll. + - Any eLearning Officer or eLearning Manager can add or invite internal or external + attendees. + + - :guilabel:`On invitation`: + + - Only people who have received an invitation can enroll in the course. + - If the course visibility is set to :guilabel:`Everyone`, :guilabel:`Signed In`, or + :guilabel:`Anyone with the link`, any non-invited person who logs in can request access to the + course via the course page. Enter an :guilabel:`Enroll Message` to explain how to enroll, + e.g., "Contact Responsible". + + .. tip:: + The request creates a to-do assigned to the course's :guilabel:`Responsible` user, allowing + them to :guilabel:`Grant Access` or :guilabel:`Refuse Access`. The to-do is visible to the + :guilabel:`Responsible` user and any eLearning Manager in the course's chatter, and the + :guilabel:`Responsible` user is notified via email. Either the :guilabel:`Responsible` user + or an eLearning Manager can grant access, in which case the requestor is automatically + enrolled in the course, or refuse access. -- :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: + - Only the :guilabel:`Responsible` user for the course or an eLearning Manager can add or invite + internal or external attendees. - - :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:`On payment`: - .. note:: - Only products set up with :guilabel:`Course` as their :guilabel:`Product Type` are - displayed. + - This option is only shown if the :guilabel:`Paid courses` feature is enabled in the + :ref:`eLearning settings `. + - Anyone who can see the course can enroll in the course upon payment. + - Any eLearning Officer can *invite* internal or external attendees to enroll in the course. + - Only the :guilabel:`Responsible` user for the course or an eLearning Manager can *add* + attendees. Payment is not required when an attendee is added in this way. + - To set a course as :guilabel:`On payment`, a :guilabel:`Product` must be selected; only + products set up with :guilabel:`Course` as their :guilabel:`Product Type` are available for + selection. -.. _elearning/display: +.. tip:: + To add or invite an attendee, the attendee must be an existing contact or created as a new + contact. A person who creates a customer account on your website is automatically a contact. + +.. _elearning/options-communication: + +Communication +************* + +- :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. This option is 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 + `, it is possible to send mass mailings to people enrolled in a course via a + :guilabel:`Contact Attendees` button at the top left of the course form. The button is only + visible to eLearning Officers who also have `User` :doc:`access rights + ` for Email Marketing and to eLearning Managers. + +.. _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 +195,192 @@ 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. -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. +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. + +.. _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: + +- :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. + + .. note:: + Enabling :guilabel:`Paid Courses` automatically installs the :guilabel:`eCommerce` module, + which may impact your `pricing plan `_. -- **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. + .. seealso:: + :doc:`eCommerce documentation ` -.. _elearning/create-content: +- :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/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: -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. +Publish courses and content +=========================== -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. +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. + +A course and its content items are published separately: + +- 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/elearning/options-tab.png b/content/applications/websites/elearning/options-tab.png index 10e2de774c..6af51b578a 100644 Binary files a/content/applications/websites/elearning/options-tab.png and b/content/applications/websites/elearning/options-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/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 94f2eb4e31..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: @@ -448,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/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 15ab5034dc..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/header_footer>`, :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 3a61a5d15c..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/header_footer - pages/seo 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 cc31148827..4ad4db87b7 100644 --- a/content/applications/websites/website/reporting/analytics.rst +++ b/content/applications/websites/website/reporting/analytics.rst @@ -18,17 +18,18 @@ Plausible.io ============ Odoo hosts its own Plausible.io server and provides a free and ready-to-use Plausible.io -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`. +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 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 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: + Technical --> System Parameters`. Click :guilabel:`New` and fill in the following + :guilabel:`Key` and :guilabel:`Value` fields: .. list-table:: :header-rows: 1 @@ -42,25 +43,33 @@ your account. Start using it by going to :menuselection:`Website --> Reporting - 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. @@ -75,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`. @@ -93,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. @@ -119,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 @@ -136,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/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/pages/header_footer.rst b/content/applications/websites/website/structure/header_footer.rst similarity index 98% rename from content/applications/websites/website/pages/header_footer.rst rename to content/applications/websites/website/structure/header_footer.rst index 2a132521f1..58c6db1fc7 100644 --- a/content/applications/websites/website/pages/header_footer.rst +++ b/content/applications/websites/website/structure/header_footer.rst @@ -79,7 +79,7 @@ Adding menu items ----------------- By default, pages are added to the menu as drop-down menu items when -:doc:`they are created <../pages>`. To add a new menu item, follow these steps: +: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`. diff --git a/content/applications/websites/website/pages/header_footer/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/header_footer/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/header_footer/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/header_footer/mega-menu-option.png rename to content/applications/websites/website/structure/header_footer/mega-menu-option.png diff --git a/content/applications/websites/website/pages/header_footer/mega-menu.png b/content/applications/websites/website/structure/header_footer/mega-menu.png similarity index 100% rename from content/applications/websites/website/pages/header_footer/mega-menu.png rename to content/applications/websites/website/structure/header_footer/mega-menu.png diff --git a/content/applications/websites/website/pages/header_footer/menu-editor.png b/content/applications/websites/website/structure/header_footer/menu-editor.png similarity index 100% rename from content/applications/websites/website/pages/header_footer/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 9fce7dbc11..98c099e2f3 100644 --- a/content/applications/websites/website/web_design.rst +++ b/content/applications/websites/website/web_design.rst @@ -1,9 +1,46 @@ :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: 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/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 b491f1b3ff..d6736e8233 100644 --- a/content/contributing/development/coding_guidelines.rst +++ b/content/contributing/development/coding_guidelines.rst @@ -877,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 @@ -886,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 @@ -1017,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/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/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/pages.rst b/content/developer/howtos/website_themes/pages.rst index d6363a2b40..5e843a4959 100644 --- a/content/developer/howtos/website_themes/pages.rst +++ b/content/developer/howtos/website_themes/pages.rst @@ -109,7 +109,7 @@ Alternatively, replace the default content of these pages using XPath. .. seealso:: - - :doc:`Odoo Documentation on SEO <../../../applications/websites/website/pages/seo>` + - :doc:`Odoo Documentation on SEO ` .. _website_themes/pages/theme_pages : @@ -124,24 +124,25 @@ page object. .. code-block:: xml :caption: ``/website_airproof/data/pages/about_us.xml`` + - - About us - - website_airproof.page_about_us - /about-us - - qweb - - - -
- -
-
-
-
-
+ + About us + + website_airproof.page_about_us + /about-us + + qweb + + + +
+ +
+
+
+
+
.. admonition:: Multiwebsite and `website_id` @@ -272,11 +273,11 @@ Create preset static page templates available from the New Page dialog window. **Declaration** The page templates has to be defined into the :file:`__manifest__.py` of the module through -`new_page_templates`: +`new_page_templates` and :file:`new_page_template_templates.xml`: .. code-block:: python :caption: `/website_airproof/__manifest__.py` - :emphasize-lines: 15-18 + :emphasize-lines: 11,16-19 { 'name': 'Airproof Theme', @@ -288,6 +289,7 @@ The page templates has to be defined into the :file:`__manifest__.py` of the mod 'depends': ['website'], 'data': [ # ... + 'views/new_page_template_templates.xml' ], 'assets': { # ... @@ -324,23 +326,27 @@ Instantiate each building block (modified or not) for the page template: .. code-block:: xml :caption: `/website_airproof/views/new_page_template_templates.xml` -